<?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=HannoHupmann</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=HannoHupmann"/>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Spezial:Beitr%C3%A4ge/HannoHupmann"/>
		<updated>2026-04-11T17:37:33Z</updated>
		<subtitle>Benutzerbeiträge</subtitle>
		<generator>MediaWiki 1.25.1</generator>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Ultraschallsensor_SRF02_am_RN-Board&amp;diff=26279</id>
		<title>Ultraschallsensor SRF02 am RN-Board</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Ultraschallsensor_SRF02_am_RN-Board&amp;diff=26279"/>
				<updated>2015-03-30T16:55:56Z</updated>
		
		<summary type="html">&lt;p&gt;HannoHupmann: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Noch recht wenig bekannt ist der neue kompakte Ultraschallsensor SRF02. Dieser Sensor stellt eine preiswerte Alternative zu den Sensoren SRF05 oder SRF10 dar, kann jedoch keine kleineren Entfernungen als 15 cm messen. Allerdings reicht der Messbereich von 15cm bis ca. 6m durchaus für viele Anwendungen aus.&lt;br /&gt;
&lt;br /&gt;
Der Sensor lässt sich wahlweise per RS232 oder I2C anschließen. Jeweils bis zu 16 Stück können an einer Schnittstelle betrieben werden, auch an der RS232 TTL was durchaus ungewöhnlich ist. Die Beispiele sollen demonstrieren wie einfach der Sensor an ein RN-Board angeschlossen werden kann. Konkret verwenden wir hier das [[RN-Control]] Board, allerdings ist es sehr ähnlich auch bei allen anderen RN- und AVR-Boards. Die Programme sind in Bascom-Basic programmiert und können somit fast ohne Änderung auf alle anderen RN-Boards übertragen werden (lediglich Ports und Quarztakt anpassen).&lt;br /&gt;
&lt;br /&gt;
==SRF02 Daten==&lt;br /&gt;
Der erste Sensor aus der SRF-Reihe der mit nur einem Ultraschallwandler auskommt. Dennoch können sich die Leistungen zeigen. Vorallem die Tatsache das sowohl RS232 und I2C-Bus Schnittstelle vorhanden ist dürfte viele Bastler erfreuen.&lt;br /&gt;
&lt;br /&gt;
* Betriebsspannung 5V (stabilisiert) &lt;br /&gt;
* Stromaufnahme nur 4mA (typisch) &lt;br /&gt;
* Ultraschallfrequenz 40khz &lt;br /&gt;
* Reichweite 15cm bis 6 Meter &lt;br /&gt;
* Schnittstelle RS232 (TTL) und I2C-Bus &lt;br /&gt;
* Ausgabeeinheit wahlweise mm, inch oder uS &lt;br /&gt;
* Einfachste Verwendung, keine Kalibration/Justierung notwendig&lt;br /&gt;
* Größe 24mm x 20mm x 17mm &lt;br /&gt;
&lt;br /&gt;
[[Bild:srf02_germany.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==SRF02 im I2C-Mode==&lt;br /&gt;
In dem Beispiel wurde ein Adapter verwendet, es ginge natürlich auch ohne indem man ein passendes Kabel für den I2C Stecker bastelt oder aber die Steckleisten auf dem Board RN-Control nutzt.&lt;br /&gt;
&lt;br /&gt;
Der Mode-Pin bleibt unbeschaltet.&lt;br /&gt;
&lt;br /&gt;
[[Bild:srf02_i2c_rncontrol.jpg|framed|center|Der neue Ultraschallsensor SRF02 im I2C Mode über Adapter an RN-Control]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
'###################################################&lt;br /&gt;
'SRF02_rncontrol_i2c_beispiel2.bas&lt;br /&gt;
'für&lt;br /&gt;
'RoboterNetz Board RN-CONTROL (ab Version 1.1)&lt;br /&gt;
'und das SRF02 Ultraschallmodul für Entfernungsmessung&lt;br /&gt;
'Datenblatt zu SRF02:&lt;br /&gt;
'http://www.roboternetz.de/phpBB2/dload.php?action=file&amp;amp;file_id=357&lt;br /&gt;
'Anschlussbeschreibung:&lt;br /&gt;
'http://www.roboternetz.de/wissen/index.php/Sensorarten&lt;br /&gt;
&lt;br /&gt;
'Aufgabe:&lt;br /&gt;
' Gibt die Firmware-Version vom SRF02 aus und&lt;br /&gt;
' anschließend in einer Endlosschleife die&lt;br /&gt;
' Entfernung von Objekten in Zentimetern&lt;br /&gt;
' Die Entfernung wird 1 mal pro Sekunde über RS232&lt;br /&gt;
' ausgegeben&lt;br /&gt;
' Hier wird noch genau gescheckt ob ein Sensor die&lt;br /&gt;
' Messung schon beendet hat. Dadurch sind noch&lt;br /&gt;
' schnellere Messungen als nur 15 pro Sekunde möglich&lt;br /&gt;
&lt;br /&gt;
'Autor: Frank  (Roboternetz)&lt;br /&gt;
'Weitere Beispiele und Beschreibung der Hardware&lt;br /&gt;
'unter http://www.Roboternetz.de oder robotikhardware.de&lt;br /&gt;
'#######################################################&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Declare Function Srf02_firmware(byval Slaveid As Byte) As Byte&lt;br /&gt;
Declare Function Srf02_entfernung(byval Slaveid As Byte) As Integer&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
$regfile = &amp;quot;m32def.dat&amp;quot;&lt;br /&gt;
$framesize = 42&lt;br /&gt;
$swstack = 42&lt;br /&gt;
$hwstack = 42&lt;br /&gt;
&lt;br /&gt;
$crystal = 16000000                                         'Quarzfrequenz&lt;br /&gt;
$baud = 9600&lt;br /&gt;
&lt;br /&gt;
Config Scl = Portc.0                                        'Ports fuer IIC-Bus&lt;br /&gt;
Config Sda = Portc.1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Const Srf02_slaveid = &amp;amp;HE0                                  'Standard I2C Adresse von SRF02&lt;br /&gt;
&lt;br /&gt;
Dim Entfernung As Integer&lt;br /&gt;
Dim V As Byte&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   Wait 3                                                   'Warte 3 Sekunden&lt;br /&gt;
   I2cinit&lt;br /&gt;
   Print &amp;quot;SRF02 Testprogramm von robotikhardware.de&amp;quot;&lt;br /&gt;
   Print &amp;quot;SRF02 Ultraschall-Firmware Version:&amp;quot; ; Srf02_firmware(srf02_slaveid)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   V = 1&lt;br /&gt;
   Do&lt;br /&gt;
     Entfernung = Srf02_entfernung(srf02_slaveid)&lt;br /&gt;
     Print &amp;quot;Entfernung:&amp;quot; ; Entfernung ; &amp;quot;cm&amp;quot;&lt;br /&gt;
     Wait 1&lt;br /&gt;
   Loop&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
End&lt;br /&gt;
'------------- Hilfsfunktionen für SRF02 ----------&lt;br /&gt;
Function Srf02_firmware(byval Slaveid As Byte) As Byte&lt;br /&gt;
  Local Firmware As Byte&lt;br /&gt;
  Local Slaveid_read As Byte&lt;br /&gt;
  slaveid_read = Slaveid + 1&lt;br /&gt;
  I2cstart&lt;br /&gt;
  I2cwbyte Slaveid&lt;br /&gt;
  I2cwbyte 0 'Leseregister festlegen&lt;br /&gt;
  I2cstop&lt;br /&gt;
  I2cstart&lt;br /&gt;
  I2cwbyte Slaveid_read&lt;br /&gt;
  I2crbyte Firmware , Nack&lt;br /&gt;
  I2cstop&lt;br /&gt;
  Srf02_firmware = Firmware&lt;br /&gt;
End Function&lt;br /&gt;
&lt;br /&gt;
Function Srf02_entfernung(byval Slaveid As Byte) As Integer&lt;br /&gt;
  Local Lob As Byte&lt;br /&gt;
  Local Hib As Byte&lt;br /&gt;
  Local Firmware As Byte&lt;br /&gt;
  Local Temp As Byte&lt;br /&gt;
  Local Slaveid_read As Byte&lt;br /&gt;
&lt;br /&gt;
  slaveid_read = Slaveid + 1&lt;br /&gt;
&lt;br /&gt;
  'Messvorgang in starten&lt;br /&gt;
  I2cstart&lt;br /&gt;
  I2cwbyte Slaveid&lt;br /&gt;
  I2cwbyte 0&lt;br /&gt;
  I2cwbyte 81 'in Zentimetern messen&lt;br /&gt;
  I2cstop&lt;br /&gt;
&lt;br /&gt;
  Warteaufmessung:&lt;br /&gt;
    Waitms 1&lt;br /&gt;
    Firmware = Srf02_firmware(slaveid)&lt;br /&gt;
  If Firmware = 255 Then Goto Warteaufmessung&lt;br /&gt;
&lt;br /&gt;
  I2cstart&lt;br /&gt;
  I2cwbyte Slaveid&lt;br /&gt;
  I2cwbyte 2 'Leseregister festlegen&lt;br /&gt;
  I2cstop&lt;br /&gt;
  I2cstart&lt;br /&gt;
  I2cwbyte Slaveid_read&lt;br /&gt;
  I2crbyte Hib , Ack&lt;br /&gt;
  I2crbyte Lob , Nack&lt;br /&gt;
  I2cstop&lt;br /&gt;
  Srf02_entfernung = Makeint(lob , Hib)&lt;br /&gt;
 End Function&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==SRF02 im RS232-Mode==&lt;br /&gt;
Das nachfolgende Beispiel demonstriert wie einfach sich ein oder mehrere SRF02 Ultraschallsensoren an RN-Control anschließen lassen. Da wir die normale RS232 an RN-Control weiterhin benötigen um Daten und Ergebnisse von RN-Control zum PC zu senden, definieren wir per Software einfach eine neue Software RS232 Schnittstelle auf die Ports PA0 und PA1. Dadurch können die SRF02´s sehr einfach an die orange Stecklemme von RN-Control angeschlossen werden. Wir können uns so den Stecker-Adapter sparen. Es wäre natürlich auch jeder andere freie Port verwendbar.&lt;br /&gt;
&lt;br /&gt;
Der Mode-Pin wird mit GND verbunden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:srf02_an_rncontrol_rs232mode.jpg|framed|center|Der neue Ultraschallsensor SRF02 im RS232 Mode an RN-Control]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
'###################################################&lt;br /&gt;
'SRF02_rncontrol_rs232_beispiel.bas&lt;br /&gt;
'für&lt;br /&gt;
'RoboterNetz Board RN-CONTROL (ab Version 1.1)&lt;br /&gt;
'und das SRF02 Ultraschallmodul für Entfernungsmessung&lt;br /&gt;
'Datenblatt zu SRF02:&lt;br /&gt;
'http://www.roboternetz.de/phpBB2/dload.php?action=file&amp;amp;file_id=357&lt;br /&gt;
'Anschlussbeschreibung:&lt;br /&gt;
'http://www.roboternetz.de/wissen/index.php/Sensorarten&lt;br /&gt;
&lt;br /&gt;
'Aufgabe:&lt;br /&gt;
' Gibt die Firmware-Version vom SRF02 aus und&lt;br /&gt;
' anschließend in einer Endlosschleife die&lt;br /&gt;
' Entfernung von Objekten in Zentimetern&lt;br /&gt;
' Die Entfernung wird 1 mal pro Sekunde über RS232&lt;br /&gt;
' ausgegeben&lt;br /&gt;
' Dieses Beispiel nutzt den RS232 Mode vom SRF02&lt;br /&gt;
' Um die Ergebnisse auch gleichzeitig an PC&lt;br /&gt;
' übermitteln zu können, wird in dem Beispiel eine&lt;br /&gt;
' zweite RS232 Schnittstelle per Software eingerichtet.&lt;br /&gt;
' Dadurch kann der Sensor (oder auch mehrere) bequem&lt;br /&gt;
' an der Steckklemme angeschlossen werden&lt;br /&gt;
&lt;br /&gt;
'Autor: Frank  (Roboternetz)&lt;br /&gt;
'Weitere Beispiele und Beschreibung der Hardware&lt;br /&gt;
'unter http://www.Roboternetz.de oder robotikhardware.de&lt;br /&gt;
'#######################################################&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Declare Function Srf02_firmware(byval Slaveid As Byte) As Byte&lt;br /&gt;
Declare Function Srf02_entfernung(byval Slaveid As Byte) As Integer&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
$regfile = &amp;quot;m32def.dat&amp;quot;&lt;br /&gt;
$framesize = 42&lt;br /&gt;
$swstack = 42&lt;br /&gt;
$hwstack = 42&lt;br /&gt;
&lt;br /&gt;
$crystal = 16000000                                         'Quarzfrequenz&lt;br /&gt;
$baud = 9600                                                'Normale Hardware RS232 (hier hängt PC dran)&lt;br /&gt;
&lt;br /&gt;
Open &amp;quot;COMA.0:9600,8,N,2&amp;quot; For Output As #1                   'Port PA0 wird als TX definiert&lt;br /&gt;
Open &amp;quot;COMA.1:9600,8,N,2&amp;quot; For Input As #2                    'Port PA1 wird als RX definiert&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Const Srf02_slaveid = 0                                     'Standard RS232 Slave ID von SRF02&lt;br /&gt;
Dim Entfernung As Integer&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   Wait 3                                                   'Warte 3 Sekunden&lt;br /&gt;
   Print &amp;quot;SRF02 RS232 Testprogramm von robotikhardware.de&amp;quot;&lt;br /&gt;
   Print &amp;quot;SRF02 Ultraschall-Firmware Version:&amp;quot; ; Srf02_firmware(srf02_slaveid)&lt;br /&gt;
   Print &amp;quot;PA0 wird TX und PA1 wird als RX genutzt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   V = 1&lt;br /&gt;
   Do&lt;br /&gt;
     Entfernung = Srf02_entfernung(srf02_slaveid)&lt;br /&gt;
     Print &amp;quot;Entfernung:&amp;quot; ; Entfernung ; &amp;quot;cm&amp;quot;&lt;br /&gt;
     Wait 1&lt;br /&gt;
   Loop&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'------------- Hilfsfunktionen für SRF02 ----------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Function Srf02_firmware(byval Slaveid As Byte) As Byte&lt;br /&gt;
&lt;br /&gt;
   Print #1 , Chr(slaveid) ; Chr(93);&lt;br /&gt;
   Srf02_firmware = Waitkey(#2)&lt;br /&gt;
End Function&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Function Srf02_entfernung(byval Slaveid As Byte) As Integer&lt;br /&gt;
Local Lob As Byte&lt;br /&gt;
Local Hib As Byte&lt;br /&gt;
&lt;br /&gt;
   Print #1 , Chr(slaveid) ; Chr(84);                       'Messvorgang in cm starten&lt;br /&gt;
   Inputbin #2 , Hib , Lob                                  'Warte auf Ergebnis&lt;br /&gt;
   Srf02_entfernung = Makeint(lob , Hib)&lt;br /&gt;
End Function&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==SRF02 Änderung der I2C Slave ID==&lt;br /&gt;
&lt;br /&gt;
Die Slave ID muss nur geändert werden, wenn mehrere SRF02 an einem I2C Bus betrieben werden&lt;br /&gt;
sollen oder ein anderer Busteilnehmer zufällig die gleiche Slave ID besitzt.&lt;br /&gt;
Es ist zu beachten, dass nur ein SRF02 angeschlossen sein darf, wenn die ID geändert wird. &lt;br /&gt;
&lt;br /&gt;
Die Slave ID wird geändert indem man eine 3 Byte-Sequenz (Hex A0 AA A5) und die neue Slave ID selbst an&lt;br /&gt;
das Modul sendet. Die einzelnen Bytes dieser Sequenz müssen an das Register 00 gesendet werden. &lt;br /&gt;
Es werden 4 getrennte I2C Schreibbefehle nutzen, wobei der Abstand zwischen jeder Registerbeschreibung 50ms&lt;br /&gt;
sein sollte.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Ändern der Standard ID &amp;quot;E0&amp;quot; auf &amp;quot;F2&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
S E0 00 A0 P &lt;br /&gt;
S E0 00 AA P &lt;br /&gt;
S E0 00 A5 P &lt;br /&gt;
S E0 00 F2 P &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die aktuelle Slave-ID ist in der Blinkfrequenz des SRF02 beim Power on codiert. &lt;br /&gt;
Die Tabelle findet man im Datenblatt. &lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[RN-Control]]&lt;br /&gt;
* [[Sensorarten]]&lt;br /&gt;
* [[Ultraschall SRF10 an RN-Control]]&lt;br /&gt;
&lt;br /&gt;
==Weblinks==&lt;br /&gt;
* [http://www.roboternetz.de/phpBB2/dload.php?action=file&amp;amp;file_id=357 Deutsche Anleitung zum SRF02]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Quellcode Bascom]]&lt;br /&gt;
[[Kategorie:Robotikeinstieg]]&lt;br /&gt;
[[Kategorie:Praxis]]&lt;br /&gt;
[[Kategorie:Sensoren]]&lt;/div&gt;</summary>
		<author><name>HannoHupmann</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=I2C_USB_PC_Adapter&amp;diff=23620</id>
		<title>I2C USB PC Adapter</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=I2C_USB_PC_Adapter&amp;diff=23620"/>
				<updated>2014-03-05T22:26:56Z</updated>
		
		<summary type="html">&lt;p&gt;HannoHupmann: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bezugsquelle ==&lt;br /&gt;
&lt;br /&gt;
Von ELV gibt es ein kostengünstiges USB - [[I2C]] Interface &lt;br /&gt;
&lt;br /&gt;
[http://www.elv.de/usb-i2c-interface-komplettbausatz-inkl-gehaeuse-bearbeitet-und-bedruckt-usb-kabel-3-anschlusskabel.html Produktbeschreibung]&lt;br /&gt;
&lt;br /&gt;
{|{{Blaueschmaltabelle}}&lt;br /&gt;
|Mit dem USB-[[I2C]]-Interface kann von einem PC aus via USB mit einfachsten Befehlen direkt auf die am I2C-Bus angeschlossenen Geräte oder Bausteine zugegriffen werden.&lt;br /&gt;
&lt;br /&gt;
Durch die integrierte Makrofunktion können Anweisungsfolgen gespeichert werden, die anschließend selbstständig ablaufen. Dadurch kann das Interface z. B. mit nur einem zusätzlichen IC als Datenlogger für analoge/digitale Signale (PCF8591/8574), Temperaturen (LM75) usw. verwendet werden. Durch eine Reihe flexibler Befehle können bis zu 128 Geräte angesprochen/gesteuert werden.&lt;br /&gt;
&lt;br /&gt;
Dies kann im einfachsten Fall über ein normales Terminalprogramm, aber auch aus einer eigenen Anwendung heraus erfolgen. Alle Algorithmen und Befehle sind in der Dokumentation ausführlich inkl. Anwendungsbeispielen beschrieben.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es gibt zwei Versionen: &lt;br /&gt;
*1) fertig aufgebaut 34,95€&lt;br /&gt;
*2) zum selber löten 24,95€&lt;br /&gt;
&lt;br /&gt;
Im Preis unterscheiden sich die beiden Version um 10€ und es stellt sich die Frage ob es sich lohnt. Getestet wurde die Variante zum selbst aufbauen. Nach dem Auspacken stellt sich heraus: &lt;br /&gt;
es müssen lediglich 3 Stecker, 1 LED und 1 Kondensator eingelötet werden. &lt;br /&gt;
Arbeitsaufwand weniger als 10 Minuten und nur wer wirklich keinen Lötkolben hat oder irgendwie darauf zugreifen kann, sollte die 10€ mehr investieren. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Was wird geliefert? ==&lt;br /&gt;
[[Bild:Übersicht_USB-i2c_intervace_.JPG|thumb|Übersicht der mitgelieferten Teile]]&lt;br /&gt;
*1 Platine &lt;br /&gt;
*1 Gehäuse + Schrauben&lt;br /&gt;
*3 Stecker &lt;br /&gt;
*1 LED &lt;br /&gt;
*1 Kondensator &lt;br /&gt;
*3 Anschlusskabel mit einseitig Stecker &lt;br /&gt;
*1 USB - USB-B Kabel  &lt;br /&gt;
&lt;br /&gt;
Positiv: Das USB Kabel ist sehr lang, was heute nicht mehr selbstverständlich ist. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Inbetriebnahme ==&lt;br /&gt;
Es empfiehlt sich das Update zu installieren, im Moment v1.8. Gibt man ? in Hyperterminal ein bekommt man folgende Rückmeldung: &lt;br /&gt;
&lt;br /&gt;
*ELV USB-I2C-Interface v1.8 (Cal:52)&lt;br /&gt;
*Last Adress:0x00&lt;br /&gt;
*Baudrate:115200 bit/s&lt;br /&gt;
*I2C-Clock:99632 Hz&lt;br /&gt;
*Y00&lt;br /&gt;
*Y10&lt;br /&gt;
*Y20&lt;br /&gt;
*Y31&lt;br /&gt;
*Y40&lt;br /&gt;
*Y50&lt;br /&gt;
*Y60&lt;br /&gt;
*Y70&lt;br /&gt;
&lt;br /&gt;
Wie man sehen kann wurde der Wert im Register Y3 von 0 auf 1 verändert. Damit bekommt man Ack oder Nack vom Controller am PC angezeigt, was für debuging sehr hilfreich ist. &lt;br /&gt;
&lt;br /&gt;
Nach dem löten, muss von der ELV Seite ein passender Windows / Mac / Linux Treiber geladen werden. Alle Betriebsysteme werden unterstüzt. Ebenfalls positiv! &lt;br /&gt;
Wird das Device über USB angeschlossen, findet Windows (nur damit wurde es getestet) die neue Hardware automatisch und verknüpft sie mit den Treibern. &lt;br /&gt;
In den Hardware Einstellungen wird der COMx Port auf folgende Werte eingestellt: &lt;br /&gt;
&lt;br /&gt;
::- 115.200 bit/s &lt;br /&gt;
::- 8 Datenbits&lt;br /&gt;
::- 1 Stoppbit&lt;br /&gt;
::- kein Parität&lt;br /&gt;
::- keine Flusssteuerung &lt;br /&gt;
&lt;br /&gt;
Mit dem praktischen, kostenlosen Programm HTerm kann die Kommunikation zwischen PC und USB-[[I2C]] Device hergestellt werden. Auch hier werden die oben genannten Werte eingetragen. &lt;br /&gt;
&lt;br /&gt;
[[Bild:HTerm-USB-i2c_intervace_.jpg|thumb|Einstellungen für HTerm und Befehle]]&lt;br /&gt;
&lt;br /&gt;
== Schreiben an einen i2c Baustein z.B. ein Display ==&lt;br /&gt;
&lt;br /&gt;
Die Befehle können über die Eingabeleiste an das Device geschickt werden. Im Test war ein i2c fähiges Display angeschlossen. Bitte beachten, das Interface arbeitet mit einem 5V Pegel. Für Bausteine die nur einen 3,3V Pegel vertragen, muss die Spannung der Signalleitungen entsprechend angepasst werden. &lt;br /&gt;
 &lt;br /&gt;
Erklärung für den ersten Befehle (steht auch in der Anleitung), wobei zu unterscheiden ist ob es sich um einen Device spezifischen Befehl handelt, oder um einen Steuerbefehl für das Display:  &lt;br /&gt;
&lt;br /&gt;
S28 05 W 01 0D P &lt;br /&gt;
&lt;br /&gt;
Erklärung: &lt;br /&gt;
*'''S''' - Start  &lt;br /&gt;
*28 - Adresse des Displays als Hexzahl &lt;br /&gt;
*'''05''' - Steuerbefehl &lt;br /&gt;
*'''W''' - Schreiben (lesen wäre R) &lt;br /&gt;
*01 - Steuerbefehl Display&lt;br /&gt;
*0D - Courser blinken &lt;br /&gt;
*'''p''' - Stopp &lt;br /&gt;
&lt;br /&gt;
Noch ein weiteres Beispiel um die Struktur der Befehlseingabe zu verdeutlichen: &lt;br /&gt;
&lt;br /&gt;
S28 05 W 48 65 6C 6C 6F P &lt;br /&gt;
&lt;br /&gt;
Erklärung: &lt;br /&gt;
&lt;br /&gt;
*'''S''' - Start  &lt;br /&gt;
*28 - Adresse des Displays als Hexzahl &lt;br /&gt;
*'''05''' - Steuerbefehl &lt;br /&gt;
*'''W''' - Schreiben (lesen wäre R) &lt;br /&gt;
*00 - Display schreiben &lt;br /&gt;
*48 - &amp;quot;H&amp;quot;&lt;br /&gt;
*65 - &amp;quot;a&amp;quot;&lt;br /&gt;
*6C - &amp;quot;l&amp;quot;&lt;br /&gt;
*6C - &amp;quot;l&amp;quot;&lt;br /&gt;
*6F - &amp;quot;o&amp;quot;&lt;br /&gt;
*'''p''' - Stopp &lt;br /&gt;
&lt;br /&gt;
(Die spezifischen Befehle für das Bauteil sind im entsprechenden Datenblatt zu finden, hier eben die Befehle für das Display) &lt;br /&gt;
Wer sich ein entsprechendes Textfile schreibt, kann ganze Befehlsketten an ein beliebiges Device übertragen. &lt;br /&gt;
&lt;br /&gt;
So sieht das Ergebnis der 3 Befehle auf dem Display aus: &lt;br /&gt;
&lt;br /&gt;
[[Bild:Ergebnis_USB-i2c_intervace_.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Lesen am Beispiel von einem SRF02 US-Sensor ==&lt;br /&gt;
In die andere Richtung geht es natürlich auch. Sensoren werden in der Regel ausgelesen, hier ein einen SRF02 (Standard US-Sensor mit i2c Interface). Das ganze erfolgt in zwei Schritten. &lt;br /&gt;
&lt;br /&gt;
1) Messen   &lt;br /&gt;
*'''S''' - Start  &lt;br /&gt;
*E0 - Adresse des SRF als Hexzahl &lt;br /&gt;
*00 - Register &lt;br /&gt;
*51 - Befehl für messen in cm&lt;br /&gt;
*'''p''' - Stopp &lt;br /&gt;
&lt;br /&gt;
2) Auslesen&lt;br /&gt;
*'''S''' - Start  &lt;br /&gt;
*E1 - Adresse des SRF als Hexzahl +1 für lesen &lt;br /&gt;
*03 - Anzahl der Register die gelesen werden sollen &lt;br /&gt;
*'''p''' - Stopp &lt;br /&gt;
&lt;br /&gt;
Die Ausgabe sieht dann wie folgt aus: &lt;br /&gt;
*KKK 05 01 58 &lt;br /&gt;
*KKK - Bestätigung für Messen &lt;br /&gt;
*05 Register 1&lt;br /&gt;
*01 Register 2&lt;br /&gt;
*58 Register 3&lt;br /&gt;
&lt;br /&gt;
Das Hindernis ist  also 158xh cm oder, für alle die lieber in Dezimal lesen, 344cm vom Sensor entfernt.   &lt;br /&gt;
Beachten: Der Sensor ist ein wenig träge also nicht wundern, wenn bei schnellen Messungen mehrmals der gleiche Wert auftaucht. &lt;br /&gt;
&lt;br /&gt;
== FAZIT ==&lt;br /&gt;
 &lt;br /&gt;
Praktisches, kleines Device um schnell ein paar [[I2C]] Bausteine direkt über den PC anzusteuern. Gerade für alle die normalerweise dem µC diese Aufgabe überlassen, mit seinen i2c slaves zu sprechen, kann mit dem Device getestet werden ob der Baustein überhaupt funktioniert.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Elektronik]]&lt;/div&gt;</summary>
		<author><name>HannoHupmann</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=I2C_USB_PC_Adapter&amp;diff=21396</id>
		<title>I2C USB PC Adapter</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=I2C_USB_PC_Adapter&amp;diff=21396"/>
				<updated>2012-10-22T08:13:18Z</updated>
		
		<summary type="html">&lt;p&gt;HannoHupmann: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bezugsquelle ==&lt;br /&gt;
&lt;br /&gt;
Von ELV gibt es ein kostengünstiges USB - [[I2C]] Interface &lt;br /&gt;
&lt;br /&gt;
[http://www.elv.de/usb-i2c-interface-komplettbausatz-inkl-gehaeuse-bearbeitet-und-bedruckt-usb-kabel-3-anschlusskabel.html Produktbeschreibung]&lt;br /&gt;
&lt;br /&gt;
{|{{Blaueschmaltabelle}}&lt;br /&gt;
|Mit dem USB-[[I2C]]-Interface kann von einem PC aus via USB mit einfachsten Befehlen direkt auf die am I2C-Bus angeschlossenen Geräte oder Bausteine zugegriffen werden.&lt;br /&gt;
&lt;br /&gt;
Durch die integrierte Makrofunktion können Anweisungsfolgen gespeichert werden, die anschließend selbstständig ablaufen. Dadurch kann das Interface z. B. mit nur einem zusätzlichen IC als Datenlogger für analoge/digitale Signale (PCF8591/8574), Temperaturen (LM75) usw. verwendet werden. Durch eine Reihe flexibler Befehle können bis zu 128 Geräte angesprochen/gesteuert werden.&lt;br /&gt;
&lt;br /&gt;
Dies kann im einfachsten Fall über ein normales Terminalprogramm, aber auch aus einer eigenen Anwendung heraus erfolgen. Alle Algorithmen und Befehle sind in der Dokumentation ausführlich inkl. Anwendungsbeispielen beschrieben.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es gibt zwei Versionen: &lt;br /&gt;
*1) fertig aufgebaut 34,95€&lt;br /&gt;
*2) zum selber löten 24,95€&lt;br /&gt;
&lt;br /&gt;
Im Preis unterscheiden sich die beiden Version um 10€ und es stellt sich die Frage ob es sich lohnt. Getestet wurde die Variante zum selbst aufbauen. Nach dem Auspacken stellt sich heraus: &lt;br /&gt;
es müssen lediglich 3 Stecker, 1 LED und 1 Kondensator eingelötet werden. &lt;br /&gt;
Arbeitsaufwand weniger als 10 Minuten und nur wer wirklich keinen Lötkolben hat oder irgendwie darauf zugreifen kann, sollte die 10€ mehr investieren. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Was wird geliefert? ==&lt;br /&gt;
[[Bild:Übersicht_USB-i2c_intervace_.JPG|thumb|Übersicht der mitgelieferten Teile]]&lt;br /&gt;
*1 Platine &lt;br /&gt;
*1 Gehäuse + Schrauben&lt;br /&gt;
*3 Stecker &lt;br /&gt;
*1 LED &lt;br /&gt;
*1 Kondensator &lt;br /&gt;
*3 Anschlusskabel mit einseitig Stecker &lt;br /&gt;
*1 USB - USB-B Kabel  &lt;br /&gt;
&lt;br /&gt;
Positiv: Das USB Kabel ist sehr lang, was heute nicht mehr selbstverständlich ist. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Inbetriebnahme ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nach dem löten, muss von der ELV Seite ein passender Windows / Mac / Linux Treiber geladen werden. Alle Betriebsysteme werden unterstüzt. Ebenfalls positiv! &lt;br /&gt;
Wird das Device über USB angeschlossen, findet Windows (nur damit wurde es getestet) die neue Hardware automatisch und verknüpft sie mit den Treibern. &lt;br /&gt;
In den Hardware Einstellungen wird der COMx Port auf folgende Werte eingestellt: &lt;br /&gt;
&lt;br /&gt;
::- 115.200 bit/s &lt;br /&gt;
::- 8 Datenbits&lt;br /&gt;
::- 1 Stoppbit&lt;br /&gt;
::- kein Parität&lt;br /&gt;
::- keine Flusssteuerung &lt;br /&gt;
&lt;br /&gt;
Mit dem praktischen, kostenlosen Programm HTerm kann die Kommunikation zwischen PC und USB-[[I2C]] Device hergestellt werden. Auch hier werden die oben genannten Werte eingetragen. &lt;br /&gt;
&lt;br /&gt;
[[Bild:HTerm-USB-i2c_intervace_.jpg|thumb|Einstellungen für HTerm und Befehle]]&lt;br /&gt;
&lt;br /&gt;
Die Befehle können über die Eingabeleiste an das Device geschickt werden. Im Test war ein i2c fähiges Display angeschlossen. Bitte beachten, das Interface arbeitet mit einem 5V Pegel. Für Bausteine die nur einen 3,3V Pegel vertragen, muss die Spannung der Signalleitungen entsprechend angepasst werden. &lt;br /&gt;
 &lt;br /&gt;
Erklärung für den ersten Befehle (steht auch in der Anleitung), wobei zu unterscheiden ist ob es sich um einen Device spezifischen Befehl handelt, oder um einen Steuerbefehl für das Display:  &lt;br /&gt;
&lt;br /&gt;
S28 05 W 01 0D P &lt;br /&gt;
&lt;br /&gt;
Erklärung: &lt;br /&gt;
*'''S''' - Start  &lt;br /&gt;
*28 - Adresse des Displays als Hexzahl &lt;br /&gt;
*'''05''' - Steuerbefehl &lt;br /&gt;
*'''W''' - Schreiben (lesen wäre R) &lt;br /&gt;
*01 - Steuerbefehl Display&lt;br /&gt;
*0D - Courser blinken &lt;br /&gt;
*'''p''' - Stopp &lt;br /&gt;
&lt;br /&gt;
Noch ein weiteres Beispiel um die Struktur der Befehlseingabe zu verdeutlichen: &lt;br /&gt;
&lt;br /&gt;
S28 05 W 48 65 6C 6C 6F P &lt;br /&gt;
&lt;br /&gt;
Erklärung: &lt;br /&gt;
&lt;br /&gt;
*'''S''' - Start  &lt;br /&gt;
*28 - Adresse des Displays als Hexzahl &lt;br /&gt;
*'''05''' - Steuerbefehl &lt;br /&gt;
*'''W''' - Schreiben (lesen wäre R) &lt;br /&gt;
*00 - Display schreiben &lt;br /&gt;
*48 - &amp;quot;H&amp;quot;&lt;br /&gt;
*65 - &amp;quot;a&amp;quot;&lt;br /&gt;
*6C - &amp;quot;l&amp;quot;&lt;br /&gt;
*6C - &amp;quot;l&amp;quot;&lt;br /&gt;
*6F - &amp;quot;o&amp;quot;&lt;br /&gt;
*'''p''' - Stopp &lt;br /&gt;
&lt;br /&gt;
(Die spezifischen Befehle für das Bauteil sind im entsprechenden Datenblatt zu finden, hier eben die Befehle für das Display) &lt;br /&gt;
Wer sich ein entsprechendes Textfile schreibt, kann ganze Befehlsketten an ein beliebiges Device übertragen. &lt;br /&gt;
&lt;br /&gt;
So sieht das Ergebnis der 3 Befehle auf dem Display aus: &lt;br /&gt;
&lt;br /&gt;
[[Bild:Ergebnis_USB-i2c_intervace_.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== FAZIT ==&lt;br /&gt;
 &lt;br /&gt;
Praktisches, kleines Device um schnell ein paar [[I2C]] Bausteine direkt über den PC anzusteuern. Gerade für alle die normalerweise dem µC diese Aufgabe überlassen, mit seinen i2c slaves zu sprechen, kann mit dem Device getestet werden ob der Baustein überhaupt funktioniert.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Elektronik]]&lt;/div&gt;</summary>
		<author><name>HannoHupmann</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=I2C_USB_PC_Adapter&amp;diff=21395</id>
		<title>I2C USB PC Adapter</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=I2C_USB_PC_Adapter&amp;diff=21395"/>
				<updated>2012-10-21T18:37:00Z</updated>
		
		<summary type="html">&lt;p&gt;HannoHupmann: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bezugsquelle ==&lt;br /&gt;
&lt;br /&gt;
Von ELV gibt es ein kostengünstiges USB - [[I2C]] Interface &lt;br /&gt;
&lt;br /&gt;
[http://www.elv.de/usb-i2c-interface-komplettbausatz-inkl-gehaeuse-bearbeitet-und-bedruckt-usb-kabel-3-anschlusskabel.html Produktbeschreibung]&lt;br /&gt;
&lt;br /&gt;
{|{{Blaueschmaltabelle}}&lt;br /&gt;
|Mit dem USB-[[I2C]]-Interface kann von einem PC aus via USB mit einfachsten Befehlen direkt auf die am I2C-Bus angeschlossenen Geräte oder Bausteine zugegriffen werden.&lt;br /&gt;
&lt;br /&gt;
Durch die integrierte Makrofunktion können Anweisungsfolgen gespeichert werden, die anschließend selbstständig ablaufen. Dadurch kann das Interface z. B. mit nur einem zusätzlichen IC als Datenlogger für analoge/digitale Signale (PCF8591/8574), Temperaturen (LM75) usw. verwendet werden. Durch eine Reihe flexibler Befehle können bis zu 128 Geräte angesprochen/gesteuert werden.&lt;br /&gt;
&lt;br /&gt;
Dies kann im einfachsten Fall über ein normales Terminalprogramm, aber auch aus einer eigenen Anwendung heraus erfolgen. Alle Algorithmen und Befehle sind in der Dokumentation ausführlich inkl. Anwendungsbeispielen beschrieben.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es gibt zwei Versionen: &lt;br /&gt;
*1) fertig aufgebaut 34,95€&lt;br /&gt;
*2) zum selber löten 24,95€&lt;br /&gt;
&lt;br /&gt;
Im Preis unterscheiden sich die beiden Version um 10€ und es stellt sich die Frage ob es sich lohnt. Getestet wurde die Variante zum selbst aufbauen. Nach dem Auspacken stellt sich heraus: &lt;br /&gt;
es müssen lediglich 3 Stecker, 1 LED und 1 Kondensator eingelötet werden. &lt;br /&gt;
Arbeitsaufwand weniger als 10 Minuten und nur wer wirklich keinen Lötkolben hat oder irgendwie darauf zugreifen kann, sollte die 10€ mehr investieren. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Was wird geliefert? ==&lt;br /&gt;
[[Bild:Übersicht_USB-i2c_intervace_.JPG|thumb|Übersicht der mitgelieferten Teile]]&lt;br /&gt;
*1 Platine &lt;br /&gt;
*1 Gehäuse + Schrauben&lt;br /&gt;
*3 Stecker &lt;br /&gt;
*1 LED &lt;br /&gt;
*1 Kondensator &lt;br /&gt;
*3 Anschlusskabel mit einseitig Stecker &lt;br /&gt;
*1 USB - USB-B Kabel  &lt;br /&gt;
&lt;br /&gt;
Positiv: Das USB Kabel ist sehr lang, was heute nicht mehr selbstverständlich ist. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Inbetriebnahme ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nach dem löten, muss von der ELV Seite ein passender Windows / Mac / Linux Treiber geladen werden. Alle Betriebsysteme werden unterstüzt. Ebenfalls positiv! &lt;br /&gt;
Wird das Device über USB angeschlossen, findet Windows (nur damit wurde es getestet) die neue Hardware automatisch und verknüpft sie mit den Treibern. &lt;br /&gt;
In den Hardware Einstellungen wird der COMx Port auf folgende Werte eingestellt: &lt;br /&gt;
&lt;br /&gt;
::- 115.200 bit/s &lt;br /&gt;
::- 8 Datenbits&lt;br /&gt;
::- 1 Stoppbit&lt;br /&gt;
::- kein Parität&lt;br /&gt;
::- keine Flusssteuerung &lt;br /&gt;
&lt;br /&gt;
Mit dem praktischen, kostenlosen Programm HTerm kann die Kommunikation zwischen PC und USB-[[I2C]] Device hergestellt werden. Auch hier werden die oben genannten Werte eingetragen. &lt;br /&gt;
&lt;br /&gt;
[[Bild:HTerm-USB-i2c_intervace_.jpg|thumb|Einstellungen für HTerm und Befehle]]&lt;br /&gt;
&lt;br /&gt;
Die Befehle können über die Eingabeleiste an das Device geschickt werden. Im Test war ein i2c fähiges Display angeschlossen. &lt;br /&gt;
Erklärung für den ersten Befehle (steht auch in der Anleitung) wobei zu unterscheiden ist ob es sich um einen Device spezifischen Befehl handelt oder um einen Steuerbefehl für das Display.  &lt;br /&gt;
&lt;br /&gt;
S28 05 W 01 0D P &lt;br /&gt;
&lt;br /&gt;
Erklärung: &lt;br /&gt;
*'''S''' - Start  &lt;br /&gt;
*28 - Adresse des Displays als Hexzahl &lt;br /&gt;
*'''05''' - Steuerbefehl &lt;br /&gt;
*'''W''' - Schreiben (lesen wäre R) &lt;br /&gt;
*01 - Steuerbefehl Display&lt;br /&gt;
*0D - Courser blinken &lt;br /&gt;
*'''p''' - Stopp &lt;br /&gt;
&lt;br /&gt;
Noch ein weiteres Beispiel um die Struktur der Befehlseingabe zu verdeutlichen: &lt;br /&gt;
&lt;br /&gt;
S28 05 W 48 65 6C 6C 6F P &lt;br /&gt;
&lt;br /&gt;
Erklärung: &lt;br /&gt;
&lt;br /&gt;
*'''S''' - Start  &lt;br /&gt;
*28 - Adresse des Displays als Hexzahl &lt;br /&gt;
*'''05''' - Steuerbefehl &lt;br /&gt;
*'''W''' - Schreiben (lesen wäre R) &lt;br /&gt;
*00 - Display schreiben &lt;br /&gt;
*48 - &amp;quot;H&amp;quot;&lt;br /&gt;
*65 - &amp;quot;a&amp;quot;&lt;br /&gt;
*6C - &amp;quot;l&amp;quot;&lt;br /&gt;
*6C - &amp;quot;l&amp;quot;&lt;br /&gt;
*6F - &amp;quot;o&amp;quot;&lt;br /&gt;
*'''p''' - Stopp &lt;br /&gt;
&lt;br /&gt;
(Die Display Befehle sind im Datenblatt des entsprechenden Bauteils zu finden) &lt;br /&gt;
Wer sich ein entsprechendes Textfile schreibt kann ganze Befehlsketten an ein beliebiges Device übertragen. &lt;br /&gt;
&lt;br /&gt;
So sieht das Ergebnis der 3 Befehle auf dem Display aus: &lt;br /&gt;
&lt;br /&gt;
[[Bild:Ergebnis_USB-i2c_intervace_.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== FAZIT ==&lt;br /&gt;
 &lt;br /&gt;
Praktisches, kleines Device um schnell ein paar [[I2C]] Bausteine direkt über den PC anzusteuern. Gerade für alle die normalerweise dem µC diese Aufgabe überlassen, mit seinen i2c slaves zu sprechen, kann mit dem Device getestet werden ob der Baustein überhaupt funktioniert.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Elektronik]]&lt;/div&gt;</summary>
		<author><name>HannoHupmann</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=I2C_USB_PC_Adapter&amp;diff=21393</id>
		<title>I2C USB PC Adapter</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=I2C_USB_PC_Adapter&amp;diff=21393"/>
				<updated>2012-10-21T18:35:20Z</updated>
		
		<summary type="html">&lt;p&gt;HannoHupmann: I2c - USB PC Adapter wurde nach I2C USB PC Adapter verschoben&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== I2C - PC-Adapter ==&lt;br /&gt;
&lt;br /&gt;
Von ELV gibt es ein kostengünstiges USB - [[I2C]] Interface &lt;br /&gt;
&lt;br /&gt;
[http://www.elv.de/usb-i2c-interface-komplettbausatz-inkl-gehaeuse-bearbeitet-und-bedruckt-usb-kabel-3-anschlusskabel.html Produktbeschreibung]&lt;br /&gt;
&lt;br /&gt;
{|{{Blaueschmaltabelle}}&lt;br /&gt;
|Mit dem USB-[[I2C]]-Interface kann von einem PC aus via USB mit einfachsten Befehlen direkt auf die am I2C-Bus angeschlossenen Geräte oder Bausteine zugegriffen werden.&lt;br /&gt;
&lt;br /&gt;
Durch die integrierte Makrofunktion können Anweisungsfolgen gespeichert werden, die anschließend selbstständig ablaufen. Dadurch kann das Interface z. B. mit nur einem zusätzlichen IC als Datenlogger für analoge/digitale Signale (PCF8591/8574), Temperaturen (LM75) usw. verwendet werden. Durch eine Reihe flexibler Befehle können bis zu 128 Geräte angesprochen/gesteuert werden.&lt;br /&gt;
&lt;br /&gt;
Dies kann im einfachsten Fall über ein normales Terminalprogramm, aber auch aus einer eigenen Anwendung heraus erfolgen. Alle Algorithmen und Befehle sind in der Dokumentation ausführlich inkl. Anwendungsbeispielen beschrieben.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es gibt zwei Versionen: &lt;br /&gt;
*1) fertig aufgebaut 34,95€&lt;br /&gt;
*2) zum selber löten 24,95€&lt;br /&gt;
&lt;br /&gt;
Im Preis unterscheiden sich die beiden Version um 10€ und es stellt sich die Frage ob es sich lohnt. Gestest wurde die Variante zum selbst aufbauen. Nach dem Auspacken stellt sich heraus: &lt;br /&gt;
es müssen lediglich 3 Stecker, 1 LED und 1 Kondensator eingelötet werden. &lt;br /&gt;
Arbeitsaufwand weniger als 10 Minuten und nur wer wirklich keinen Lötkolben hat oder irgendwie darauf zugreifen kann, sollte die 10€ mehr investieren. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Was wird geliefert? ==&lt;br /&gt;
[[Bild:Übersicht_USB-i2c_intervace_.JPG|thumb|Übersicht der mitgelieferten Teile]]&lt;br /&gt;
*1 Platine &lt;br /&gt;
*1 Gehäuse + Schrauben&lt;br /&gt;
*3 Stecker &lt;br /&gt;
*1 LED &lt;br /&gt;
*1 Kondensator &lt;br /&gt;
*3 Anschlusskabel mit einseitig Stecker &lt;br /&gt;
*1 USB - USB-B Kabel  &lt;br /&gt;
&lt;br /&gt;
Positiv: Das USB Kabel ist sehr lang, was heute nicht mehr selbstverständlich ist. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Inbetriebnahme ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nach dem löten, muss von der ELV Seite ein passender Windows / Mac / Linux Treiber geladen werden. Alle Betriebsysteme werden untersützt. Ebenfalls positiv! &lt;br /&gt;
Wird das Device über USB angeschlossen, findet Windows (nur damit wurde es getestet) die neue Hardware automatisch und verknüpft sie mit den Treibern. &lt;br /&gt;
In den Hardware einstellungen wird der COMx Port auf folgende Werte eingestellt: &lt;br /&gt;
&lt;br /&gt;
::- 115.200 bit/s &lt;br /&gt;
::- 8 Datenbits&lt;br /&gt;
::- 1 Stoppbit&lt;br /&gt;
::- kein Parität&lt;br /&gt;
::- keine Flusssteuerung &lt;br /&gt;
&lt;br /&gt;
Mit dem praktischen, kostenlosen Programm HTerm kann die Kommunikation zwischen PC und USB-[[I2C]] Device hergestellt werden. Auch hier werden die oben genannten Werte eingetragen. &lt;br /&gt;
&lt;br /&gt;
[[Bild:HTerm-USB-i2c_intervace_.jpg|thumb|Einstellungen für HTerm und Befehle]]&lt;br /&gt;
&lt;br /&gt;
Die Befehle können über die Eingabeleiste an das Device geschickt werden. Im Test war ein i2c fähiges Display angeschlossen. &lt;br /&gt;
Erklährung für den ersten Befehle (steht auch in der Anleitung) wobei zu unterscheiden ist ob es sich um einen Device spezifischen Befehl handelt oder um einen Steuerbefehl für das Display.  &lt;br /&gt;
&lt;br /&gt;
S28 05 W 01 0D P &lt;br /&gt;
&lt;br /&gt;
Erklärung: &lt;br /&gt;
*'''S''' - Start  &lt;br /&gt;
*28 - Adresse des Displays als Hexzahl &lt;br /&gt;
*'''05''' - Steuerbefehl &lt;br /&gt;
*'''W''' - Schreiben (lesen wäre R) &lt;br /&gt;
*01 - Steuerbefehl Display&lt;br /&gt;
*0D - Courser blinken &lt;br /&gt;
*'''p''' - Stopp &lt;br /&gt;
&lt;br /&gt;
Noch ein weiteres Beispiel um die Struktur der Befehlseingabe zu verdeutlichen: &lt;br /&gt;
&lt;br /&gt;
S28 05 W 48 65 6C 6C 6F P &lt;br /&gt;
&lt;br /&gt;
Erklärung: &lt;br /&gt;
&lt;br /&gt;
*'''S''' - Start  &lt;br /&gt;
*28 - Adresse des Displays als Hexzahl &lt;br /&gt;
*'''05''' - Steuerbefehl &lt;br /&gt;
*'''W''' - Schreiben (lesen wäre R) &lt;br /&gt;
*00 - Display schreiben &lt;br /&gt;
*48 - &amp;quot;H&amp;quot;&lt;br /&gt;
*65 - &amp;quot;a&amp;quot;&lt;br /&gt;
*6C - &amp;quot;l&amp;quot;&lt;br /&gt;
*6C - &amp;quot;l&amp;quot;&lt;br /&gt;
*6F - &amp;quot;o&amp;quot;&lt;br /&gt;
*'''p''' - Stopp &lt;br /&gt;
&lt;br /&gt;
(Die Display Befehle sind im Datenblatt des entsprechenden Bauteils zu finden) &lt;br /&gt;
Wer sich ein entsprechendes Textfile schreibt kann ganze Befehlsketten an ein beliebiges Device übertragen. &lt;br /&gt;
&lt;br /&gt;
So sieht das Ergebniss der 3 Befehle auf dem Display aus: &lt;br /&gt;
&lt;br /&gt;
[[Bild:Ergebnis_USB-i2c_intervace_.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== FAZIT ==&lt;br /&gt;
 &lt;br /&gt;
Praktisches, kleines Device um schnell ein paar [[I2C]] Bausteine direkt über den PC anzusteuern. Gerade für alle die normalerweise dem µC diese Aufgabe überlassen, mit seinen i2c slaves zu sprechen, kann mit dem Device getestet werden ob der Baustein überhaupt funktioniert.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Elektronik]]&lt;/div&gt;</summary>
		<author><name>HannoHupmann</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=I2c_-_USB_PC_Adapter&amp;diff=21394</id>
		<title>I2c - USB PC Adapter</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=I2c_-_USB_PC_Adapter&amp;diff=21394"/>
				<updated>2012-10-21T18:35:20Z</updated>
		
		<summary type="html">&lt;p&gt;HannoHupmann: I2c - USB PC Adapter wurde nach I2C USB PC Adapter verschoben&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#redirect [[I2C USB PC Adapter]]&lt;/div&gt;</summary>
		<author><name>HannoHupmann</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=I2C_USB_PC_Adapter&amp;diff=21391</id>
		<title>I2C USB PC Adapter</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=I2C_USB_PC_Adapter&amp;diff=21391"/>
				<updated>2012-10-21T18:34:56Z</updated>
		
		<summary type="html">&lt;p&gt;HannoHupmann: I2c - Adapter für USB wurde nach I2c - USB PC Adapter verschoben&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== I2C - PC-Adapter ==&lt;br /&gt;
&lt;br /&gt;
Von ELV gibt es ein kostengünstiges USB - [[I2C]] Interface &lt;br /&gt;
&lt;br /&gt;
[http://www.elv.de/usb-i2c-interface-komplettbausatz-inkl-gehaeuse-bearbeitet-und-bedruckt-usb-kabel-3-anschlusskabel.html Produktbeschreibung]&lt;br /&gt;
&lt;br /&gt;
{|{{Blaueschmaltabelle}}&lt;br /&gt;
|Mit dem USB-[[I2C]]-Interface kann von einem PC aus via USB mit einfachsten Befehlen direkt auf die am I2C-Bus angeschlossenen Geräte oder Bausteine zugegriffen werden.&lt;br /&gt;
&lt;br /&gt;
Durch die integrierte Makrofunktion können Anweisungsfolgen gespeichert werden, die anschließend selbstständig ablaufen. Dadurch kann das Interface z. B. mit nur einem zusätzlichen IC als Datenlogger für analoge/digitale Signale (PCF8591/8574), Temperaturen (LM75) usw. verwendet werden. Durch eine Reihe flexibler Befehle können bis zu 128 Geräte angesprochen/gesteuert werden.&lt;br /&gt;
&lt;br /&gt;
Dies kann im einfachsten Fall über ein normales Terminalprogramm, aber auch aus einer eigenen Anwendung heraus erfolgen. Alle Algorithmen und Befehle sind in der Dokumentation ausführlich inkl. Anwendungsbeispielen beschrieben.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es gibt zwei Versionen: &lt;br /&gt;
*1) fertig aufgebaut 34,95€&lt;br /&gt;
*2) zum selber löten 24,95€&lt;br /&gt;
&lt;br /&gt;
Im Preis unterscheiden sich die beiden Version um 10€ und es stellt sich die Frage ob es sich lohnt. Gestest wurde die Variante zum selbst aufbauen. Nach dem Auspacken stellt sich heraus: &lt;br /&gt;
es müssen lediglich 3 Stecker, 1 LED und 1 Kondensator eingelötet werden. &lt;br /&gt;
Arbeitsaufwand weniger als 10 Minuten und nur wer wirklich keinen Lötkolben hat oder irgendwie darauf zugreifen kann, sollte die 10€ mehr investieren. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Was wird geliefert? ==&lt;br /&gt;
[[Bild:Übersicht_USB-i2c_intervace_.JPG|thumb|Übersicht der mitgelieferten Teile]]&lt;br /&gt;
*1 Platine &lt;br /&gt;
*1 Gehäuse + Schrauben&lt;br /&gt;
*3 Stecker &lt;br /&gt;
*1 LED &lt;br /&gt;
*1 Kondensator &lt;br /&gt;
*3 Anschlusskabel mit einseitig Stecker &lt;br /&gt;
*1 USB - USB-B Kabel  &lt;br /&gt;
&lt;br /&gt;
Positiv: Das USB Kabel ist sehr lang, was heute nicht mehr selbstverständlich ist. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Inbetriebnahme ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nach dem löten, muss von der ELV Seite ein passender Windows / Mac / Linux Treiber geladen werden. Alle Betriebsysteme werden untersützt. Ebenfalls positiv! &lt;br /&gt;
Wird das Device über USB angeschlossen, findet Windows (nur damit wurde es getestet) die neue Hardware automatisch und verknüpft sie mit den Treibern. &lt;br /&gt;
In den Hardware einstellungen wird der COMx Port auf folgende Werte eingestellt: &lt;br /&gt;
&lt;br /&gt;
::- 115.200 bit/s &lt;br /&gt;
::- 8 Datenbits&lt;br /&gt;
::- 1 Stoppbit&lt;br /&gt;
::- kein Parität&lt;br /&gt;
::- keine Flusssteuerung &lt;br /&gt;
&lt;br /&gt;
Mit dem praktischen, kostenlosen Programm HTerm kann die Kommunikation zwischen PC und USB-[[I2C]] Device hergestellt werden. Auch hier werden die oben genannten Werte eingetragen. &lt;br /&gt;
&lt;br /&gt;
[[Bild:HTerm-USB-i2c_intervace_.jpg|thumb|Einstellungen für HTerm und Befehle]]&lt;br /&gt;
&lt;br /&gt;
Die Befehle können über die Eingabeleiste an das Device geschickt werden. Im Test war ein i2c fähiges Display angeschlossen. &lt;br /&gt;
Erklährung für den ersten Befehle (steht auch in der Anleitung) wobei zu unterscheiden ist ob es sich um einen Device spezifischen Befehl handelt oder um einen Steuerbefehl für das Display.  &lt;br /&gt;
&lt;br /&gt;
S28 05 W 01 0D P &lt;br /&gt;
&lt;br /&gt;
Erklärung: &lt;br /&gt;
*'''S''' - Start  &lt;br /&gt;
*28 - Adresse des Displays als Hexzahl &lt;br /&gt;
*'''05''' - Steuerbefehl &lt;br /&gt;
*'''W''' - Schreiben (lesen wäre R) &lt;br /&gt;
*01 - Steuerbefehl Display&lt;br /&gt;
*0D - Courser blinken &lt;br /&gt;
*'''p''' - Stopp &lt;br /&gt;
&lt;br /&gt;
Noch ein weiteres Beispiel um die Struktur der Befehlseingabe zu verdeutlichen: &lt;br /&gt;
&lt;br /&gt;
S28 05 W 48 65 6C 6C 6F P &lt;br /&gt;
&lt;br /&gt;
Erklärung: &lt;br /&gt;
&lt;br /&gt;
*'''S''' - Start  &lt;br /&gt;
*28 - Adresse des Displays als Hexzahl &lt;br /&gt;
*'''05''' - Steuerbefehl &lt;br /&gt;
*'''W''' - Schreiben (lesen wäre R) &lt;br /&gt;
*00 - Display schreiben &lt;br /&gt;
*48 - &amp;quot;H&amp;quot;&lt;br /&gt;
*65 - &amp;quot;a&amp;quot;&lt;br /&gt;
*6C - &amp;quot;l&amp;quot;&lt;br /&gt;
*6C - &amp;quot;l&amp;quot;&lt;br /&gt;
*6F - &amp;quot;o&amp;quot;&lt;br /&gt;
*'''p''' - Stopp &lt;br /&gt;
&lt;br /&gt;
(Die Display Befehle sind im Datenblatt des entsprechenden Bauteils zu finden) &lt;br /&gt;
Wer sich ein entsprechendes Textfile schreibt kann ganze Befehlsketten an ein beliebiges Device übertragen. &lt;br /&gt;
&lt;br /&gt;
So sieht das Ergebniss der 3 Befehle auf dem Display aus: &lt;br /&gt;
&lt;br /&gt;
[[Bild:Ergebnis_USB-i2c_intervace_.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== FAZIT ==&lt;br /&gt;
 &lt;br /&gt;
Praktisches, kleines Device um schnell ein paar [[I2C]] Bausteine direkt über den PC anzusteuern. Gerade für alle die normalerweise dem µC diese Aufgabe überlassen, mit seinen i2c slaves zu sprechen, kann mit dem Device getestet werden ob der Baustein überhaupt funktioniert.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Elektronik]]&lt;/div&gt;</summary>
		<author><name>HannoHupmann</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=I2c_-_Adapter_f%C3%BCr_USB&amp;diff=21392</id>
		<title>I2c - Adapter für USB</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=I2c_-_Adapter_f%C3%BCr_USB&amp;diff=21392"/>
				<updated>2012-10-21T18:34:56Z</updated>
		
		<summary type="html">&lt;p&gt;HannoHupmann: I2c - Adapter für USB wurde nach I2c - USB PC Adapter verschoben&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#redirect [[I2c - USB PC Adapter]]&lt;/div&gt;</summary>
		<author><name>HannoHupmann</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Benutzer::HannoHupmann&amp;diff=21390</id>
		<title>Benutzer::HannoHupmann</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Benutzer::HannoHupmann&amp;diff=21390"/>
				<updated>2012-10-21T18:34:14Z</updated>
		
		<summary type="html">&lt;p&gt;HannoHupmann: Benutzer::HannoHupmann wurde nach I2c - Adapter für USB verschoben&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#redirect [[I2c - Adapter für USB]]&lt;/div&gt;</summary>
		<author><name>HannoHupmann</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=I2C_USB_PC_Adapter&amp;diff=21389</id>
		<title>I2C USB PC Adapter</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=I2C_USB_PC_Adapter&amp;diff=21389"/>
				<updated>2012-10-21T18:34:14Z</updated>
		
		<summary type="html">&lt;p&gt;HannoHupmann: Benutzer::HannoHupmann wurde nach I2c - Adapter für USB verschoben&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== I2C - PC-Adapter ==&lt;br /&gt;
&lt;br /&gt;
Von ELV gibt es ein kostengünstiges USB - [[I2C]] Interface &lt;br /&gt;
&lt;br /&gt;
[http://www.elv.de/usb-i2c-interface-komplettbausatz-inkl-gehaeuse-bearbeitet-und-bedruckt-usb-kabel-3-anschlusskabel.html Produktbeschreibung]&lt;br /&gt;
&lt;br /&gt;
{|{{Blaueschmaltabelle}}&lt;br /&gt;
|Mit dem USB-[[I2C]]-Interface kann von einem PC aus via USB mit einfachsten Befehlen direkt auf die am I2C-Bus angeschlossenen Geräte oder Bausteine zugegriffen werden.&lt;br /&gt;
&lt;br /&gt;
Durch die integrierte Makrofunktion können Anweisungsfolgen gespeichert werden, die anschließend selbstständig ablaufen. Dadurch kann das Interface z. B. mit nur einem zusätzlichen IC als Datenlogger für analoge/digitale Signale (PCF8591/8574), Temperaturen (LM75) usw. verwendet werden. Durch eine Reihe flexibler Befehle können bis zu 128 Geräte angesprochen/gesteuert werden.&lt;br /&gt;
&lt;br /&gt;
Dies kann im einfachsten Fall über ein normales Terminalprogramm, aber auch aus einer eigenen Anwendung heraus erfolgen. Alle Algorithmen und Befehle sind in der Dokumentation ausführlich inkl. Anwendungsbeispielen beschrieben.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es gibt zwei Versionen: &lt;br /&gt;
*1) fertig aufgebaut 34,95€&lt;br /&gt;
*2) zum selber löten 24,95€&lt;br /&gt;
&lt;br /&gt;
Im Preis unterscheiden sich die beiden Version um 10€ und es stellt sich die Frage ob es sich lohnt. Gestest wurde die Variante zum selbst aufbauen. Nach dem Auspacken stellt sich heraus: &lt;br /&gt;
es müssen lediglich 3 Stecker, 1 LED und 1 Kondensator eingelötet werden. &lt;br /&gt;
Arbeitsaufwand weniger als 10 Minuten und nur wer wirklich keinen Lötkolben hat oder irgendwie darauf zugreifen kann, sollte die 10€ mehr investieren. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Was wird geliefert? ==&lt;br /&gt;
[[Bild:Übersicht_USB-i2c_intervace_.JPG|thumb|Übersicht der mitgelieferten Teile]]&lt;br /&gt;
*1 Platine &lt;br /&gt;
*1 Gehäuse + Schrauben&lt;br /&gt;
*3 Stecker &lt;br /&gt;
*1 LED &lt;br /&gt;
*1 Kondensator &lt;br /&gt;
*3 Anschlusskabel mit einseitig Stecker &lt;br /&gt;
*1 USB - USB-B Kabel  &lt;br /&gt;
&lt;br /&gt;
Positiv: Das USB Kabel ist sehr lang, was heute nicht mehr selbstverständlich ist. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Inbetriebnahme ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nach dem löten, muss von der ELV Seite ein passender Windows / Mac / Linux Treiber geladen werden. Alle Betriebsysteme werden untersützt. Ebenfalls positiv! &lt;br /&gt;
Wird das Device über USB angeschlossen, findet Windows (nur damit wurde es getestet) die neue Hardware automatisch und verknüpft sie mit den Treibern. &lt;br /&gt;
In den Hardware einstellungen wird der COMx Port auf folgende Werte eingestellt: &lt;br /&gt;
&lt;br /&gt;
::- 115.200 bit/s &lt;br /&gt;
::- 8 Datenbits&lt;br /&gt;
::- 1 Stoppbit&lt;br /&gt;
::- kein Parität&lt;br /&gt;
::- keine Flusssteuerung &lt;br /&gt;
&lt;br /&gt;
Mit dem praktischen, kostenlosen Programm HTerm kann die Kommunikation zwischen PC und USB-[[I2C]] Device hergestellt werden. Auch hier werden die oben genannten Werte eingetragen. &lt;br /&gt;
&lt;br /&gt;
[[Bild:HTerm-USB-i2c_intervace_.jpg|thumb|Einstellungen für HTerm und Befehle]]&lt;br /&gt;
&lt;br /&gt;
Die Befehle können über die Eingabeleiste an das Device geschickt werden. Im Test war ein i2c fähiges Display angeschlossen. &lt;br /&gt;
Erklährung für den ersten Befehle (steht auch in der Anleitung) wobei zu unterscheiden ist ob es sich um einen Device spezifischen Befehl handelt oder um einen Steuerbefehl für das Display.  &lt;br /&gt;
&lt;br /&gt;
S28 05 W 01 0D P &lt;br /&gt;
&lt;br /&gt;
Erklärung: &lt;br /&gt;
*'''S''' - Start  &lt;br /&gt;
*28 - Adresse des Displays als Hexzahl &lt;br /&gt;
*'''05''' - Steuerbefehl &lt;br /&gt;
*'''W''' - Schreiben (lesen wäre R) &lt;br /&gt;
*01 - Steuerbefehl Display&lt;br /&gt;
*0D - Courser blinken &lt;br /&gt;
*'''p''' - Stopp &lt;br /&gt;
&lt;br /&gt;
Noch ein weiteres Beispiel um die Struktur der Befehlseingabe zu verdeutlichen: &lt;br /&gt;
&lt;br /&gt;
S28 05 W 48 65 6C 6C 6F P &lt;br /&gt;
&lt;br /&gt;
Erklärung: &lt;br /&gt;
&lt;br /&gt;
*'''S''' - Start  &lt;br /&gt;
*28 - Adresse des Displays als Hexzahl &lt;br /&gt;
*'''05''' - Steuerbefehl &lt;br /&gt;
*'''W''' - Schreiben (lesen wäre R) &lt;br /&gt;
*00 - Display schreiben &lt;br /&gt;
*48 - &amp;quot;H&amp;quot;&lt;br /&gt;
*65 - &amp;quot;a&amp;quot;&lt;br /&gt;
*6C - &amp;quot;l&amp;quot;&lt;br /&gt;
*6C - &amp;quot;l&amp;quot;&lt;br /&gt;
*6F - &amp;quot;o&amp;quot;&lt;br /&gt;
*'''p''' - Stopp &lt;br /&gt;
&lt;br /&gt;
(Die Display Befehle sind im Datenblatt des entsprechenden Bauteils zu finden) &lt;br /&gt;
Wer sich ein entsprechendes Textfile schreibt kann ganze Befehlsketten an ein beliebiges Device übertragen. &lt;br /&gt;
&lt;br /&gt;
So sieht das Ergebniss der 3 Befehle auf dem Display aus: &lt;br /&gt;
&lt;br /&gt;
[[Bild:Ergebnis_USB-i2c_intervace_.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== FAZIT ==&lt;br /&gt;
 &lt;br /&gt;
Praktisches, kleines Device um schnell ein paar [[I2C]] Bausteine direkt über den PC anzusteuern. Gerade für alle die normalerweise dem µC diese Aufgabe überlassen, mit seinen i2c slaves zu sprechen, kann mit dem Device getestet werden ob der Baustein überhaupt funktioniert.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Elektronik]]&lt;/div&gt;</summary>
		<author><name>HannoHupmann</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=I2C_USB_PC_Adapter&amp;diff=21387</id>
		<title>I2C USB PC Adapter</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=I2C_USB_PC_Adapter&amp;diff=21387"/>
				<updated>2012-10-21T18:32:59Z</updated>
		
		<summary type="html">&lt;p&gt;HannoHupmann: Elektronik wurde nach Benutzer::HannoHupmann verschoben&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== I2C - PC-Adapter ==&lt;br /&gt;
&lt;br /&gt;
Von ELV gibt es ein kostengünstiges USB - [[I2C]] Interface &lt;br /&gt;
&lt;br /&gt;
[http://www.elv.de/usb-i2c-interface-komplettbausatz-inkl-gehaeuse-bearbeitet-und-bedruckt-usb-kabel-3-anschlusskabel.html Produktbeschreibung]&lt;br /&gt;
&lt;br /&gt;
{|{{Blaueschmaltabelle}}&lt;br /&gt;
|Mit dem USB-[[I2C]]-Interface kann von einem PC aus via USB mit einfachsten Befehlen direkt auf die am I2C-Bus angeschlossenen Geräte oder Bausteine zugegriffen werden.&lt;br /&gt;
&lt;br /&gt;
Durch die integrierte Makrofunktion können Anweisungsfolgen gespeichert werden, die anschließend selbstständig ablaufen. Dadurch kann das Interface z. B. mit nur einem zusätzlichen IC als Datenlogger für analoge/digitale Signale (PCF8591/8574), Temperaturen (LM75) usw. verwendet werden. Durch eine Reihe flexibler Befehle können bis zu 128 Geräte angesprochen/gesteuert werden.&lt;br /&gt;
&lt;br /&gt;
Dies kann im einfachsten Fall über ein normales Terminalprogramm, aber auch aus einer eigenen Anwendung heraus erfolgen. Alle Algorithmen und Befehle sind in der Dokumentation ausführlich inkl. Anwendungsbeispielen beschrieben.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es gibt zwei Versionen: &lt;br /&gt;
*1) fertig aufgebaut 34,95€&lt;br /&gt;
*2) zum selber löten 24,95€&lt;br /&gt;
&lt;br /&gt;
Im Preis unterscheiden sich die beiden Version um 10€ und es stellt sich die Frage ob es sich lohnt. Gestest wurde die Variante zum selbst aufbauen. Nach dem Auspacken stellt sich heraus: &lt;br /&gt;
es müssen lediglich 3 Stecker, 1 LED und 1 Kondensator eingelötet werden. &lt;br /&gt;
Arbeitsaufwand weniger als 10 Minuten und nur wer wirklich keinen Lötkolben hat oder irgendwie darauf zugreifen kann, sollte die 10€ mehr investieren. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Was wird geliefert? ==&lt;br /&gt;
[[Bild:Übersicht_USB-i2c_intervace_.JPG|thumb|Übersicht der mitgelieferten Teile]]&lt;br /&gt;
*1 Platine &lt;br /&gt;
*1 Gehäuse + Schrauben&lt;br /&gt;
*3 Stecker &lt;br /&gt;
*1 LED &lt;br /&gt;
*1 Kondensator &lt;br /&gt;
*3 Anschlusskabel mit einseitig Stecker &lt;br /&gt;
*1 USB - USB-B Kabel  &lt;br /&gt;
&lt;br /&gt;
Positiv: Das USB Kabel ist sehr lang, was heute nicht mehr selbstverständlich ist. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Inbetriebnahme ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nach dem löten, muss von der ELV Seite ein passender Windows / Mac / Linux Treiber geladen werden. Alle Betriebsysteme werden untersützt. Ebenfalls positiv! &lt;br /&gt;
Wird das Device über USB angeschlossen, findet Windows (nur damit wurde es getestet) die neue Hardware automatisch und verknüpft sie mit den Treibern. &lt;br /&gt;
In den Hardware einstellungen wird der COMx Port auf folgende Werte eingestellt: &lt;br /&gt;
&lt;br /&gt;
::- 115.200 bit/s &lt;br /&gt;
::- 8 Datenbits&lt;br /&gt;
::- 1 Stoppbit&lt;br /&gt;
::- kein Parität&lt;br /&gt;
::- keine Flusssteuerung &lt;br /&gt;
&lt;br /&gt;
Mit dem praktischen, kostenlosen Programm HTerm kann die Kommunikation zwischen PC und USB-[[I2C]] Device hergestellt werden. Auch hier werden die oben genannten Werte eingetragen. &lt;br /&gt;
&lt;br /&gt;
[[Bild:HTerm-USB-i2c_intervace_.jpg|thumb|Einstellungen für HTerm und Befehle]]&lt;br /&gt;
&lt;br /&gt;
Die Befehle können über die Eingabeleiste an das Device geschickt werden. Im Test war ein i2c fähiges Display angeschlossen. &lt;br /&gt;
Erklährung für den ersten Befehle (steht auch in der Anleitung) wobei zu unterscheiden ist ob es sich um einen Device spezifischen Befehl handelt oder um einen Steuerbefehl für das Display.  &lt;br /&gt;
&lt;br /&gt;
S28 05 W 01 0D P &lt;br /&gt;
&lt;br /&gt;
Erklärung: &lt;br /&gt;
*'''S''' - Start  &lt;br /&gt;
*28 - Adresse des Displays als Hexzahl &lt;br /&gt;
*'''05''' - Steuerbefehl &lt;br /&gt;
*'''W''' - Schreiben (lesen wäre R) &lt;br /&gt;
*01 - Steuerbefehl Display&lt;br /&gt;
*0D - Courser blinken &lt;br /&gt;
*'''p''' - Stopp &lt;br /&gt;
&lt;br /&gt;
Noch ein weiteres Beispiel um die Struktur der Befehlseingabe zu verdeutlichen: &lt;br /&gt;
&lt;br /&gt;
S28 05 W 48 65 6C 6C 6F P &lt;br /&gt;
&lt;br /&gt;
Erklärung: &lt;br /&gt;
&lt;br /&gt;
*'''S''' - Start  &lt;br /&gt;
*28 - Adresse des Displays als Hexzahl &lt;br /&gt;
*'''05''' - Steuerbefehl &lt;br /&gt;
*'''W''' - Schreiben (lesen wäre R) &lt;br /&gt;
*00 - Display schreiben &lt;br /&gt;
*48 - &amp;quot;H&amp;quot;&lt;br /&gt;
*65 - &amp;quot;a&amp;quot;&lt;br /&gt;
*6C - &amp;quot;l&amp;quot;&lt;br /&gt;
*6C - &amp;quot;l&amp;quot;&lt;br /&gt;
*6F - &amp;quot;o&amp;quot;&lt;br /&gt;
*'''p''' - Stopp &lt;br /&gt;
&lt;br /&gt;
(Die Display Befehle sind im Datenblatt des entsprechenden Bauteils zu finden) &lt;br /&gt;
Wer sich ein entsprechendes Textfile schreibt kann ganze Befehlsketten an ein beliebiges Device übertragen. &lt;br /&gt;
&lt;br /&gt;
So sieht das Ergebniss der 3 Befehle auf dem Display aus: &lt;br /&gt;
&lt;br /&gt;
[[Bild:Ergebnis_USB-i2c_intervace_.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== FAZIT ==&lt;br /&gt;
 &lt;br /&gt;
Praktisches, kleines Device um schnell ein paar [[I2C]] Bausteine direkt über den PC anzusteuern. Gerade für alle die normalerweise dem µC diese Aufgabe überlassen, mit seinen i2c slaves zu sprechen, kann mit dem Device getestet werden ob der Baustein überhaupt funktioniert.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Elektronik]]&lt;/div&gt;</summary>
		<author><name>HannoHupmann</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Elektronik&amp;diff=21388</id>
		<title>Elektronik</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Elektronik&amp;diff=21388"/>
				<updated>2012-10-21T18:32:59Z</updated>
		
		<summary type="html">&lt;p&gt;HannoHupmann: Elektronik wurde nach Benutzer::HannoHupmann verschoben&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#redirect [[Benutzer::HannoHupmann]]&lt;/div&gt;</summary>
		<author><name>HannoHupmann</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=I2C_USB_PC_Adapter&amp;diff=21385</id>
		<title>I2C USB PC Adapter</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=I2C_USB_PC_Adapter&amp;diff=21385"/>
				<updated>2012-10-21T18:31:49Z</updated>
		
		<summary type="html">&lt;p&gt;HannoHupmann: Benutzer Diskussion:HannoHupmann wurde nach Elektronik verschoben&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== I2C - PC-Adapter ==&lt;br /&gt;
&lt;br /&gt;
Von ELV gibt es ein kostengünstiges USB - [[I2C]] Interface &lt;br /&gt;
&lt;br /&gt;
[http://www.elv.de/usb-i2c-interface-komplettbausatz-inkl-gehaeuse-bearbeitet-und-bedruckt-usb-kabel-3-anschlusskabel.html Produktbeschreibung]&lt;br /&gt;
&lt;br /&gt;
{|{{Blaueschmaltabelle}}&lt;br /&gt;
|Mit dem USB-[[I2C]]-Interface kann von einem PC aus via USB mit einfachsten Befehlen direkt auf die am I2C-Bus angeschlossenen Geräte oder Bausteine zugegriffen werden.&lt;br /&gt;
&lt;br /&gt;
Durch die integrierte Makrofunktion können Anweisungsfolgen gespeichert werden, die anschließend selbstständig ablaufen. Dadurch kann das Interface z. B. mit nur einem zusätzlichen IC als Datenlogger für analoge/digitale Signale (PCF8591/8574), Temperaturen (LM75) usw. verwendet werden. Durch eine Reihe flexibler Befehle können bis zu 128 Geräte angesprochen/gesteuert werden.&lt;br /&gt;
&lt;br /&gt;
Dies kann im einfachsten Fall über ein normales Terminalprogramm, aber auch aus einer eigenen Anwendung heraus erfolgen. Alle Algorithmen und Befehle sind in der Dokumentation ausführlich inkl. Anwendungsbeispielen beschrieben.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es gibt zwei Versionen: &lt;br /&gt;
*1) fertig aufgebaut 34,95€&lt;br /&gt;
*2) zum selber löten 24,95€&lt;br /&gt;
&lt;br /&gt;
Im Preis unterscheiden sich die beiden Version um 10€ und es stellt sich die Frage ob es sich lohnt. Gestest wurde die Variante zum selbst aufbauen. Nach dem Auspacken stellt sich heraus: &lt;br /&gt;
es müssen lediglich 3 Stecker, 1 LED und 1 Kondensator eingelötet werden. &lt;br /&gt;
Arbeitsaufwand weniger als 10 Minuten und nur wer wirklich keinen Lötkolben hat oder irgendwie darauf zugreifen kann, sollte die 10€ mehr investieren. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Was wird geliefert? ==&lt;br /&gt;
[[Bild:Übersicht_USB-i2c_intervace_.JPG|thumb|Übersicht der mitgelieferten Teile]]&lt;br /&gt;
*1 Platine &lt;br /&gt;
*1 Gehäuse + Schrauben&lt;br /&gt;
*3 Stecker &lt;br /&gt;
*1 LED &lt;br /&gt;
*1 Kondensator &lt;br /&gt;
*3 Anschlusskabel mit einseitig Stecker &lt;br /&gt;
*1 USB - USB-B Kabel  &lt;br /&gt;
&lt;br /&gt;
Positiv: Das USB Kabel ist sehr lang, was heute nicht mehr selbstverständlich ist. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Inbetriebnahme ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nach dem löten, muss von der ELV Seite ein passender Windows / Mac / Linux Treiber geladen werden. Alle Betriebsysteme werden untersützt. Ebenfalls positiv! &lt;br /&gt;
Wird das Device über USB angeschlossen, findet Windows (nur damit wurde es getestet) die neue Hardware automatisch und verknüpft sie mit den Treibern. &lt;br /&gt;
In den Hardware einstellungen wird der COMx Port auf folgende Werte eingestellt: &lt;br /&gt;
&lt;br /&gt;
::- 115.200 bit/s &lt;br /&gt;
::- 8 Datenbits&lt;br /&gt;
::- 1 Stoppbit&lt;br /&gt;
::- kein Parität&lt;br /&gt;
::- keine Flusssteuerung &lt;br /&gt;
&lt;br /&gt;
Mit dem praktischen, kostenlosen Programm HTerm kann die Kommunikation zwischen PC und USB-[[I2C]] Device hergestellt werden. Auch hier werden die oben genannten Werte eingetragen. &lt;br /&gt;
&lt;br /&gt;
[[Bild:HTerm-USB-i2c_intervace_.jpg|thumb|Einstellungen für HTerm und Befehle]]&lt;br /&gt;
&lt;br /&gt;
Die Befehle können über die Eingabeleiste an das Device geschickt werden. Im Test war ein i2c fähiges Display angeschlossen. &lt;br /&gt;
Erklährung für den ersten Befehle (steht auch in der Anleitung) wobei zu unterscheiden ist ob es sich um einen Device spezifischen Befehl handelt oder um einen Steuerbefehl für das Display.  &lt;br /&gt;
&lt;br /&gt;
S28 05 W 01 0D P &lt;br /&gt;
&lt;br /&gt;
Erklärung: &lt;br /&gt;
*'''S''' - Start  &lt;br /&gt;
*28 - Adresse des Displays als Hexzahl &lt;br /&gt;
*'''05''' - Steuerbefehl &lt;br /&gt;
*'''W''' - Schreiben (lesen wäre R) &lt;br /&gt;
*01 - Steuerbefehl Display&lt;br /&gt;
*0D - Courser blinken &lt;br /&gt;
*'''p''' - Stopp &lt;br /&gt;
&lt;br /&gt;
Noch ein weiteres Beispiel um die Struktur der Befehlseingabe zu verdeutlichen: &lt;br /&gt;
&lt;br /&gt;
S28 05 W 48 65 6C 6C 6F P &lt;br /&gt;
&lt;br /&gt;
Erklärung: &lt;br /&gt;
&lt;br /&gt;
*'''S''' - Start  &lt;br /&gt;
*28 - Adresse des Displays als Hexzahl &lt;br /&gt;
*'''05''' - Steuerbefehl &lt;br /&gt;
*'''W''' - Schreiben (lesen wäre R) &lt;br /&gt;
*00 - Display schreiben &lt;br /&gt;
*48 - &amp;quot;H&amp;quot;&lt;br /&gt;
*65 - &amp;quot;a&amp;quot;&lt;br /&gt;
*6C - &amp;quot;l&amp;quot;&lt;br /&gt;
*6C - &amp;quot;l&amp;quot;&lt;br /&gt;
*6F - &amp;quot;o&amp;quot;&lt;br /&gt;
*'''p''' - Stopp &lt;br /&gt;
&lt;br /&gt;
(Die Display Befehle sind im Datenblatt des entsprechenden Bauteils zu finden) &lt;br /&gt;
Wer sich ein entsprechendes Textfile schreibt kann ganze Befehlsketten an ein beliebiges Device übertragen. &lt;br /&gt;
&lt;br /&gt;
So sieht das Ergebniss der 3 Befehle auf dem Display aus: &lt;br /&gt;
&lt;br /&gt;
[[Bild:Ergebnis_USB-i2c_intervace_.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== FAZIT ==&lt;br /&gt;
 &lt;br /&gt;
Praktisches, kleines Device um schnell ein paar [[I2C]] Bausteine direkt über den PC anzusteuern. Gerade für alle die normalerweise dem µC diese Aufgabe überlassen, mit seinen i2c slaves zu sprechen, kann mit dem Device getestet werden ob der Baustein überhaupt funktioniert.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Elektronik]]&lt;/div&gt;</summary>
		<author><name>HannoHupmann</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Benutzer_Diskussion:HannoHupmann&amp;diff=21386</id>
		<title>Benutzer Diskussion:HannoHupmann</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Benutzer_Diskussion:HannoHupmann&amp;diff=21386"/>
				<updated>2012-10-21T18:31:49Z</updated>
		
		<summary type="html">&lt;p&gt;HannoHupmann: Benutzer Diskussion:HannoHupmann wurde nach Elektronik verschoben: Freigeben&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#redirect [[Elektronik]]&lt;/div&gt;</summary>
		<author><name>HannoHupmann</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=I2C_USB_PC_Adapter&amp;diff=21384</id>
		<title>I2C USB PC Adapter</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=I2C_USB_PC_Adapter&amp;diff=21384"/>
				<updated>2012-10-21T18:31:12Z</updated>
		
		<summary type="html">&lt;p&gt;HannoHupmann: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== I2C - PC-Adapter ==&lt;br /&gt;
&lt;br /&gt;
Von ELV gibt es ein kostengünstiges USB - [[I2C]] Interface &lt;br /&gt;
&lt;br /&gt;
[http://www.elv.de/usb-i2c-interface-komplettbausatz-inkl-gehaeuse-bearbeitet-und-bedruckt-usb-kabel-3-anschlusskabel.html Produktbeschreibung]&lt;br /&gt;
&lt;br /&gt;
{|{{Blaueschmaltabelle}}&lt;br /&gt;
|Mit dem USB-[[I2C]]-Interface kann von einem PC aus via USB mit einfachsten Befehlen direkt auf die am I2C-Bus angeschlossenen Geräte oder Bausteine zugegriffen werden.&lt;br /&gt;
&lt;br /&gt;
Durch die integrierte Makrofunktion können Anweisungsfolgen gespeichert werden, die anschließend selbstständig ablaufen. Dadurch kann das Interface z. B. mit nur einem zusätzlichen IC als Datenlogger für analoge/digitale Signale (PCF8591/8574), Temperaturen (LM75) usw. verwendet werden. Durch eine Reihe flexibler Befehle können bis zu 128 Geräte angesprochen/gesteuert werden.&lt;br /&gt;
&lt;br /&gt;
Dies kann im einfachsten Fall über ein normales Terminalprogramm, aber auch aus einer eigenen Anwendung heraus erfolgen. Alle Algorithmen und Befehle sind in der Dokumentation ausführlich inkl. Anwendungsbeispielen beschrieben.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es gibt zwei Versionen: &lt;br /&gt;
*1) fertig aufgebaut 34,95€&lt;br /&gt;
*2) zum selber löten 24,95€&lt;br /&gt;
&lt;br /&gt;
Im Preis unterscheiden sich die beiden Version um 10€ und es stellt sich die Frage ob es sich lohnt. Gestest wurde die Variante zum selbst aufbauen. Nach dem Auspacken stellt sich heraus: &lt;br /&gt;
es müssen lediglich 3 Stecker, 1 LED und 1 Kondensator eingelötet werden. &lt;br /&gt;
Arbeitsaufwand weniger als 10 Minuten und nur wer wirklich keinen Lötkolben hat oder irgendwie darauf zugreifen kann, sollte die 10€ mehr investieren. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Was wird geliefert? ==&lt;br /&gt;
[[Bild:Übersicht_USB-i2c_intervace_.JPG|thumb|Übersicht der mitgelieferten Teile]]&lt;br /&gt;
*1 Platine &lt;br /&gt;
*1 Gehäuse + Schrauben&lt;br /&gt;
*3 Stecker &lt;br /&gt;
*1 LED &lt;br /&gt;
*1 Kondensator &lt;br /&gt;
*3 Anschlusskabel mit einseitig Stecker &lt;br /&gt;
*1 USB - USB-B Kabel  &lt;br /&gt;
&lt;br /&gt;
Positiv: Das USB Kabel ist sehr lang, was heute nicht mehr selbstverständlich ist. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Inbetriebnahme ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nach dem löten, muss von der ELV Seite ein passender Windows / Mac / Linux Treiber geladen werden. Alle Betriebsysteme werden untersützt. Ebenfalls positiv! &lt;br /&gt;
Wird das Device über USB angeschlossen, findet Windows (nur damit wurde es getestet) die neue Hardware automatisch und verknüpft sie mit den Treibern. &lt;br /&gt;
In den Hardware einstellungen wird der COMx Port auf folgende Werte eingestellt: &lt;br /&gt;
&lt;br /&gt;
::- 115.200 bit/s &lt;br /&gt;
::- 8 Datenbits&lt;br /&gt;
::- 1 Stoppbit&lt;br /&gt;
::- kein Parität&lt;br /&gt;
::- keine Flusssteuerung &lt;br /&gt;
&lt;br /&gt;
Mit dem praktischen, kostenlosen Programm HTerm kann die Kommunikation zwischen PC und USB-[[I2C]] Device hergestellt werden. Auch hier werden die oben genannten Werte eingetragen. &lt;br /&gt;
&lt;br /&gt;
[[Bild:HTerm-USB-i2c_intervace_.jpg|thumb|Einstellungen für HTerm und Befehle]]&lt;br /&gt;
&lt;br /&gt;
Die Befehle können über die Eingabeleiste an das Device geschickt werden. Im Test war ein i2c fähiges Display angeschlossen. &lt;br /&gt;
Erklährung für den ersten Befehle (steht auch in der Anleitung) wobei zu unterscheiden ist ob es sich um einen Device spezifischen Befehl handelt oder um einen Steuerbefehl für das Display.  &lt;br /&gt;
&lt;br /&gt;
S28 05 W 01 0D P &lt;br /&gt;
&lt;br /&gt;
Erklärung: &lt;br /&gt;
*'''S''' - Start  &lt;br /&gt;
*28 - Adresse des Displays als Hexzahl &lt;br /&gt;
*'''05''' - Steuerbefehl &lt;br /&gt;
*'''W''' - Schreiben (lesen wäre R) &lt;br /&gt;
*01 - Steuerbefehl Display&lt;br /&gt;
*0D - Courser blinken &lt;br /&gt;
*'''p''' - Stopp &lt;br /&gt;
&lt;br /&gt;
Noch ein weiteres Beispiel um die Struktur der Befehlseingabe zu verdeutlichen: &lt;br /&gt;
&lt;br /&gt;
S28 05 W 48 65 6C 6C 6F P &lt;br /&gt;
&lt;br /&gt;
Erklärung: &lt;br /&gt;
&lt;br /&gt;
*'''S''' - Start  &lt;br /&gt;
*28 - Adresse des Displays als Hexzahl &lt;br /&gt;
*'''05''' - Steuerbefehl &lt;br /&gt;
*'''W''' - Schreiben (lesen wäre R) &lt;br /&gt;
*00 - Display schreiben &lt;br /&gt;
*48 - &amp;quot;H&amp;quot;&lt;br /&gt;
*65 - &amp;quot;a&amp;quot;&lt;br /&gt;
*6C - &amp;quot;l&amp;quot;&lt;br /&gt;
*6C - &amp;quot;l&amp;quot;&lt;br /&gt;
*6F - &amp;quot;o&amp;quot;&lt;br /&gt;
*'''p''' - Stopp &lt;br /&gt;
&lt;br /&gt;
(Die Display Befehle sind im Datenblatt des entsprechenden Bauteils zu finden) &lt;br /&gt;
Wer sich ein entsprechendes Textfile schreibt kann ganze Befehlsketten an ein beliebiges Device übertragen. &lt;br /&gt;
&lt;br /&gt;
So sieht das Ergebniss der 3 Befehle auf dem Display aus: &lt;br /&gt;
&lt;br /&gt;
[[Bild:Ergebnis_USB-i2c_intervace_.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== FAZIT ==&lt;br /&gt;
 &lt;br /&gt;
Praktisches, kleines Device um schnell ein paar [[I2C]] Bausteine direkt über den PC anzusteuern. Gerade für alle die normalerweise dem µC diese Aufgabe überlassen, mit seinen i2c slaves zu sprechen, kann mit dem Device getestet werden ob der Baustein überhaupt funktioniert.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Elektronik]]&lt;/div&gt;</summary>
		<author><name>HannoHupmann</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Datei:HTerm-USB-i2c_intervace_.jpg&amp;diff=21383</id>
		<title>Datei:HTerm-USB-i2c intervace .jpg</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Datei:HTerm-USB-i2c_intervace_.jpg&amp;diff=21383"/>
				<updated>2012-10-21T18:30:28Z</updated>
		
		<summary type="html">&lt;p&gt;HannoHupmann: Einstellungen für USB-i2c Interface von ELV&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Einstellungen für USB-i2c Interface von ELV&lt;/div&gt;</summary>
		<author><name>HannoHupmann</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Datei:Ergebnis_USB-i2c_intervace_.jpg&amp;diff=21382</id>
		<title>Datei:Ergebnis USB-i2c intervace .jpg</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Datei:Ergebnis_USB-i2c_intervace_.jpg&amp;diff=21382"/>
				<updated>2012-10-21T18:27:43Z</updated>
		
		<summary type="html">&lt;p&gt;HannoHupmann: Ergebnis des USB-i2c Interfaces von ELV&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ergebnis des USB-i2c Interfaces von ELV&lt;/div&gt;</summary>
		<author><name>HannoHupmann</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=I2C_USB_PC_Adapter&amp;diff=21381</id>
		<title>I2C USB PC Adapter</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=I2C_USB_PC_Adapter&amp;diff=21381"/>
				<updated>2012-10-21T18:23:47Z</updated>
		
		<summary type="html">&lt;p&gt;HannoHupmann: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== I2C - PC-Adapter ==&lt;br /&gt;
&lt;br /&gt;
Von ELV gibt es ein kostengünstiges USB - [[I2C]] Interface &lt;br /&gt;
&lt;br /&gt;
[http://www.elv.de/usb-i2c-interface-komplettbausatz-inkl-gehaeuse-bearbeitet-und-bedruckt-usb-kabel-3-anschlusskabel.html Produktbeschreibung]&lt;br /&gt;
&lt;br /&gt;
{|{{Blaueschmaltabelle}}&lt;br /&gt;
|Mit dem USB-[[I2C]]-Interface kann von einem PC aus via USB mit einfachsten Befehlen direkt auf die am I2C-Bus angeschlossenen Geräte oder Bausteine zugegriffen werden.&lt;br /&gt;
&lt;br /&gt;
Durch die integrierte Makrofunktion können Anweisungsfolgen gespeichert werden, die anschließend selbstständig ablaufen. Dadurch kann das Interface z. B. mit nur einem zusätzlichen IC als Datenlogger für analoge/digitale Signale (PCF8591/8574), Temperaturen (LM75) usw. verwendet werden. Durch eine Reihe flexibler Befehle können bis zu 128 Geräte angesprochen/gesteuert werden.&lt;br /&gt;
&lt;br /&gt;
Dies kann im einfachsten Fall über ein normales Terminalprogramm, aber auch aus einer eigenen Anwendung heraus erfolgen. Alle Algorithmen und Befehle sind in der Dokumentation ausführlich inkl. Anwendungsbeispielen beschrieben.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es gibt zwei Versionen: &lt;br /&gt;
*1) fertig aufgebaut 34,95€&lt;br /&gt;
*2) zum selber löten 24,95€&lt;br /&gt;
&lt;br /&gt;
Im Preis unterscheiden sich die beiden Version um 10€ und es stellt sich die Frage ob es sich lohnt. Gestest wurde die Variante zum selbst aufbauen. Nach dem Auspacken stellt sich heraus: &lt;br /&gt;
es müssen lediglich 3 Stecker, 1 LED und 1 Kondensator eingelötet werden. &lt;br /&gt;
Arbeitsaufwand weniger als 10 Minuten und nur wer wirklich keinen Lötkolben hat oder irgendwie darauf zugreifen kann, sollte die 10€ mehr investieren. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Was wird geliefert? ==&lt;br /&gt;
[[Bild:Übersicht_USB-i2c_intervace_.JPG|thumb|Übersicht der mitgelieferten Teile]]&lt;br /&gt;
*1 Platine &lt;br /&gt;
*1 Gehäuse + Schrauben&lt;br /&gt;
*3 Stecker &lt;br /&gt;
*1 LED &lt;br /&gt;
*1 Kondensator &lt;br /&gt;
*3 Anschlusskabel mit einseitig Stecker &lt;br /&gt;
*1 USB - USB-B Kabel  &lt;br /&gt;
&lt;br /&gt;
Positiv: Das USB Kabel ist sehr lang, was heute nicht mehr selbstverständlich ist. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Inbetriebnahme ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nach dem löten, muss von der ELV Seite ein passender Windows / Mac / Linux Treiber geladen werden. Alle Betriebsysteme werden untersützt. Ebenfalls positiv! &lt;br /&gt;
Wird das Device über USB angeschlossen, findet Windows (nur damit wurde es getestet) die neue Hardware automatisch und verknüpft sie mit den Treibern. &lt;br /&gt;
In den Hardware einstellungen wird der COMx Port auf folgende Werte eingestellt: &lt;br /&gt;
&lt;br /&gt;
::- 115.200 bit/s &lt;br /&gt;
::- 8 Datenbits&lt;br /&gt;
::- 1 Stoppbit&lt;br /&gt;
::- kein Parität&lt;br /&gt;
::- keine Flusssteuerung &lt;br /&gt;
&lt;br /&gt;
Mit dem praktischen, kostenlosen Programm HTerm kann die Kommunikation zwischen PC und USB-[[I2C]] Device hergestellt werden. Auch hier werden die oben genannten Werte eingetragen. &lt;br /&gt;
&lt;br /&gt;
[[Bild:HTerm-USB-i2c_intervace_.jpg|thumb|Einstellungen für HTerm und Befehle]]&lt;br /&gt;
&lt;br /&gt;
Die Befehle können über die Eingabeleiste an das Device geschickt werden. Im Test war ein i2c fähiges Display angeschlossen. &lt;br /&gt;
Erklährung für den ersten Befehle (steht auch in der Anleitung) wobei zu unterscheiden ist ob es sich um einen Device spezifischen Befehl handelt oder um einen Steuerbefehl für das Display.  &lt;br /&gt;
&lt;br /&gt;
S28 05 W 01 0D P &lt;br /&gt;
&lt;br /&gt;
Erklärung: &lt;br /&gt;
*'''S''' - Start  &lt;br /&gt;
*28 - Adresse des Displays als Hexzahl &lt;br /&gt;
*'''05''' - Steuerbefehl &lt;br /&gt;
*'''W''' - Schreiben (lesen wäre R) &lt;br /&gt;
*01 - Steuerbefehl Display&lt;br /&gt;
*0D - Courser blinken &lt;br /&gt;
*'''p'''&lt;br /&gt;
&lt;br /&gt;
Noch ein weiteres Beispiel um die Struktur der Befehlseingabe zu verdeutlichen: &lt;br /&gt;
&lt;br /&gt;
S28 05 W 48 65 6C 6C 6F P &lt;br /&gt;
&lt;br /&gt;
Erklärung: &lt;br /&gt;
&lt;br /&gt;
*'''S''' - Start  &lt;br /&gt;
*28 - Adresse des Displays als Hexzahl &lt;br /&gt;
*'''05''' - Steuerbefehl &lt;br /&gt;
*'''W''' - Schreiben (lesen wäre R) &lt;br /&gt;
*00 - Display schreiben &lt;br /&gt;
*48 - &amp;quot;H&amp;quot;&lt;br /&gt;
*65 - &amp;quot;a&amp;quot;&lt;br /&gt;
*6C - &amp;quot;l&amp;quot;&lt;br /&gt;
*6C - &amp;quot;l&amp;quot;&lt;br /&gt;
*6F - &amp;quot;o&amp;quot;&lt;br /&gt;
*'''p'''&lt;br /&gt;
&lt;br /&gt;
(Die Display Befehle sind im Datenblatt des entsprechenden Bauteils zu finden) &lt;br /&gt;
Wer sich ein entsprechendes Textfile schreibt kann ganze Befehlsketten an ein beliebiges Device übertragen. &lt;br /&gt;
&lt;br /&gt;
So sieht das Ergebniss der 3 Befehle auf dem Display aus: &lt;br /&gt;
&lt;br /&gt;
[[Bild:Ergebnis_USB-i2c_intervace_.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== FAZIT ==&lt;br /&gt;
 &lt;br /&gt;
Praktisches, kleines Device um schnell ein paar [[I2C]] Bausteine direkt über den PC anzusteuern. Gerade für alle die normalerweise dem µC diese Aufgabe überlassen, mit seinen i2c slaves zu sprechen, kann mit dem Device getestet werden ob der Baustein überhaupt funktioniert.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Elektronik]]&lt;/div&gt;</summary>
		<author><name>HannoHupmann</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Datei:%C3%9Cbersicht_USB-i2c_intervace_.JPG&amp;diff=21380</id>
		<title>Datei:Übersicht USB-i2c intervace .JPG</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Datei:%C3%9Cbersicht_USB-i2c_intervace_.JPG&amp;diff=21380"/>
				<updated>2012-10-21T18:19:32Z</updated>
		
		<summary type="html">&lt;p&gt;HannoHupmann: Mitgeliefert beim USB-i2c Interface von ELV&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mitgeliefert beim USB-i2c Interface von ELV&lt;/div&gt;</summary>
		<author><name>HannoHupmann</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Datei:%C3%9Cbersicht.jpg&amp;diff=21379</id>
		<title>Datei:Übersicht.jpg</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Datei:%C3%9Cbersicht.jpg&amp;diff=21379"/>
				<updated>2012-10-21T18:18:26Z</updated>
		
		<summary type="html">&lt;p&gt;HannoHupmann: Mitgeliefert beim USB-i2c Interface von ELV&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mitgeliefert beim USB-i2c Interface von ELV&lt;/div&gt;</summary>
		<author><name>HannoHupmann</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=I2C_USB_PC_Adapter&amp;diff=21378</id>
		<title>I2C USB PC Adapter</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=I2C_USB_PC_Adapter&amp;diff=21378"/>
				<updated>2012-10-21T18:15:19Z</updated>
		
		<summary type="html">&lt;p&gt;HannoHupmann: I2C - PC-Adapter&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== I2C - PC-Adapter ==&lt;br /&gt;
&lt;br /&gt;
Von ELV gibt es ein kostengünstiges USB - [[I2C]] Interface &lt;br /&gt;
&lt;br /&gt;
[http://www.elv.de/usb-i2c-interface-komplettbausatz-inkl-gehaeuse-bearbeitet-und-bedruckt-usb-kabel-3-anschlusskabel.html Produktbeschreibung]&lt;br /&gt;
&lt;br /&gt;
{|{{Blaueschmaltabelle}}&lt;br /&gt;
|Mit dem USB-[[I2C]]-Interface kann von einem PC aus via USB mit einfachsten Befehlen direkt auf die am I2C-Bus angeschlossenen Geräte oder Bausteine zugegriffen werden.&lt;br /&gt;
&lt;br /&gt;
Durch die integrierte Makrofunktion können Anweisungsfolgen gespeichert werden, die anschließend selbstständig ablaufen. Dadurch kann das Interface z. B. mit nur einem zusätzlichen IC als Datenlogger für analoge/digitale Signale (PCF8591/8574), Temperaturen (LM75) usw. verwendet werden. Durch eine Reihe flexibler Befehle können bis zu 128 Geräte angesprochen/gesteuert werden.&lt;br /&gt;
&lt;br /&gt;
Dies kann im einfachsten Fall über ein normales Terminalprogramm, aber auch aus einer eigenen Anwendung heraus erfolgen. Alle Algorithmen und Befehle sind in der Dokumentation ausführlich inkl. Anwendungsbeispielen beschrieben.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es gibt zwei Versionen: &lt;br /&gt;
*1) fertig aufgebaut 34,95€&lt;br /&gt;
*2) zum selber löten 24,95€&lt;br /&gt;
&lt;br /&gt;
Im Preis unterscheiden sich die beiden Version um 10€ und es stellt sich die Frage ob es sich lohnt. Gestest wurde die Variante zum selbst aufbauen. Nach dem Auspacken stellt sich heraus: &lt;br /&gt;
es müssen lediglich 3 Stecker, 1 LED und 1 Kondensator eingelötet werden. &lt;br /&gt;
Arbeitsaufwand weniger als 10 Minuten und nur wer wirklich keinen Lötkolben hat oder irgendwie darauf zugreifen kann, sollte die 10€ mehr investieren. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Was wird geliefert? ==&lt;br /&gt;
&lt;br /&gt;
*1 Platine &lt;br /&gt;
*1 Gehäuse + Schrauben&lt;br /&gt;
*3 Stecker &lt;br /&gt;
*1 LED &lt;br /&gt;
*1 Kondensator &lt;br /&gt;
*3 Anschlusskabel mit einseitig Stecker &lt;br /&gt;
*1 USB - USB-B Kabel  &lt;br /&gt;
&lt;br /&gt;
Positiv: Das USB Kabel ist sehr lang, was heute nicht mehr selbstverständlich ist. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Inbetriebnahme ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nach dem löten, muss von der ELV Seite ein passender Windows / Mac / Linux Treiber geladen werden. Alle Betriebsysteme werden untersützt. Ebenfalls positiv! &lt;br /&gt;
Wird das Device über USB angeschlossen, findet Windows (nur damit wurde es getestet) die neue Hardware automatisch und verknüpft sie mit den Treibern. &lt;br /&gt;
In den Hardware einstellungen wird der COMx Port auf folgende Werte eingestellt: &lt;br /&gt;
&lt;br /&gt;
::- 115.200 bit/s &lt;br /&gt;
::- 8 Datenbits&lt;br /&gt;
::- 1 Stoppbit&lt;br /&gt;
::- kein Parität&lt;br /&gt;
::- keine Flusssteuerung &lt;br /&gt;
&lt;br /&gt;
Mit dem praktischen, kostenlosen Programm HTerm kann die Kommunikation zwischen PC und USB-[[I2C]] Device hergestellt werden. Auch hier werden die oben genannten Werte eingetragen. &lt;br /&gt;
&lt;br /&gt;
BILD &lt;br /&gt;
&lt;br /&gt;
Die Befehle können über die Eingabeleiste an das Device geschickt werden. Im Test war ein i2c fähiges Display angeschlossen. &lt;br /&gt;
Erklährung für den ersten Befehle (steht auch in der Anleitung) wobei zu unterscheiden ist ob es sich um einen Device spezifischen Befehl handelt oder um einen Steuerbefehl für das Display.  &lt;br /&gt;
&lt;br /&gt;
S28 05 W 01 0D P &lt;br /&gt;
&lt;br /&gt;
Erklärung: &lt;br /&gt;
*'''S''' - Start  &lt;br /&gt;
*28 - Adresse des Displays als Hexzahl &lt;br /&gt;
*'''05''' - Steuerbefehl &lt;br /&gt;
*'''W''' - Schreiben (lesen wäre R) &lt;br /&gt;
*01 - Steuerbefehl Display&lt;br /&gt;
*0D - Courser blinken &lt;br /&gt;
*'''p'''&lt;br /&gt;
&lt;br /&gt;
Noch ein weiteres Beispiel um die Struktur der Befehlseingabe zu verdeutlichen: &lt;br /&gt;
&lt;br /&gt;
S28 05 W 48 65 6C 6C 6F P &lt;br /&gt;
&lt;br /&gt;
Erklärung: &lt;br /&gt;
&lt;br /&gt;
*'''S''' - Start  &lt;br /&gt;
*28 - Adresse des Displays als Hexzahl &lt;br /&gt;
*'''05''' - Steuerbefehl &lt;br /&gt;
*'''W''' - Schreiben (lesen wäre R) &lt;br /&gt;
*00 - Display schreiben &lt;br /&gt;
*48 - &amp;quot;H&amp;quot;&lt;br /&gt;
*65 - &amp;quot;a&amp;quot;&lt;br /&gt;
*6C - &amp;quot;l&amp;quot;&lt;br /&gt;
*6C - &amp;quot;l&amp;quot;&lt;br /&gt;
*6F - &amp;quot;o&amp;quot;&lt;br /&gt;
*'''p'''&lt;br /&gt;
&lt;br /&gt;
(Die Display Befehle sind im Datenblatt des entsprechenden Bauteils zu finden) &lt;br /&gt;
Wer sich ein entsprechendes Textfile schreibt kann ganze Befehlsketten an ein beliebiges Device übertragen. &lt;br /&gt;
&lt;br /&gt;
So sieht das Ergebniss der 3 Befehle auf dem Display aus: &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== FAZIT ==&lt;br /&gt;
 &lt;br /&gt;
Praktisches, kleines Device um schnell ein paar [[I2C]] Bausteine direkt über den PC anzusteuern. Gerade für alle die normalerweise dem µC diese Aufgabe überlassen, mit seinen i2c slaves zu sprechen, kann mit dem Device getestet werden ob der Baustein überhaupt funktioniert.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Elektronik]]&lt;/div&gt;</summary>
		<author><name>HannoHupmann</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Wanderkiste&amp;diff=16620</id>
		<title>Wanderkiste</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Wanderkiste&amp;diff=16620"/>
				<updated>2010-05-13T08:34:55Z</updated>
		
		<summary type="html">&lt;p&gt;HannoHupmann: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Entstanden auf Grund verschiedener Anregungen im Internet. Jeder Bastler besitzt Bauteile, die er selbst nicht braucht. Zum Wegwerfen zu schade - aber von möglichem Nutzen für andere Bastler.&lt;br /&gt;
&lt;br /&gt;
==Die Idee / Das Konzept:==&lt;br /&gt;
*Es wird eine Kiste mit Dingen befüllt, die man nicht mehr braucht oder von denen man zu viel hat.&amp;lt;br /&amp;gt;Danach wird die Kiste an einen Interessenten weitergeben / verschickt.&amp;lt;br /&amp;gt;Dieser kann sich dann Dinge, die hineingelegt wurden, aussuchen und danach auch wieder neue Sachen rein legen.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Interessenten tragen sich in eine Liste ein, aber dazu später mehr.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Für alles, was man sich aus der Kiste heraus nimmt,&amp;lt;br /&amp;gt;legt man etwas gleichwertig nützliches wieder hinein.&amp;lt;br /&amp;gt;Wobei hier nicht der finanzielle Wert im Vordergrund stehen soll,&amp;lt;br /&amp;gt;sondern der Nutzen bzw. die Freude, die ein Empfänger daran haben könnte.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Hierbei ist es wichtig, fair zu bleiben, d.h. nehmt nur das raus, was ihr auch brauchen könnt.&amp;lt;br /&amp;gt;Wenn ihr etwas wertvolleres herausnehmt, dann legt auch etwas wertvolleres wieder rein,&amp;lt;br /&amp;gt;sonst ist die Kiste nach ein paar Stationen schon wieder leer bzw. mit irgendwelchem Schrott gefüllt, und dass will keiner von uns.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Die Regeln (Kurzversion)==&lt;br /&gt;
* Nimmt man etwas aus der Kiste, so sollte man auch etwas hinein legen, das vergleichbaren Wert hat - nicht unbedingt finanziell, sondern von möglichem Nutzen für Andere.  &lt;br /&gt;
* Keinen Schrott in die Kiste legen (wie durchgebrannte Baugruppen, gebrochene Displays etc). Bei defekten Platinen, wenn möglich, die Art des Schadens angeben.&lt;br /&gt;
* Keine PC-Bauteile hineinlegen. Die machen eine Kiste schnell extrem schwer.&lt;br /&gt;
* Kiste, wenn irgend möglich, nicht länger als eine Woche behalten.&lt;br /&gt;
* Versand bitte nur als Paket (versichert) mit Hermes oder DHL.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Regeln (Ausführlich) ==&lt;br /&gt;
&lt;br /&gt;
===Wiki-Eintrag===&lt;br /&gt;
Jeder, der die Kiste bekommt, also jede Station, muss einen Eintrag hier in diesem Wiki-Artikel hinterlassen.&amp;lt;br /&amp;gt;&lt;br /&gt;
Darin enthalten sollte sein:&amp;lt;br /&amp;gt;&lt;br /&gt;
    * Ein Bild des Zustandes beim Empfang der Kiste&lt;br /&gt;
    * Datum bei Erhalt der Kiste&lt;br /&gt;
    * Was herausgenommen wurde&lt;br /&gt;
    * Was hineingelegt wurde&lt;br /&gt;
    * Ein Bild der Kiste bei Auslieferung&lt;br /&gt;
    * Datum bei Versand der Kiste&lt;br /&gt;
&lt;br /&gt;
===Die Empfänger / Der Versandt ===&lt;br /&gt;
* Aus der im Wiki veröffentlichten Liste kann man sich einen neuen Empfänger heraussuchen &amp;lt;br /&amp;gt;(wenn möglich nach der Reihenfolge gehen, der neue Empfänger sollte aber die Kiste noch nicht erhalten haben) Mit diesem tritt man zuallererst in Kontakt, dass er sich auf den Empfang der Kiste vorbereiten kann und nicht z.B. im Urlaub ist.&lt;br /&gt;
* Der neue Empfänger sollte, wenn möglich, diese Kiste noch nicht gehabt haben.&lt;br /&gt;
* Bitte die Adressaufkleber auf der Kiste komplett entfernen, sonst könnte es Probleme geben.&lt;br /&gt;
* Wenn die Kiste langsam kaputt geht, kann diese gerne ersetzt werden.&lt;br /&gt;
* Die Kiste immer als versichertes Paket versenden (wegen Trackingnummer).&lt;br /&gt;
* Die Kiste darf nur innerhalb Deutschlands versendet werden.&lt;br /&gt;
* Es ist natürlich auch möglich die Kiste persönlich weiter zu geben!&lt;br /&gt;
* Die Kiste sollte nach spätestens einer Woche weiter geschickt werden.&lt;br /&gt;
&lt;br /&gt;
===Versandinfo===&lt;br /&gt;
* [https://privatpaketservice.hlg.de/wps/portal/PRIPS_DEU/PREISE Hermes]: 4-9 Euro (abhängig von Größe); Versichert; Bis 25kg. Abgabe an [http://customer3.map24.com/hermes/?lang=de-DE Paketshops] oder Abholung von Zuhause (dann etwas teurer).&lt;br /&gt;
&lt;br /&gt;
* [http://www.dhl.de/de/paket/privatkunden/preisuebersicht.html DHL]: 3-13 Euro (abhängig von Größe und Gewicht). Versichert.&lt;br /&gt;
&lt;br /&gt;
===Das Log-Büchlein===&lt;br /&gt;
In der Kiste liegt ein kleines Buch. Dies ist das Logbuch, d.h. hier wird der Lebenslauf der Kiste beschrieben.&amp;lt;br /&amp;gt;&lt;br /&gt;
Hier tragt ihr auch folgendes ein:&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    * Datum bei Erhalt&lt;br /&gt;
    * Was herausgenommen wurde&lt;br /&gt;
    * Was hineingelegt wurde&lt;br /&gt;
    * Datum bei Versand&lt;br /&gt;
    * Neuer Empfänger&lt;br /&gt;
&lt;br /&gt;
===Persönliche Briefe===&lt;br /&gt;
Natürlich dürfen für den nächsten Empfänger auch persönliche Briefe etc. mitgeschickt werden.&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Was darf rein, was nicht?==&lt;br /&gt;
===Rein darf===&lt;br /&gt;
    * Da wir hier im Roboternetz sind, darf natürlich alles rein, was mit Robotern zu tun hat,&lt;br /&gt;
      also sowohl Elektronisches wie auch mechanische Bauteile.&lt;br /&gt;
    * CDs, DVDs.&lt;br /&gt;
    * Funktionierender Technikkram (Keine veraltete PC Hardware).&lt;br /&gt;
    * Bücher (Keine veralteten Zeitschriften).&lt;br /&gt;
    * Werkzeug aller Art (nur Funktionierendes).&lt;br /&gt;
    * Spiele (PC &amp;amp; Gesellschaftsspiele).&lt;br /&gt;
    * Sonstiges Brauchbares.&lt;br /&gt;
    * Über gut verpackte Süßigkeiten freut sich der nächste bestimmt (Gummibärchen etc...).&lt;br /&gt;
&lt;br /&gt;
===Was nicht rein darf===&lt;br /&gt;
    * Unbrauchbarer Krempel.&lt;br /&gt;
    * Defekte, durchgebrannte, kaputte Bauteile.&lt;br /&gt;
    * Veraltete Zeitschriften / PC Hardware etc.&lt;br /&gt;
    * Zerbrechliche Sachen und Flüssigkeiten (bzw. Tassen oder Gläser gut verpacken!).&lt;br /&gt;
&lt;br /&gt;
===Bestückung der Kiste===&lt;br /&gt;
* Bei Entnahme einer Sache mit möglichst einer gleichwertigen Sache befüllen.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Die Kiste ist zu voll, was nun?==&lt;br /&gt;
* Ist die Kiste zu voll, sollte zuerst unnützer Schrott aussortiert werden. (Bitte auch im Wikibeitrag vermerken)&lt;br /&gt;
* Sollte die Kiste immer noch zu voll sein, dann sollte man die Kiste splitten.&lt;br /&gt;
#Ein neuer Karton muss her.&lt;br /&gt;
#Der Inhalt wird gleichmäßig aufgeteilt (etwa gleicher Wert, nicht die gleichen Sachen, sonst ist´s doof).&lt;br /&gt;
#Ein neues Büchlein ist Pflicht.&lt;br /&gt;
##Das Alte Büchlein komplett übertragen (nur Namen &amp;amp; Datum).&lt;br /&gt;
#Einer der entstehenden Kisten einen eigenen Namen geben.&lt;br /&gt;
#Der zweiten Kiste den Namen der aufgespaltenen Kiste geben und passenden Suffix dranhängen &amp;lt;br/&amp;gt;(z.B. nicht mehr ''Kistenname'', sondern ''Kistenname2'').&lt;br /&gt;
# Bitte an zwei verschiedene Empfänger verschicken.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Die Liste ==&lt;br /&gt;
'''Wanderkiste Interessenten Liste'''&lt;br /&gt;
Du willst auch mal eine Wanderkiste erhalten?&amp;lt;br /&amp;gt;&lt;br /&gt;
Dann schreibe doch hier folgende Dinge als Infos:&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- Deine Wünsche&amp;lt;br /&amp;gt;&lt;br /&gt;
- Wenn du willst: Was hast du zu bieten?&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
{{FarbigerRahmen|&lt;br /&gt;
Aus datenschutzrechtlichen Gründen und deinem eigenen Interesse bitte keine Adresse hier hin schreiben.&amp;lt;br /&amp;gt;&lt;br /&gt;
Kontakt kann über das Forum, das Nachrichtenmodul oder per Mail aufgenommen werden!&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier trägt sich jeder ein, der mitmachen möchte...&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&amp;quot;&lt;br /&gt;
|+ '''Interessenliste'''&lt;br /&gt;
|-&lt;br /&gt;
| '''Erhalten am (''Kiste'')'''|| '''Kontakt - Forum''' || '''Kontakt - RN-Wissen''' || '''Wünsche''' || '''zu Bieten''' || '''Sonstiges'''&lt;br /&gt;
|-&lt;br /&gt;
| '''11.11.2011''' (''Beispielkiste'') || [http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=ID Profilname] || [http://www.rn-wissen.de/index.php/Benutzer:Profilname Profilname] || Ich wünsche Mikrocontroller, Bauteile, CDs, DVDs || Ich biete einige seltene Bauteile z.B. ... || Hier z.B. eintragen ob eine Kiste gesplittet wurde&lt;br /&gt;
|-&lt;br /&gt;
|  || [http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=35267 Yaro] || [http://www.rn-wissen.de/index.php/Benutzer:Yaro Yaro] || Ungewöhnliche Sensoren, Mechanische Bauteile || Standardbauteile, Motoren, Zahnarzt-Bohrer || '''Sputnik erstellt am: 15.03.2010'''&lt;br /&gt;
|-&lt;br /&gt;
| '''18.03.2010''' (''Sputnik'') || [http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=36199 Williwilli] || [http://www.rn-wissen.de/index.php/Benutzer:Williwilli Williwilli] ||  ||  ||&lt;br /&gt;
|-&lt;br /&gt;
| '''25.03.2010''' (''Sputnik'') || [http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=42535 fUnK3r] || [http://www.rn-wissen.de/index.php/Benutzer:FUnK3r fUnK3r] || Natürlich alles mögliche an elektronischen Bauteilen und alles mögliche was mit Casemodding zu tun hat, außerdem gerne auch was Süßes und gute Bücher/DVD usw.|| Bauteile, Edelstahl Kabeldurchführungen, Schlauchverbinder, diverses anderes Kleinzeug ||&lt;br /&gt;
|-&lt;br /&gt;
| '''08.04.2010''' (''Sputnik'') || [http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=33426h Max Hinze] || [http://www.rn-wissen.de/index.php/Benutzer:Max_Hinze Max Hinze] || alles mögliche || Kleinzeugs, Platinen.etc. ||&lt;br /&gt;
|-&lt;br /&gt;
| '''15.04.2010''' (''Sputnik'')  || [http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=38729 Thund3r] || [http://www.rn-wissen.de/index.php/Benutzer:Thund3r Thund3r] || elektronische und mechanische Bauteile, Servos, Werkzeuge, Sensoren, Motoren Pfostenstecker o.ä.|| Werkzeug, LEDs, Bauteile, mechanische Komponenten etc. || &lt;br /&gt;
|-&lt;br /&gt;
| '''4.05.2010''' (''Sputnik'')|| [http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=16367 HannoHupmann] || [http://www.rn-wissen.de/index.php/Benutzer:HannoHupmann HannoHupmann] || || Servos, Displays, Bauteile, Diverses ||&lt;br /&gt;
|-&lt;br /&gt;
|  || [http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=40635 DeVlinder] || [http://www.rn-wissen.de/index.php/Benutzer:DeVlinder DeVlinder] || || Standardbauteile, H-Brücken-ICs (SMD), Stecker-/Buchsenleisten, Beschleunigungssensor ||&lt;br /&gt;
|-&lt;br /&gt;
|  || [http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=41246 asurofreak.] || [http://www.rn-wissen.de/index.php/Benutzer:Asurofreak. asurofreak.] || µC´s, Bauteile(helle LED´s),Servos,Robo Control 168... || Netzteile, Bauteile aller Art, Kabel, CDs, Solarpanels, ... ||&lt;br /&gt;
|-&lt;br /&gt;
|  || [http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=44703 Alex.] || [http://www.rn-wissen.de/index.php/Benutzer:MrRoboStriker MrRoboStriker.] || Sensoren,Servos,Bücher, alles mögliche... || Motoren,Potis,Stiftleisten =)tüten Alles mögliche... || Foren Name mit je einem unter und senkrecht Strich vorne und hinten!&lt;br /&gt;
|-&lt;br /&gt;
|  || [http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=37645 tobi.robotz] || [http://www.rn-wissen.de/index.php/Benutzer:Haurucki haurucki] ||Sensoren, Servos, Werkzeug, alles ||AD-Wandler mit LCD Display, LCD-Displays mit Steuer-IC, Motoren, Zugmagnet, Vakuumpumpe, und mehr. ||&lt;br /&gt;
|-&lt;br /&gt;
|  || [http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=42295 Martinius11] || [http://www.rn-wissen.de/index.php/Benutzer:Martinius Martinius] || LEDs, Servos, Thyristoren, Flachbandkabel || Wiederstände, alle möglichen Bauteile, Metallplaten, defekten Asuro(Platine Kaput Bauteile OK) || Bitte vor schicken informieren!&lt;br /&gt;
|-&lt;br /&gt;
|  || [...] || [...] || || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Kiste '''Sputnik''' ==&lt;br /&gt;
=== Der Weg ===&lt;br /&gt;
* '''''[http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=35267 Yaro]''''' geschickt an '''''[http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=36199 Williwilli]''''' am '''''15.03.2010'''''&lt;br /&gt;
* '''''[http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=36199 Williwilli]''''' Kiste erhalten am '''''18.03.2010'''''&lt;br /&gt;
* '''''[http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=36199 Williwilli]''''' geschickt an '''''[http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=42535 fUnK3r]''''' am '''''24.03.2010'''''&lt;br /&gt;
* '''''[http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=42535 fUnK3r]''''' Kiste erhalten am '''''25.03.2010'''''&lt;br /&gt;
* '''''[http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=42535 fUnK3r]''''' geschickt an '''''[http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=33426h Max Hinze]''''' am '''''06.04.2010'''''&lt;br /&gt;
* '''''[http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=33426h Max Hinze]''''' Kiste erhalten am '''''08.04.2010'''''&lt;br /&gt;
* '''''[http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=33426h Max Hinze]''''' geschickt an '''''[http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=38729 Thund3r]''''' am '''''14.04.2010'''''&lt;br /&gt;
* '''''[http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=38729 Thund3r]''''' Kiste erhalten am '''''15.04.2010'''''&lt;br /&gt;
&lt;br /&gt;
[[Bild:Karte_Deutschland_Wanderkiste.JPG]]&lt;br /&gt;
&lt;br /&gt;
=== Online Logbuch ===&lt;br /&gt;
    * Foto beim Öffnen der Kiste&lt;br /&gt;
    * Was herausgenommen wurde&lt;br /&gt;
    * Was hineingelegt wurde&lt;br /&gt;
    * Ein Bild der Kiste bei Auslieferung&lt;br /&gt;
    * Datum bei Versand der Kiste&lt;br /&gt;
&lt;br /&gt;
''Williwilli''&lt;br /&gt;
Foto beim Öffnen der Kiste am 19.03.2010&amp;lt;br/&amp;gt;[[Bild:Wanderkiste.JPG]]&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Foto beim Versand der Kiste am 24.03.2010&amp;lt;br/&amp;gt;[[Bild:Wanderkiste1.JPG]]&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
''fUnK3r''&lt;br /&gt;
Foto beim Empfang der Kiste am 25.03.2010&amp;lt;br/&amp;gt;[[Bild:Wanderkiste_erhalten.JPG]]&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Foto beim Öffnen der Kiste am 25.03.2010&amp;lt;br/&amp;gt;[[Bild:Wanderkiste_inhalt.jpg]]&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Foto von der neuen Box in der Kiste am 01.04.2010&amp;lt;br/&amp;gt;[[Bild:Wanderkiste_neue_box.jpg]]&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Foto vom Inhalt der Kiste am 02.04.2010&amp;lt;br/&amp;gt;[[Bild:Wanderkiste_versandt.jpg]]&amp;lt;br/&amp;gt;&lt;br /&gt;
Auf der Seite liegend das Logbuch und das perfekte Füllmaterial, damit die Kiste keinen Schaden mehr nimmt.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Max Hinze Foto beim Öffnen der Kiste am 08.04.2010&amp;lt;br/&amp;gt;[[Bild:Wanderkiste-öffnen.JPG]]&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Thund3r Foto beim Öffnen der Kiste am 14.04.2010&amp;lt;br/&amp;gt;  [[Bild:Aaa.JPG]]&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Thund3r Foto vom Inhalt der Kiste &amp;lt;br/&amp;gt; [[Bild:Bbb.JPG]]&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Herausgenommen:'''&lt;br /&gt;
 * Williwilli&lt;br /&gt;
    * 3 St. NE567&lt;br /&gt;
    * 2 St 100nF HF-Kondensatoren&lt;br /&gt;
    * 8 St. Taster&lt;br /&gt;
    * 5 St. IRF520&lt;br /&gt;
    * 1 St. Zahnarztbohrer&lt;br /&gt;
    * 2 St. Laborkabel&lt;br /&gt;
&lt;br /&gt;
 * fUnK3r&lt;br /&gt;
    * 3   St. EPROM&lt;br /&gt;
    * 100 St. LEDs 5mm&lt;br /&gt;
    * 1   St. Zahnarztbohrer&lt;br /&gt;
    * 1   St. Platine mit Tastern &amp;amp; LEDs&lt;br /&gt;
    * 2   St. PTC&lt;br /&gt;
&lt;br /&gt;
 * Max Hinze&lt;br /&gt;
    * 4   St. Gehäusefüße&lt;br /&gt;
    * 2   St. 7- Segmentanzeigen&lt;br /&gt;
    * 2   St. Schiebeschalter&lt;br /&gt;
    * 2   St. Endtaster&lt;br /&gt;
    * 1   St. Taster&lt;br /&gt;
    * 1   St. Zahnarztbohrer&lt;br /&gt;
    * 3   St. Buchsenleisten&lt;br /&gt;
    * 1   St. 9-Pol D-Sub Buchse&lt;br /&gt;
&lt;br /&gt;
 * Thund3r&lt;br /&gt;
    * 4   St. Schiebeschalter&lt;br /&gt;
    * 8   St. Abstanzbolzen&lt;br /&gt;
    * 1   St. 8 pol. Flachbandkabe&lt;br /&gt;
    * 2   St. 7-Segmentanzeigen&lt;br /&gt;
    * 75  St. 3mm LEDs&lt;br /&gt;
    * 1   St. kleiner Motor&lt;br /&gt;
    * 2   St. IEC 60384&lt;br /&gt;
    * 1   St. 9A473g&lt;br /&gt;
    * 1   St. Tischtennisball&lt;br /&gt;
    * 6   St. Beutel&lt;br /&gt;
    * 1   St. Staubsaugmotor&lt;br /&gt;
&lt;br /&gt;
* HannoHupmann&lt;br /&gt;
    * 3   St. Gummibärchen &lt;br /&gt;
    * 4   St. Abstanzbolzen&lt;br /&gt;
    * 1   St. kleiner Motor&lt;br /&gt;
    * 1   St. LCD Display&lt;br /&gt;
    * 1   St. Gummiball (für meine Katze) &lt;br /&gt;
    * 2   St. Verpackungsboxen&lt;br /&gt;
    * 1   St. Piezosummer (groß)    &lt;br /&gt;
    * 1   St. DVD &lt;br /&gt;
    * Teil der Stopmuttern &lt;br /&gt;
    * 2   St. On/Off Schilder&lt;br /&gt;
    * 4   St. Gehäusefüße &lt;br /&gt;
&lt;br /&gt;
'''Hineingelegt:'''&lt;br /&gt;
 * Williwilli&lt;br /&gt;
    * 3 Taster, 1 Schalter&lt;br /&gt;
    * 25pol D-Sub-Stecker, Lötanschluß&lt;br /&gt;
    * 6 EPROMs&lt;br /&gt;
    * diverse SMD-ICs&lt;br /&gt;
    * 100 LEDs 5mm - 4 Farben&lt;br /&gt;
    * 75 LEDs 3mm - 3 Farben&lt;br /&gt;
    * Steckernetzteil 6,8V DC&lt;br /&gt;
    * 5 dicke PTCs von ITT&lt;br /&gt;
    * 2 Europlatinen einseitig Kupfer (zum Ätzen)&lt;br /&gt;
    * etwas Moosgummi (antistatisch für ICs)&lt;br /&gt;
&lt;br /&gt;
 * fUnK3r&lt;br /&gt;
    * 3 kleine Motoren&lt;br /&gt;
    * 4 7-Segmentanzeigen&lt;br /&gt;
    * 5 Schiebeschalter&lt;br /&gt;
    * 5 SMD Sortimentboxen&lt;br /&gt;
    * 5 blaue Transportboxen&lt;br /&gt;
    * 50 LEDs grün 5mm (Low Current)&lt;br /&gt;
    * 50 LEDs gelb 3mm&lt;br /&gt;
    * 1 Schlüssellampe von Ansmann&lt;br /&gt;
    * 1 240x128 Display (Ich weiß allerdings nicht, obs noch geht)&lt;br /&gt;
    * 2 kleine Rollen Flachbandkabel&lt;br /&gt;
    * 12 Füße für Gehäuse / Platinen&lt;br /&gt;
    * 1 Musik CD&lt;br /&gt;
    * 1 Buch (kein Fachbuch)&lt;br /&gt;
    * 1 kleines Spiel&lt;br /&gt;
    * 4 Endtaster&lt;br /&gt;
    * 2 9-Pol D-Sub (Stecker/Buchse) Flachbandkabelverbindung&lt;br /&gt;
    * 4 ältere große Schalter&lt;br /&gt;
    * 1 Getriebemotor&lt;br /&gt;
    * 3 Buchsenleisten&lt;br /&gt;
    * 1 Gehäuse Anschluss mit Schraubklemme&lt;br /&gt;
    * 12 Abstandsbolzen (bei Interesse das nächste Mal auch mehr)&lt;br /&gt;
    * 10 Kabeldurchführungen (bei Interesse auch mehr)&lt;br /&gt;
    * 20 Schlauchanschlüsse blau (bei Interesse auch mehr)&lt;br /&gt;
    * Außerdem noch eine Sortimentbox '''!!! Wichtig: !!! Diese nicht herausnehmen!!!'''&lt;br /&gt;
&lt;br /&gt;
 * Max Hinze&lt;br /&gt;
    * 100 M3 Stoppmuttern&lt;br /&gt;
    * 6 IRF 540N&lt;br /&gt;
    * 1 Robo 168 Platine&lt;br /&gt;
    * 1 Staubsaugermotor mit Gebläse&lt;br /&gt;
    * 1 serielle Maus&lt;br /&gt;
    * 1 großer Schalter&lt;br /&gt;
    * 10 Schiebeschalter&lt;br /&gt;
    * 3 Endtaster&lt;br /&gt;
    * 1 EEPROM 24C256&lt;br /&gt;
    * 1 ATMega 8 SMD&lt;br /&gt;
    * 1 Kunstoffgehäuse&lt;br /&gt;
    * 15 Wiederverschlißbare Beutel&lt;br /&gt;
&lt;br /&gt;
 * Thund3r&lt;br /&gt;
    * 1 Asuro RS232 Transceiver&lt;br /&gt;
    * 1 9V Batterieclip&lt;br /&gt;
    * 6 Kabelbinder&lt;br /&gt;
    * 1 RS232 Stecker&lt;br /&gt;
    * 1 Monitorstecker (älter)&lt;br /&gt;
    * 1 ATA Kabel&lt;br /&gt;
    * 1 Schlitzschraubenzieher&lt;br /&gt;
    * 3 2,5A Glassicherungen (zB. für den RP6)&lt;br /&gt;
    * 1 Piezo summer (groß)&lt;br /&gt;
    * 2 DVDs (OVP)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 * HannoHupmann&lt;br /&gt;
    * 2 Servos&lt;br /&gt;
    * 1 LCD Display&lt;br /&gt;
    * 1 OLED Display &lt;br /&gt;
    * 1 Nummernfeld &lt;br /&gt;
    * 1 DVD - AI &lt;br /&gt;
    * 2 Kleine Lautsprecher&lt;br /&gt;
    * 2 5x2 Wannensteckerbuchsen&lt;br /&gt;
    * 3 Schrittmotoren&lt;br /&gt;
&lt;br /&gt;
=== Der Inhalt ===&lt;br /&gt;
Hier sollte immer der aktuelle Inhalt der Kiste zu finden sein. Also: entnommene Teile bitte löschen, neue Teile dazu schreiben:&lt;br /&gt;
&lt;br /&gt;
'''* In der Kiste:'''&lt;br /&gt;
     * 1 Tüte mit großen Elkos&lt;br /&gt;
     * 3 Tütchen LEDs&lt;br /&gt;
     * 1 Tütchen PTCs (noch 3 St.)&lt;br /&gt;
     * 2 Schrittmotoren (CD-Laufwerk)&lt;br /&gt;
     * 4 kleine Motoren&lt;br /&gt;
     * 1 Hochstrompoti&lt;br /&gt;
     * 1 Steckernetzteil&lt;br /&gt;
     * 2 Europlatinen einseitig Kupfer (zum Ätzen)&lt;br /&gt;
     * etwas Moosgummi (antistatisch für ICs) ('''Eine Platte ging für die Box drauf''')&lt;br /&gt;
     * ein TT-Ball, ein &amp;quot;Continental&amp;quot;-Flummis&lt;br /&gt;
     * ein paar Meter Doppellitze&lt;br /&gt;
     * Cuttermesser&lt;br /&gt;
     * Bleistifte, Filzstifte, Lineal&lt;br /&gt;
     * 5 SMD Sortimentboxen&lt;br /&gt;
     * 3 blaue Transportboxen&lt;br /&gt;
     * 1 Schlüssellampe von Ansmann&lt;br /&gt;
     * 1 LCD Display blau&lt;br /&gt;
     * 2 kleine Rollen Flachbandkabel&lt;br /&gt;
     * 4 Füße für Gehäuse / Platinen&lt;br /&gt;
     * 1 Musik CD&lt;br /&gt;
     * 1 Buch (kein Fachbuch)&lt;br /&gt;
     * 1 kleines Spiel&lt;br /&gt;
     * 1 Tüte Endtaster&lt;br /&gt;
     * 2 9-Pol D-Sub Stecker Flachbandkabelverbindung&lt;br /&gt;
     * 4 ältere große Schalter&lt;br /&gt;
     * 1 Gehäuse Anschluss mit Schraubklemme&lt;br /&gt;
     * 1 Tüte Kabeldurchführungen (bei Interesse auch mehr)&lt;br /&gt;
     * 1 Tüte Schlauchanschlüsse blau (bei Interesse auch mehr)&lt;br /&gt;
     * 50 M3 Stoppmuttern&lt;br /&gt;
     * 6 IRF 540N&lt;br /&gt;
     * 1 Robo 168 Platine &lt;br /&gt;
     * 1 Staubsaugermotor mit Gebläse&lt;br /&gt;
     * 1 serielle Maus&lt;br /&gt;
     * 1 großer Schalter&lt;br /&gt;
     * 3 Endtaster&lt;br /&gt;
     * 1 Kunstoffgehäuse&lt;br /&gt;
     * 15 Wiederverschließbare Beutel    &lt;br /&gt;
     * '''Außerdem noch eine Sortimentbox !!! Wichtig: !!! Diese nicht herausnehmen!!!'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''* In der Sortimentbox in der Kiste:'''&lt;br /&gt;
     * kleine Elkos &amp;amp; HF-Kondensatoren&lt;br /&gt;
     * 4 FETs IRF520&lt;br /&gt;
     * 1 SRAM 62LV1025-55&lt;br /&gt;
     * 3 NE567&lt;br /&gt;
     * X Logikgatter HEF40xx&lt;br /&gt;
     * 3 EPROMs&lt;br /&gt;
     * X diverse SMD-ICs&lt;br /&gt;
     * X Widerstandsnetzwerke 4k7-9&lt;br /&gt;
     * X Transistoren&lt;br /&gt;
     * X Schalter und Taster&lt;br /&gt;
     * 1 25pol D-Sub-Stecker, Lötanschluss&lt;br /&gt;
     * Drucker-LCD-Display&lt;br /&gt;
     * '''1''' Zahnarztbohrer (es waren 4!!!)&lt;br /&gt;
     * X kleine Mechanikbauteile aus Platik&lt;br /&gt;
     * 4 7-Segmentanzeigen&lt;br /&gt;
     * 1 EEPROM 24C256&lt;br /&gt;
     * ATMega 8 SMD&lt;br /&gt;
&lt;br /&gt;
'''* ... und natürlich das Logbuch'''&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Anmerkungen ==&lt;br /&gt;
Noch Fragen? Anregungen? &amp;lt;br /&amp;gt;&lt;br /&gt;
Bei Bedarf wird hier ergänzt&lt;/div&gt;</summary>
		<author><name>HannoHupmann</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Wanderkiste&amp;diff=16619</id>
		<title>Wanderkiste</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Wanderkiste&amp;diff=16619"/>
				<updated>2010-05-13T08:34:16Z</updated>
		
		<summary type="html">&lt;p&gt;HannoHupmann: /* Der Inhalt */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Entstanden auf Grund verschiedener Anregungen im Internet. Jeder Bastler besitzt Bauteile, die er selbst nicht braucht. Zum Wegwerfen zu schade - aber von möglichem Nutzen für andere Bastler.&lt;br /&gt;
&lt;br /&gt;
==Die Idee / Das Konzept:==&lt;br /&gt;
*Es wird eine Kiste mit Dingen befüllt, die man nicht mehr braucht oder von denen man zu viel hat.&amp;lt;br /&amp;gt;Danach wird die Kiste an einen Interessenten weitergeben / verschickt.&amp;lt;br /&amp;gt;Dieser kann sich dann Dinge, die hineingelegt wurden, aussuchen und danach auch wieder neue Sachen rein legen.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Interessenten tragen sich in eine Liste ein, aber dazu später mehr.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Für alles, was man sich aus der Kiste heraus nimmt,&amp;lt;br /&amp;gt;legt man etwas gleichwertig nützliches wieder hinein.&amp;lt;br /&amp;gt;Wobei hier nicht der finanzielle Wert im Vordergrund stehen soll,&amp;lt;br /&amp;gt;sondern der Nutzen bzw. die Freude, die ein Empfänger daran haben könnte.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Hierbei ist es wichtig, fair zu bleiben, d.h. nehmt nur das raus, was ihr auch brauchen könnt.&amp;lt;br /&amp;gt;Wenn ihr etwas wertvolleres herausnehmt, dann legt auch etwas wertvolleres wieder rein,&amp;lt;br /&amp;gt;sonst ist die Kiste nach ein paar Stationen schon wieder leer bzw. mit irgendwelchem Schrott gefüllt, und dass will keiner von uns.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Die Regeln (Kurzversion)==&lt;br /&gt;
* Nimmt man etwas aus der Kiste, so sollte man auch etwas hinein legen, das vergleichbaren Wert hat - nicht unbedingt finanziell, sondern von möglichem Nutzen für Andere.  &lt;br /&gt;
* Keinen Schrott in die Kiste legen (wie durchgebrannte Baugruppen, gebrochene Displays etc). Bei defekten Platinen, wenn möglich, die Art des Schadens angeben.&lt;br /&gt;
* Keine PC-Bauteile hineinlegen. Die machen eine Kiste schnell extrem schwer.&lt;br /&gt;
* Kiste, wenn irgend möglich, nicht länger als eine Woche behalten.&lt;br /&gt;
* Versand bitte nur als Paket (versichert) mit Hermes oder DHL.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Regeln (Ausführlich) ==&lt;br /&gt;
&lt;br /&gt;
===Wiki-Eintrag===&lt;br /&gt;
Jeder, der die Kiste bekommt, also jede Station, muss einen Eintrag hier in diesem Wiki-Artikel hinterlassen.&amp;lt;br /&amp;gt;&lt;br /&gt;
Darin enthalten sollte sein:&amp;lt;br /&amp;gt;&lt;br /&gt;
    * Ein Bild des Zustandes beim Empfang der Kiste&lt;br /&gt;
    * Datum bei Erhalt der Kiste&lt;br /&gt;
    * Was herausgenommen wurde&lt;br /&gt;
    * Was hineingelegt wurde&lt;br /&gt;
    * Ein Bild der Kiste bei Auslieferung&lt;br /&gt;
    * Datum bei Versand der Kiste&lt;br /&gt;
&lt;br /&gt;
===Die Empfänger / Der Versandt ===&lt;br /&gt;
* Aus der im Wiki veröffentlichten Liste kann man sich einen neuen Empfänger heraussuchen &amp;lt;br /&amp;gt;(wenn möglich nach der Reihenfolge gehen, der neue Empfänger sollte aber die Kiste noch nicht erhalten haben) Mit diesem tritt man zuallererst in Kontakt, dass er sich auf den Empfang der Kiste vorbereiten kann und nicht z.B. im Urlaub ist.&lt;br /&gt;
* Der neue Empfänger sollte, wenn möglich, diese Kiste noch nicht gehabt haben.&lt;br /&gt;
* Bitte die Adressaufkleber auf der Kiste komplett entfernen, sonst könnte es Probleme geben.&lt;br /&gt;
* Wenn die Kiste langsam kaputt geht, kann diese gerne ersetzt werden.&lt;br /&gt;
* Die Kiste immer als versichertes Paket versenden (wegen Trackingnummer).&lt;br /&gt;
* Die Kiste darf nur innerhalb Deutschlands versendet werden.&lt;br /&gt;
* Es ist natürlich auch möglich die Kiste persönlich weiter zu geben!&lt;br /&gt;
* Die Kiste sollte nach spätestens einer Woche weiter geschickt werden.&lt;br /&gt;
&lt;br /&gt;
===Versandinfo===&lt;br /&gt;
* [https://privatpaketservice.hlg.de/wps/portal/PRIPS_DEU/PREISE Hermes]: 4-9 Euro (abhängig von Größe); Versichert; Bis 25kg. Abgabe an [http://customer3.map24.com/hermes/?lang=de-DE Paketshops] oder Abholung von Zuhause (dann etwas teurer).&lt;br /&gt;
&lt;br /&gt;
* [http://www.dhl.de/de/paket/privatkunden/preisuebersicht.html DHL]: 3-13 Euro (abhängig von Größe und Gewicht). Versichert.&lt;br /&gt;
&lt;br /&gt;
===Das Log-Büchlein===&lt;br /&gt;
In der Kiste liegt ein kleines Buch. Dies ist das Logbuch, d.h. hier wird der Lebenslauf der Kiste beschrieben.&amp;lt;br /&amp;gt;&lt;br /&gt;
Hier tragt ihr auch folgendes ein:&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    * Datum bei Erhalt&lt;br /&gt;
    * Was herausgenommen wurde&lt;br /&gt;
    * Was hineingelegt wurde&lt;br /&gt;
    * Datum bei Versand&lt;br /&gt;
    * Neuer Empfänger&lt;br /&gt;
&lt;br /&gt;
===Persönliche Briefe===&lt;br /&gt;
Natürlich dürfen für den nächsten Empfänger auch persönliche Briefe etc. mitgeschickt werden.&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Was darf rein, was nicht?==&lt;br /&gt;
===Rein darf===&lt;br /&gt;
    * Da wir hier im Roboternetz sind, darf natürlich alles rein, was mit Robotern zu tun hat,&lt;br /&gt;
      also sowohl Elektronisches wie auch mechanische Bauteile.&lt;br /&gt;
    * CDs, DVDs.&lt;br /&gt;
    * Funktionierender Technikkram (Keine veraltete PC Hardware).&lt;br /&gt;
    * Bücher (Keine veralteten Zeitschriften).&lt;br /&gt;
    * Werkzeug aller Art (nur Funktionierendes).&lt;br /&gt;
    * Spiele (PC &amp;amp; Gesellschaftsspiele).&lt;br /&gt;
    * Sonstiges Brauchbares.&lt;br /&gt;
    * Über gut verpackte Süßigkeiten freut sich der nächste bestimmt (Gummibärchen etc...).&lt;br /&gt;
&lt;br /&gt;
===Was nicht rein darf===&lt;br /&gt;
    * Unbrauchbarer Krempel.&lt;br /&gt;
    * Defekte, durchgebrannte, kaputte Bauteile.&lt;br /&gt;
    * Veraltete Zeitschriften / PC Hardware etc.&lt;br /&gt;
    * Zerbrechliche Sachen und Flüssigkeiten (bzw. Tassen oder Gläser gut verpacken!).&lt;br /&gt;
&lt;br /&gt;
===Bestückung der Kiste===&lt;br /&gt;
* Bei Entnahme einer Sache mit möglichst einer gleichwertigen Sache befüllen.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Die Kiste ist zu voll, was nun?==&lt;br /&gt;
* Ist die Kiste zu voll, sollte zuerst unnützer Schrott aussortiert werden. (Bitte auch im Wikibeitrag vermerken)&lt;br /&gt;
* Sollte die Kiste immer noch zu voll sein, dann sollte man die Kiste splitten.&lt;br /&gt;
#Ein neuer Karton muss her.&lt;br /&gt;
#Der Inhalt wird gleichmäßig aufgeteilt (etwa gleicher Wert, nicht die gleichen Sachen, sonst ist´s doof).&lt;br /&gt;
#Ein neues Büchlein ist Pflicht.&lt;br /&gt;
##Das Alte Büchlein komplett übertragen (nur Namen &amp;amp; Datum).&lt;br /&gt;
#Einer der entstehenden Kisten einen eigenen Namen geben.&lt;br /&gt;
#Der zweiten Kiste den Namen der aufgespaltenen Kiste geben und passenden Suffix dranhängen &amp;lt;br/&amp;gt;(z.B. nicht mehr ''Kistenname'', sondern ''Kistenname2'').&lt;br /&gt;
# Bitte an zwei verschiedene Empfänger verschicken.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Die Liste ==&lt;br /&gt;
'''Wanderkiste Interessenten Liste'''&lt;br /&gt;
Du willst auch mal eine Wanderkiste erhalten?&amp;lt;br /&amp;gt;&lt;br /&gt;
Dann schreibe doch hier folgende Dinge als Infos:&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- Deine Wünsche&amp;lt;br /&amp;gt;&lt;br /&gt;
- Wenn du willst: Was hast du zu bieten?&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
{{FarbigerRahmen|&lt;br /&gt;
Aus datenschutzrechtlichen Gründen und deinem eigenen Interesse bitte keine Adresse hier hin schreiben.&amp;lt;br /&amp;gt;&lt;br /&gt;
Kontakt kann über das Forum, das Nachrichtenmodul oder per Mail aufgenommen werden!&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier trägt sich jeder ein, der mitmachen möchte...&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&amp;quot;&lt;br /&gt;
|+ '''Interessenliste'''&lt;br /&gt;
|-&lt;br /&gt;
| '''Erhalten am (''Kiste'')'''|| '''Kontakt - Forum''' || '''Kontakt - RN-Wissen''' || '''Wünsche''' || '''zu Bieten''' || '''Sonstiges'''&lt;br /&gt;
|-&lt;br /&gt;
| '''11.11.2011''' (''Beispielkiste'') || [http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=ID Profilname] || [http://www.rn-wissen.de/index.php/Benutzer:Profilname Profilname] || Ich wünsche Mikrocontroller, Bauteile, CDs, DVDs || Ich biete einige seltene Bauteile z.B. ... || Hier z.B. eintragen ob eine Kiste gesplittet wurde&lt;br /&gt;
|-&lt;br /&gt;
|  || [http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=35267 Yaro] || [http://www.rn-wissen.de/index.php/Benutzer:Yaro Yaro] || Ungewöhnliche Sensoren, Mechanische Bauteile || Standardbauteile, Motoren, Zahnarzt-Bohrer || '''Sputnik erstellt am: 15.03.2010'''&lt;br /&gt;
|-&lt;br /&gt;
| '''18.03.2010''' (''Sputnik'') || [http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=36199 Williwilli] || [http://www.rn-wissen.de/index.php/Benutzer:Williwilli Williwilli] ||  ||  ||&lt;br /&gt;
|-&lt;br /&gt;
| '''25.03.2010''' (''Sputnik'') || [http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=42535 fUnK3r] || [http://www.rn-wissen.de/index.php/Benutzer:FUnK3r fUnK3r] || Natürlich alles mögliche an elektronischen Bauteilen und alles mögliche was mit Casemodding zu tun hat, außerdem gerne auch was Süßes und gute Bücher/DVD usw.|| Bauteile, Edelstahl Kabeldurchführungen, Schlauchverbinder, diverses anderes Kleinzeug ||&lt;br /&gt;
|-&lt;br /&gt;
| '''08.04.2010''' (''Sputnik'') || [http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=33426h Max Hinze] || [http://www.rn-wissen.de/index.php/Benutzer:Max_Hinze Max Hinze] || alles mögliche || Kleinzeugs, Platinen.etc. ||&lt;br /&gt;
|-&lt;br /&gt;
| '''15.04.2010''' (''Sputnik'')  || [http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=38729 Thund3r] || [http://www.rn-wissen.de/index.php/Benutzer:Thund3r Thund3r] || elektronische und mechanische Bauteile, Servos, Werkzeuge, Sensoren, Motoren Pfostenstecker o.ä.|| Werkzeug, LEDs, Bauteile, mechanische Komponenten etc. || &lt;br /&gt;
|-&lt;br /&gt;
| '''4.05.2010''' (''Sputnik'')|| [http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=16367 HannoHupmann] || [http://www.rn-wissen.de/index.php/Benutzer:HannoHupmann HannoHupmann] || || Servos, Displays, Bauteile, Diverses ||&lt;br /&gt;
|-&lt;br /&gt;
|  || [http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=40635 DeVlinder] || [http://www.rn-wissen.de/index.php/Benutzer:DeVlinder DeVlinder] || || Standardbauteile, H-Brücken-ICs (SMD), Stecker-/Buchsenleisten, Beschleunigungssensor ||&lt;br /&gt;
|-&lt;br /&gt;
|  || [http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=41246 asurofreak.] || [http://www.rn-wissen.de/index.php/Benutzer:Asurofreak. asurofreak.] || µC´s, Bauteile(helle LED´s),Servos,Robo Control 168... || Netzteile, Bauteile aller Art, Kabel, CDs, Solarpanels, ... ||&lt;br /&gt;
|-&lt;br /&gt;
|  || [http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=44703 Alex.] || [http://www.rn-wissen.de/index.php/Benutzer:MrRoboStriker MrRoboStriker.] || Sensoren,Servos,Bücher, alles mögliche... || Motoren,Potis,Stiftleisten =)tüten Alles mögliche... || Foren Name mit je einem unter und senkrecht Strich vorne und hinten!&lt;br /&gt;
|-&lt;br /&gt;
|  || [http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=37645 tobi.robotz] || [http://www.rn-wissen.de/index.php/Benutzer:Haurucki haurucki] ||Sensoren, Servos, Werkzeug, alles ||AD-Wandler mit LCD Display, LCD-Displays mit Steuer-IC, Motoren, Zugmagnet, Vakuumpumpe, und mehr. ||&lt;br /&gt;
|-&lt;br /&gt;
|  || [http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=42295 Martinius11] || [http://www.rn-wissen.de/index.php/Benutzer:Martinius Martinius] || LEDs, Servos, Thyristoren, Flachbandkabel || Wiederstände, alle möglichen Bauteile, Metallplaten, defekten Asuro(Platine Kaput Bauteile OK) || Bitte vor schicken informieren!&lt;br /&gt;
|-&lt;br /&gt;
|  || [...] || [...] || || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Kiste '''Sputnik''' ==&lt;br /&gt;
=== Der Weg ===&lt;br /&gt;
* '''''[http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=35267 Yaro]''''' geschickt an '''''[http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=36199 Williwilli]''''' am '''''15.03.2010'''''&lt;br /&gt;
* '''''[http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=36199 Williwilli]''''' Kiste erhalten am '''''18.03.2010'''''&lt;br /&gt;
* '''''[http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=36199 Williwilli]''''' geschickt an '''''[http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=42535 fUnK3r]''''' am '''''24.03.2010'''''&lt;br /&gt;
* '''''[http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=42535 fUnK3r]''''' Kiste erhalten am '''''25.03.2010'''''&lt;br /&gt;
* '''''[http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=42535 fUnK3r]''''' geschickt an '''''[http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=33426h Max Hinze]''''' am '''''06.04.2010'''''&lt;br /&gt;
* '''''[http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=33426h Max Hinze]''''' Kiste erhalten am '''''08.04.2010'''''&lt;br /&gt;
* '''''[http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=33426h Max Hinze]''''' geschickt an '''''[http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=38729 Thund3r]''''' am '''''14.04.2010'''''&lt;br /&gt;
* '''''[http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=38729 Thund3r]''''' Kiste erhalten am '''''15.04.2010'''''&lt;br /&gt;
&lt;br /&gt;
[[Bild:Karte_Deutschland_Wanderkiste.JPG]]&lt;br /&gt;
&lt;br /&gt;
=== Online Logbuch ===&lt;br /&gt;
    * Foto beim Öffnen der Kiste&lt;br /&gt;
    * Was herausgenommen wurde&lt;br /&gt;
    * Was hineingelegt wurde&lt;br /&gt;
    * Ein Bild der Kiste bei Auslieferung&lt;br /&gt;
    * Datum bei Versand der Kiste&lt;br /&gt;
&lt;br /&gt;
''Williwilli''&lt;br /&gt;
Foto beim Öffnen der Kiste am 19.03.2010&amp;lt;br/&amp;gt;[[Bild:Wanderkiste.JPG]]&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Foto beim Versand der Kiste am 24.03.2010&amp;lt;br/&amp;gt;[[Bild:Wanderkiste1.JPG]]&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
''fUnK3r''&lt;br /&gt;
Foto beim Empfang der Kiste am 25.03.2010&amp;lt;br/&amp;gt;[[Bild:Wanderkiste_erhalten.JPG]]&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Foto beim Öffnen der Kiste am 25.03.2010&amp;lt;br/&amp;gt;[[Bild:Wanderkiste_inhalt.jpg]]&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Foto von der neuen Box in der Kiste am 01.04.2010&amp;lt;br/&amp;gt;[[Bild:Wanderkiste_neue_box.jpg]]&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Foto vom Inhalt der Kiste am 02.04.2010&amp;lt;br/&amp;gt;[[Bild:Wanderkiste_versandt.jpg]]&amp;lt;br/&amp;gt;&lt;br /&gt;
Auf der Seite liegend das Logbuch und das perfekte Füllmaterial, damit die Kiste keinen Schaden mehr nimmt.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Max Hinze Foto beim Öffnen der Kiste am 08.04.2010&amp;lt;br/&amp;gt;[[Bild:Wanderkiste-öffnen.JPG]]&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Thund3r Foto beim Öffnen der Kiste am 14.04.2010&amp;lt;br/&amp;gt;  [[Bild:Aaa.JPG]]&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Thund3r Foto vom Inhalt der Kiste &amp;lt;br/&amp;gt; [[Bild:Bbb.JPG]]&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Herausgenommen:'''&lt;br /&gt;
 * Williwilli&lt;br /&gt;
    * 3 St. NE567&lt;br /&gt;
    * 2 St 100nF HF-Kondensatoren&lt;br /&gt;
    * 8 St. Taster&lt;br /&gt;
    * 5 St. IRF520&lt;br /&gt;
    * 1 St. Zahnarztbohrer&lt;br /&gt;
    * 2 St. Laborkabel&lt;br /&gt;
&lt;br /&gt;
 * fUnK3r&lt;br /&gt;
    * 3   St. EPROM&lt;br /&gt;
    * 100 St. LEDs 5mm&lt;br /&gt;
    * 1   St. Zahnarztbohrer&lt;br /&gt;
    * 1   St. Platine mit Tastern &amp;amp; LEDs&lt;br /&gt;
    * 2   St. PTC&lt;br /&gt;
&lt;br /&gt;
 * Max Hinze&lt;br /&gt;
    * 4   St. Gehäusefüße&lt;br /&gt;
    * 2   St. 7- Segmentanzeigen&lt;br /&gt;
    * 2   St. Schiebeschalter&lt;br /&gt;
    * 2   St. Endtaster&lt;br /&gt;
    * 1   St. Taster&lt;br /&gt;
    * 1   St. Zahnarztbohrer&lt;br /&gt;
    * 3   St. Buchsenleisten&lt;br /&gt;
    * 1   St. 9-Pol D-Sub Buchse&lt;br /&gt;
&lt;br /&gt;
 * Thund3r&lt;br /&gt;
    * 4   St. Schiebeschalter&lt;br /&gt;
    * 8   St. Abstanzbolzen&lt;br /&gt;
    * 1   St. 8 pol. Flachbandkabe&lt;br /&gt;
    * 2   St. 7-Segmentanzeigen&lt;br /&gt;
    * 75  St. 3mm LEDs&lt;br /&gt;
    * 1   St. kleiner Motor&lt;br /&gt;
    * 2   St. IEC 60384&lt;br /&gt;
    * 1   St. 9A473g&lt;br /&gt;
    * 1   St. Tischtennisball&lt;br /&gt;
    * 6   St. Beutel&lt;br /&gt;
    * 1   St. Staubsaugmotor&lt;br /&gt;
&lt;br /&gt;
* HannoHupmann&lt;br /&gt;
    * 3   St. Gummibärchen &lt;br /&gt;
    * 4   St. Abstanzbolzen&lt;br /&gt;
    * 1   St. kleiner Motor&lt;br /&gt;
    * 1   St. LCD Display&lt;br /&gt;
    * 1   St. Gummiball (für meine Katze) &lt;br /&gt;
    * 2   St. Verpackungsboxen&lt;br /&gt;
    * 1   St. Piezosummer (groß)    &lt;br /&gt;
    * 1   St. DVD &lt;br /&gt;
    * Teil der Stopmuttern &lt;br /&gt;
    * 2   St. On/Off Schilder&lt;br /&gt;
&lt;br /&gt;
'''Hineingelegt:'''&lt;br /&gt;
 * Williwilli&lt;br /&gt;
    * 3 Taster, 1 Schalter&lt;br /&gt;
    * 25pol D-Sub-Stecker, Lötanschluß&lt;br /&gt;
    * 6 EPROMs&lt;br /&gt;
    * diverse SMD-ICs&lt;br /&gt;
    * 100 LEDs 5mm - 4 Farben&lt;br /&gt;
    * 75 LEDs 3mm - 3 Farben&lt;br /&gt;
    * Steckernetzteil 6,8V DC&lt;br /&gt;
    * 5 dicke PTCs von ITT&lt;br /&gt;
    * 2 Europlatinen einseitig Kupfer (zum Ätzen)&lt;br /&gt;
    * etwas Moosgummi (antistatisch für ICs)&lt;br /&gt;
&lt;br /&gt;
 * fUnK3r&lt;br /&gt;
    * 3 kleine Motoren&lt;br /&gt;
    * 4 7-Segmentanzeigen&lt;br /&gt;
    * 5 Schiebeschalter&lt;br /&gt;
    * 5 SMD Sortimentboxen&lt;br /&gt;
    * 5 blaue Transportboxen&lt;br /&gt;
    * 50 LEDs grün 5mm (Low Current)&lt;br /&gt;
    * 50 LEDs gelb 3mm&lt;br /&gt;
    * 1 Schlüssellampe von Ansmann&lt;br /&gt;
    * 1 240x128 Display (Ich weiß allerdings nicht, obs noch geht)&lt;br /&gt;
    * 2 kleine Rollen Flachbandkabel&lt;br /&gt;
    * 12 Füße für Gehäuse / Platinen&lt;br /&gt;
    * 1 Musik CD&lt;br /&gt;
    * 1 Buch (kein Fachbuch)&lt;br /&gt;
    * 1 kleines Spiel&lt;br /&gt;
    * 4 Endtaster&lt;br /&gt;
    * 2 9-Pol D-Sub (Stecker/Buchse) Flachbandkabelverbindung&lt;br /&gt;
    * 4 ältere große Schalter&lt;br /&gt;
    * 1 Getriebemotor&lt;br /&gt;
    * 3 Buchsenleisten&lt;br /&gt;
    * 1 Gehäuse Anschluss mit Schraubklemme&lt;br /&gt;
    * 12 Abstandsbolzen (bei Interesse das nächste Mal auch mehr)&lt;br /&gt;
    * 10 Kabeldurchführungen (bei Interesse auch mehr)&lt;br /&gt;
    * 20 Schlauchanschlüsse blau (bei Interesse auch mehr)&lt;br /&gt;
    * Außerdem noch eine Sortimentbox '''!!! Wichtig: !!! Diese nicht herausnehmen!!!'''&lt;br /&gt;
&lt;br /&gt;
 * Max Hinze&lt;br /&gt;
    * 100 M3 Stoppmuttern&lt;br /&gt;
    * 6 IRF 540N&lt;br /&gt;
    * 1 Robo 168 Platine&lt;br /&gt;
    * 1 Staubsaugermotor mit Gebläse&lt;br /&gt;
    * 1 serielle Maus&lt;br /&gt;
    * 1 großer Schalter&lt;br /&gt;
    * 10 Schiebeschalter&lt;br /&gt;
    * 3 Endtaster&lt;br /&gt;
    * 1 EEPROM 24C256&lt;br /&gt;
    * 1 ATMega 8 SMD&lt;br /&gt;
    * 1 Kunstoffgehäuse&lt;br /&gt;
    * 15 Wiederverschlißbare Beutel&lt;br /&gt;
&lt;br /&gt;
 * Thund3r&lt;br /&gt;
    * 1 Asuro RS232 Transceiver&lt;br /&gt;
    * 1 9V Batterieclip&lt;br /&gt;
    * 6 Kabelbinder&lt;br /&gt;
    * 1 RS232 Stecker&lt;br /&gt;
    * 1 Monitorstecker (älter)&lt;br /&gt;
    * 1 ATA Kabel&lt;br /&gt;
    * 1 Schlitzschraubenzieher&lt;br /&gt;
    * 3 2,5A Glassicherungen (zB. für den RP6)&lt;br /&gt;
    * 1 Piezo summer (groß)&lt;br /&gt;
    * 2 DVDs (OVP)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 * HannoHupmann&lt;br /&gt;
    * 2 Servos&lt;br /&gt;
    * 1 LCD Display&lt;br /&gt;
    * 1 OLED Display &lt;br /&gt;
    * 1 Nummernfeld &lt;br /&gt;
    * 1 DVD - AI &lt;br /&gt;
    * 2 Kleine Lautsprecher&lt;br /&gt;
    * 2 5x2 Wannensteckerbuchsen&lt;br /&gt;
    * 3 Schrittmotoren&lt;br /&gt;
&lt;br /&gt;
=== Der Inhalt ===&lt;br /&gt;
Hier sollte immer der aktuelle Inhalt der Kiste zu finden sein. Also: entnommene Teile bitte löschen, neue Teile dazu schreiben:&lt;br /&gt;
&lt;br /&gt;
'''* In der Kiste:'''&lt;br /&gt;
     * 1 Tüte mit großen Elkos&lt;br /&gt;
     * 3 Tütchen LEDs&lt;br /&gt;
     * 1 Tütchen PTCs (noch 3 St.)&lt;br /&gt;
     * 2 Schrittmotoren (CD-Laufwerk)&lt;br /&gt;
     * 4 kleine Motoren&lt;br /&gt;
     * 1 Hochstrompoti&lt;br /&gt;
     * 1 Steckernetzteil&lt;br /&gt;
     * 2 Europlatinen einseitig Kupfer (zum Ätzen)&lt;br /&gt;
     * etwas Moosgummi (antistatisch für ICs) ('''Eine Platte ging für die Box drauf''')&lt;br /&gt;
     * ein TT-Ball, ein &amp;quot;Continental&amp;quot;-Flummis&lt;br /&gt;
     * ein paar Meter Doppellitze&lt;br /&gt;
     * Cuttermesser&lt;br /&gt;
     * Bleistifte, Filzstifte, Lineal&lt;br /&gt;
     * 5 SMD Sortimentboxen&lt;br /&gt;
     * 3 blaue Transportboxen&lt;br /&gt;
     * 1 Schlüssellampe von Ansmann&lt;br /&gt;
     * 1 LCD Display blau&lt;br /&gt;
     * 2 kleine Rollen Flachbandkabel&lt;br /&gt;
     * 4 Füße für Gehäuse / Platinen&lt;br /&gt;
     * 1 Musik CD&lt;br /&gt;
     * 1 Buch (kein Fachbuch)&lt;br /&gt;
     * 1 kleines Spiel&lt;br /&gt;
     * 1 Tüte Endtaster&lt;br /&gt;
     * 2 9-Pol D-Sub Stecker Flachbandkabelverbindung&lt;br /&gt;
     * 4 ältere große Schalter&lt;br /&gt;
     * 1 Gehäuse Anschluss mit Schraubklemme&lt;br /&gt;
     * 1 Tüte Kabeldurchführungen (bei Interesse auch mehr)&lt;br /&gt;
     * 1 Tüte Schlauchanschlüsse blau (bei Interesse auch mehr)&lt;br /&gt;
     * 50 M3 Stoppmuttern&lt;br /&gt;
     * 6 IRF 540N&lt;br /&gt;
     * 1 Robo 168 Platine &lt;br /&gt;
     * 1 Staubsaugermotor mit Gebläse&lt;br /&gt;
     * 1 serielle Maus&lt;br /&gt;
     * 1 großer Schalter&lt;br /&gt;
     * 3 Endtaster&lt;br /&gt;
     * 1 Kunstoffgehäuse&lt;br /&gt;
     * 15 Wiederverschließbare Beutel    &lt;br /&gt;
     * '''Außerdem noch eine Sortimentbox !!! Wichtig: !!! Diese nicht herausnehmen!!!'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''* In der Sortimentbox in der Kiste:'''&lt;br /&gt;
     * kleine Elkos &amp;amp; HF-Kondensatoren&lt;br /&gt;
     * 4 FETs IRF520&lt;br /&gt;
     * 1 SRAM 62LV1025-55&lt;br /&gt;
     * 3 NE567&lt;br /&gt;
     * X Logikgatter HEF40xx&lt;br /&gt;
     * 3 EPROMs&lt;br /&gt;
     * X diverse SMD-ICs&lt;br /&gt;
     * X Widerstandsnetzwerke 4k7-9&lt;br /&gt;
     * X Transistoren&lt;br /&gt;
     * X Schalter und Taster&lt;br /&gt;
     * 1 25pol D-Sub-Stecker, Lötanschluss&lt;br /&gt;
     * Drucker-LCD-Display&lt;br /&gt;
     * '''1''' Zahnarztbohrer (es waren 4!!!)&lt;br /&gt;
     * X kleine Mechanikbauteile aus Platik&lt;br /&gt;
     * 4 7-Segmentanzeigen&lt;br /&gt;
     * 1 EEPROM 24C256&lt;br /&gt;
     * ATMega 8 SMD&lt;br /&gt;
&lt;br /&gt;
'''* ... und natürlich das Logbuch'''&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Anmerkungen ==&lt;br /&gt;
Noch Fragen? Anregungen? &amp;lt;br /&amp;gt;&lt;br /&gt;
Bei Bedarf wird hier ergänzt&lt;/div&gt;</summary>
		<author><name>HannoHupmann</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Wanderkiste&amp;diff=16618</id>
		<title>Wanderkiste</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Wanderkiste&amp;diff=16618"/>
				<updated>2010-05-13T08:31:46Z</updated>
		
		<summary type="html">&lt;p&gt;HannoHupmann: /* Online Logbuch */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Entstanden auf Grund verschiedener Anregungen im Internet. Jeder Bastler besitzt Bauteile, die er selbst nicht braucht. Zum Wegwerfen zu schade - aber von möglichem Nutzen für andere Bastler.&lt;br /&gt;
&lt;br /&gt;
==Die Idee / Das Konzept:==&lt;br /&gt;
*Es wird eine Kiste mit Dingen befüllt, die man nicht mehr braucht oder von denen man zu viel hat.&amp;lt;br /&amp;gt;Danach wird die Kiste an einen Interessenten weitergeben / verschickt.&amp;lt;br /&amp;gt;Dieser kann sich dann Dinge, die hineingelegt wurden, aussuchen und danach auch wieder neue Sachen rein legen.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Interessenten tragen sich in eine Liste ein, aber dazu später mehr.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Für alles, was man sich aus der Kiste heraus nimmt,&amp;lt;br /&amp;gt;legt man etwas gleichwertig nützliches wieder hinein.&amp;lt;br /&amp;gt;Wobei hier nicht der finanzielle Wert im Vordergrund stehen soll,&amp;lt;br /&amp;gt;sondern der Nutzen bzw. die Freude, die ein Empfänger daran haben könnte.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Hierbei ist es wichtig, fair zu bleiben, d.h. nehmt nur das raus, was ihr auch brauchen könnt.&amp;lt;br /&amp;gt;Wenn ihr etwas wertvolleres herausnehmt, dann legt auch etwas wertvolleres wieder rein,&amp;lt;br /&amp;gt;sonst ist die Kiste nach ein paar Stationen schon wieder leer bzw. mit irgendwelchem Schrott gefüllt, und dass will keiner von uns.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Die Regeln (Kurzversion)==&lt;br /&gt;
* Nimmt man etwas aus der Kiste, so sollte man auch etwas hinein legen, das vergleichbaren Wert hat - nicht unbedingt finanziell, sondern von möglichem Nutzen für Andere.  &lt;br /&gt;
* Keinen Schrott in die Kiste legen (wie durchgebrannte Baugruppen, gebrochene Displays etc). Bei defekten Platinen, wenn möglich, die Art des Schadens angeben.&lt;br /&gt;
* Keine PC-Bauteile hineinlegen. Die machen eine Kiste schnell extrem schwer.&lt;br /&gt;
* Kiste, wenn irgend möglich, nicht länger als eine Woche behalten.&lt;br /&gt;
* Versand bitte nur als Paket (versichert) mit Hermes oder DHL.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Regeln (Ausführlich) ==&lt;br /&gt;
&lt;br /&gt;
===Wiki-Eintrag===&lt;br /&gt;
Jeder, der die Kiste bekommt, also jede Station, muss einen Eintrag hier in diesem Wiki-Artikel hinterlassen.&amp;lt;br /&amp;gt;&lt;br /&gt;
Darin enthalten sollte sein:&amp;lt;br /&amp;gt;&lt;br /&gt;
    * Ein Bild des Zustandes beim Empfang der Kiste&lt;br /&gt;
    * Datum bei Erhalt der Kiste&lt;br /&gt;
    * Was herausgenommen wurde&lt;br /&gt;
    * Was hineingelegt wurde&lt;br /&gt;
    * Ein Bild der Kiste bei Auslieferung&lt;br /&gt;
    * Datum bei Versand der Kiste&lt;br /&gt;
&lt;br /&gt;
===Die Empfänger / Der Versandt ===&lt;br /&gt;
* Aus der im Wiki veröffentlichten Liste kann man sich einen neuen Empfänger heraussuchen &amp;lt;br /&amp;gt;(wenn möglich nach der Reihenfolge gehen, der neue Empfänger sollte aber die Kiste noch nicht erhalten haben) Mit diesem tritt man zuallererst in Kontakt, dass er sich auf den Empfang der Kiste vorbereiten kann und nicht z.B. im Urlaub ist.&lt;br /&gt;
* Der neue Empfänger sollte, wenn möglich, diese Kiste noch nicht gehabt haben.&lt;br /&gt;
* Bitte die Adressaufkleber auf der Kiste komplett entfernen, sonst könnte es Probleme geben.&lt;br /&gt;
* Wenn die Kiste langsam kaputt geht, kann diese gerne ersetzt werden.&lt;br /&gt;
* Die Kiste immer als versichertes Paket versenden (wegen Trackingnummer).&lt;br /&gt;
* Die Kiste darf nur innerhalb Deutschlands versendet werden.&lt;br /&gt;
* Es ist natürlich auch möglich die Kiste persönlich weiter zu geben!&lt;br /&gt;
* Die Kiste sollte nach spätestens einer Woche weiter geschickt werden.&lt;br /&gt;
&lt;br /&gt;
===Versandinfo===&lt;br /&gt;
* [https://privatpaketservice.hlg.de/wps/portal/PRIPS_DEU/PREISE Hermes]: 4-9 Euro (abhängig von Größe); Versichert; Bis 25kg. Abgabe an [http://customer3.map24.com/hermes/?lang=de-DE Paketshops] oder Abholung von Zuhause (dann etwas teurer).&lt;br /&gt;
&lt;br /&gt;
* [http://www.dhl.de/de/paket/privatkunden/preisuebersicht.html DHL]: 3-13 Euro (abhängig von Größe und Gewicht). Versichert.&lt;br /&gt;
&lt;br /&gt;
===Das Log-Büchlein===&lt;br /&gt;
In der Kiste liegt ein kleines Buch. Dies ist das Logbuch, d.h. hier wird der Lebenslauf der Kiste beschrieben.&amp;lt;br /&amp;gt;&lt;br /&gt;
Hier tragt ihr auch folgendes ein:&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    * Datum bei Erhalt&lt;br /&gt;
    * Was herausgenommen wurde&lt;br /&gt;
    * Was hineingelegt wurde&lt;br /&gt;
    * Datum bei Versand&lt;br /&gt;
    * Neuer Empfänger&lt;br /&gt;
&lt;br /&gt;
===Persönliche Briefe===&lt;br /&gt;
Natürlich dürfen für den nächsten Empfänger auch persönliche Briefe etc. mitgeschickt werden.&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Was darf rein, was nicht?==&lt;br /&gt;
===Rein darf===&lt;br /&gt;
    * Da wir hier im Roboternetz sind, darf natürlich alles rein, was mit Robotern zu tun hat,&lt;br /&gt;
      also sowohl Elektronisches wie auch mechanische Bauteile.&lt;br /&gt;
    * CDs, DVDs.&lt;br /&gt;
    * Funktionierender Technikkram (Keine veraltete PC Hardware).&lt;br /&gt;
    * Bücher (Keine veralteten Zeitschriften).&lt;br /&gt;
    * Werkzeug aller Art (nur Funktionierendes).&lt;br /&gt;
    * Spiele (PC &amp;amp; Gesellschaftsspiele).&lt;br /&gt;
    * Sonstiges Brauchbares.&lt;br /&gt;
    * Über gut verpackte Süßigkeiten freut sich der nächste bestimmt (Gummibärchen etc...).&lt;br /&gt;
&lt;br /&gt;
===Was nicht rein darf===&lt;br /&gt;
    * Unbrauchbarer Krempel.&lt;br /&gt;
    * Defekte, durchgebrannte, kaputte Bauteile.&lt;br /&gt;
    * Veraltete Zeitschriften / PC Hardware etc.&lt;br /&gt;
    * Zerbrechliche Sachen und Flüssigkeiten (bzw. Tassen oder Gläser gut verpacken!).&lt;br /&gt;
&lt;br /&gt;
===Bestückung der Kiste===&lt;br /&gt;
* Bei Entnahme einer Sache mit möglichst einer gleichwertigen Sache befüllen.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Die Kiste ist zu voll, was nun?==&lt;br /&gt;
* Ist die Kiste zu voll, sollte zuerst unnützer Schrott aussortiert werden. (Bitte auch im Wikibeitrag vermerken)&lt;br /&gt;
* Sollte die Kiste immer noch zu voll sein, dann sollte man die Kiste splitten.&lt;br /&gt;
#Ein neuer Karton muss her.&lt;br /&gt;
#Der Inhalt wird gleichmäßig aufgeteilt (etwa gleicher Wert, nicht die gleichen Sachen, sonst ist´s doof).&lt;br /&gt;
#Ein neues Büchlein ist Pflicht.&lt;br /&gt;
##Das Alte Büchlein komplett übertragen (nur Namen &amp;amp; Datum).&lt;br /&gt;
#Einer der entstehenden Kisten einen eigenen Namen geben.&lt;br /&gt;
#Der zweiten Kiste den Namen der aufgespaltenen Kiste geben und passenden Suffix dranhängen &amp;lt;br/&amp;gt;(z.B. nicht mehr ''Kistenname'', sondern ''Kistenname2'').&lt;br /&gt;
# Bitte an zwei verschiedene Empfänger verschicken.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Die Liste ==&lt;br /&gt;
'''Wanderkiste Interessenten Liste'''&lt;br /&gt;
Du willst auch mal eine Wanderkiste erhalten?&amp;lt;br /&amp;gt;&lt;br /&gt;
Dann schreibe doch hier folgende Dinge als Infos:&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- Deine Wünsche&amp;lt;br /&amp;gt;&lt;br /&gt;
- Wenn du willst: Was hast du zu bieten?&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
{{FarbigerRahmen|&lt;br /&gt;
Aus datenschutzrechtlichen Gründen und deinem eigenen Interesse bitte keine Adresse hier hin schreiben.&amp;lt;br /&amp;gt;&lt;br /&gt;
Kontakt kann über das Forum, das Nachrichtenmodul oder per Mail aufgenommen werden!&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier trägt sich jeder ein, der mitmachen möchte...&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&amp;quot;&lt;br /&gt;
|+ '''Interessenliste'''&lt;br /&gt;
|-&lt;br /&gt;
| '''Erhalten am (''Kiste'')'''|| '''Kontakt - Forum''' || '''Kontakt - RN-Wissen''' || '''Wünsche''' || '''zu Bieten''' || '''Sonstiges'''&lt;br /&gt;
|-&lt;br /&gt;
| '''11.11.2011''' (''Beispielkiste'') || [http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=ID Profilname] || [http://www.rn-wissen.de/index.php/Benutzer:Profilname Profilname] || Ich wünsche Mikrocontroller, Bauteile, CDs, DVDs || Ich biete einige seltene Bauteile z.B. ... || Hier z.B. eintragen ob eine Kiste gesplittet wurde&lt;br /&gt;
|-&lt;br /&gt;
|  || [http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=35267 Yaro] || [http://www.rn-wissen.de/index.php/Benutzer:Yaro Yaro] || Ungewöhnliche Sensoren, Mechanische Bauteile || Standardbauteile, Motoren, Zahnarzt-Bohrer || '''Sputnik erstellt am: 15.03.2010'''&lt;br /&gt;
|-&lt;br /&gt;
| '''18.03.2010''' (''Sputnik'') || [http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=36199 Williwilli] || [http://www.rn-wissen.de/index.php/Benutzer:Williwilli Williwilli] ||  ||  ||&lt;br /&gt;
|-&lt;br /&gt;
| '''25.03.2010''' (''Sputnik'') || [http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=42535 fUnK3r] || [http://www.rn-wissen.de/index.php/Benutzer:FUnK3r fUnK3r] || Natürlich alles mögliche an elektronischen Bauteilen und alles mögliche was mit Casemodding zu tun hat, außerdem gerne auch was Süßes und gute Bücher/DVD usw.|| Bauteile, Edelstahl Kabeldurchführungen, Schlauchverbinder, diverses anderes Kleinzeug ||&lt;br /&gt;
|-&lt;br /&gt;
| '''08.04.2010''' (''Sputnik'') || [http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=33426h Max Hinze] || [http://www.rn-wissen.de/index.php/Benutzer:Max_Hinze Max Hinze] || alles mögliche || Kleinzeugs, Platinen.etc. ||&lt;br /&gt;
|-&lt;br /&gt;
| '''15.04.2010''' (''Sputnik'')  || [http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=38729 Thund3r] || [http://www.rn-wissen.de/index.php/Benutzer:Thund3r Thund3r] || elektronische und mechanische Bauteile, Servos, Werkzeuge, Sensoren, Motoren Pfostenstecker o.ä.|| Werkzeug, LEDs, Bauteile, mechanische Komponenten etc. || &lt;br /&gt;
|-&lt;br /&gt;
| '''4.05.2010''' (''Sputnik'')|| [http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=16367 HannoHupmann] || [http://www.rn-wissen.de/index.php/Benutzer:HannoHupmann HannoHupmann] || || Servos, Displays, Bauteile, Diverses ||&lt;br /&gt;
|-&lt;br /&gt;
|  || [http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=40635 DeVlinder] || [http://www.rn-wissen.de/index.php/Benutzer:DeVlinder DeVlinder] || || Standardbauteile, H-Brücken-ICs (SMD), Stecker-/Buchsenleisten, Beschleunigungssensor ||&lt;br /&gt;
|-&lt;br /&gt;
|  || [http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=41246 asurofreak.] || [http://www.rn-wissen.de/index.php/Benutzer:Asurofreak. asurofreak.] || µC´s, Bauteile(helle LED´s),Servos,Robo Control 168... || Netzteile, Bauteile aller Art, Kabel, CDs, Solarpanels, ... ||&lt;br /&gt;
|-&lt;br /&gt;
|  || [http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=44703 Alex.] || [http://www.rn-wissen.de/index.php/Benutzer:MrRoboStriker MrRoboStriker.] || Sensoren,Servos,Bücher, alles mögliche... || Motoren,Potis,Stiftleisten =)tüten Alles mögliche... || Foren Name mit je einem unter und senkrecht Strich vorne und hinten!&lt;br /&gt;
|-&lt;br /&gt;
|  || [http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=37645 tobi.robotz] || [http://www.rn-wissen.de/index.php/Benutzer:Haurucki haurucki] ||Sensoren, Servos, Werkzeug, alles ||AD-Wandler mit LCD Display, LCD-Displays mit Steuer-IC, Motoren, Zugmagnet, Vakuumpumpe, und mehr. ||&lt;br /&gt;
|-&lt;br /&gt;
|  || [http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=42295 Martinius11] || [http://www.rn-wissen.de/index.php/Benutzer:Martinius Martinius] || LEDs, Servos, Thyristoren, Flachbandkabel || Wiederstände, alle möglichen Bauteile, Metallplaten, defekten Asuro(Platine Kaput Bauteile OK) || Bitte vor schicken informieren!&lt;br /&gt;
|-&lt;br /&gt;
|  || [...] || [...] || || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Kiste '''Sputnik''' ==&lt;br /&gt;
=== Der Weg ===&lt;br /&gt;
* '''''[http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=35267 Yaro]''''' geschickt an '''''[http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=36199 Williwilli]''''' am '''''15.03.2010'''''&lt;br /&gt;
* '''''[http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=36199 Williwilli]''''' Kiste erhalten am '''''18.03.2010'''''&lt;br /&gt;
* '''''[http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=36199 Williwilli]''''' geschickt an '''''[http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=42535 fUnK3r]''''' am '''''24.03.2010'''''&lt;br /&gt;
* '''''[http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=42535 fUnK3r]''''' Kiste erhalten am '''''25.03.2010'''''&lt;br /&gt;
* '''''[http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=42535 fUnK3r]''''' geschickt an '''''[http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=33426h Max Hinze]''''' am '''''06.04.2010'''''&lt;br /&gt;
* '''''[http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=33426h Max Hinze]''''' Kiste erhalten am '''''08.04.2010'''''&lt;br /&gt;
* '''''[http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=33426h Max Hinze]''''' geschickt an '''''[http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=38729 Thund3r]''''' am '''''14.04.2010'''''&lt;br /&gt;
* '''''[http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=38729 Thund3r]''''' Kiste erhalten am '''''15.04.2010'''''&lt;br /&gt;
&lt;br /&gt;
[[Bild:Karte_Deutschland_Wanderkiste.JPG]]&lt;br /&gt;
&lt;br /&gt;
=== Online Logbuch ===&lt;br /&gt;
    * Foto beim Öffnen der Kiste&lt;br /&gt;
    * Was herausgenommen wurde&lt;br /&gt;
    * Was hineingelegt wurde&lt;br /&gt;
    * Ein Bild der Kiste bei Auslieferung&lt;br /&gt;
    * Datum bei Versand der Kiste&lt;br /&gt;
&lt;br /&gt;
''Williwilli''&lt;br /&gt;
Foto beim Öffnen der Kiste am 19.03.2010&amp;lt;br/&amp;gt;[[Bild:Wanderkiste.JPG]]&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Foto beim Versand der Kiste am 24.03.2010&amp;lt;br/&amp;gt;[[Bild:Wanderkiste1.JPG]]&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
''fUnK3r''&lt;br /&gt;
Foto beim Empfang der Kiste am 25.03.2010&amp;lt;br/&amp;gt;[[Bild:Wanderkiste_erhalten.JPG]]&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Foto beim Öffnen der Kiste am 25.03.2010&amp;lt;br/&amp;gt;[[Bild:Wanderkiste_inhalt.jpg]]&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Foto von der neuen Box in der Kiste am 01.04.2010&amp;lt;br/&amp;gt;[[Bild:Wanderkiste_neue_box.jpg]]&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Foto vom Inhalt der Kiste am 02.04.2010&amp;lt;br/&amp;gt;[[Bild:Wanderkiste_versandt.jpg]]&amp;lt;br/&amp;gt;&lt;br /&gt;
Auf der Seite liegend das Logbuch und das perfekte Füllmaterial, damit die Kiste keinen Schaden mehr nimmt.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Max Hinze Foto beim Öffnen der Kiste am 08.04.2010&amp;lt;br/&amp;gt;[[Bild:Wanderkiste-öffnen.JPG]]&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Thund3r Foto beim Öffnen der Kiste am 14.04.2010&amp;lt;br/&amp;gt;  [[Bild:Aaa.JPG]]&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Thund3r Foto vom Inhalt der Kiste &amp;lt;br/&amp;gt; [[Bild:Bbb.JPG]]&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Herausgenommen:'''&lt;br /&gt;
 * Williwilli&lt;br /&gt;
    * 3 St. NE567&lt;br /&gt;
    * 2 St 100nF HF-Kondensatoren&lt;br /&gt;
    * 8 St. Taster&lt;br /&gt;
    * 5 St. IRF520&lt;br /&gt;
    * 1 St. Zahnarztbohrer&lt;br /&gt;
    * 2 St. Laborkabel&lt;br /&gt;
&lt;br /&gt;
 * fUnK3r&lt;br /&gt;
    * 3   St. EPROM&lt;br /&gt;
    * 100 St. LEDs 5mm&lt;br /&gt;
    * 1   St. Zahnarztbohrer&lt;br /&gt;
    * 1   St. Platine mit Tastern &amp;amp; LEDs&lt;br /&gt;
    * 2   St. PTC&lt;br /&gt;
&lt;br /&gt;
 * Max Hinze&lt;br /&gt;
    * 4   St. Gehäusefüße&lt;br /&gt;
    * 2   St. 7- Segmentanzeigen&lt;br /&gt;
    * 2   St. Schiebeschalter&lt;br /&gt;
    * 2   St. Endtaster&lt;br /&gt;
    * 1   St. Taster&lt;br /&gt;
    * 1   St. Zahnarztbohrer&lt;br /&gt;
    * 3   St. Buchsenleisten&lt;br /&gt;
    * 1   St. 9-Pol D-Sub Buchse&lt;br /&gt;
&lt;br /&gt;
 * Thund3r&lt;br /&gt;
    * 4   St. Schiebeschalter&lt;br /&gt;
    * 8   St. Abstanzbolzen&lt;br /&gt;
    * 1   St. 8 pol. Flachbandkabe&lt;br /&gt;
    * 2   St. 7-Segmentanzeigen&lt;br /&gt;
    * 75  St. 3mm LEDs&lt;br /&gt;
    * 1   St. kleiner Motor&lt;br /&gt;
    * 2   St. IEC 60384&lt;br /&gt;
    * 1   St. 9A473g&lt;br /&gt;
    * 1   St. Tischtennisball&lt;br /&gt;
    * 6   St. Beutel&lt;br /&gt;
    * 1   St. Staubsaugmotor&lt;br /&gt;
&lt;br /&gt;
* HannoHupmann&lt;br /&gt;
    * 3   St. Gummibärchen &lt;br /&gt;
    * 4   St. Abstanzbolzen&lt;br /&gt;
    * 1   St. kleiner Motor&lt;br /&gt;
    * 1   St. LCD Display&lt;br /&gt;
    * 1   St. Gummiball (für meine Katze) &lt;br /&gt;
    * 2   St. Verpackungsboxen&lt;br /&gt;
    * 1   St. Piezosummer (groß)    &lt;br /&gt;
    * 1   St. DVD &lt;br /&gt;
    * Teil der Stopmuttern &lt;br /&gt;
    * 2   St. On/Off Schilder&lt;br /&gt;
&lt;br /&gt;
'''Hineingelegt:'''&lt;br /&gt;
 * Williwilli&lt;br /&gt;
    * 3 Taster, 1 Schalter&lt;br /&gt;
    * 25pol D-Sub-Stecker, Lötanschluß&lt;br /&gt;
    * 6 EPROMs&lt;br /&gt;
    * diverse SMD-ICs&lt;br /&gt;
    * 100 LEDs 5mm - 4 Farben&lt;br /&gt;
    * 75 LEDs 3mm - 3 Farben&lt;br /&gt;
    * Steckernetzteil 6,8V DC&lt;br /&gt;
    * 5 dicke PTCs von ITT&lt;br /&gt;
    * 2 Europlatinen einseitig Kupfer (zum Ätzen)&lt;br /&gt;
    * etwas Moosgummi (antistatisch für ICs)&lt;br /&gt;
&lt;br /&gt;
 * fUnK3r&lt;br /&gt;
    * 3 kleine Motoren&lt;br /&gt;
    * 4 7-Segmentanzeigen&lt;br /&gt;
    * 5 Schiebeschalter&lt;br /&gt;
    * 5 SMD Sortimentboxen&lt;br /&gt;
    * 5 blaue Transportboxen&lt;br /&gt;
    * 50 LEDs grün 5mm (Low Current)&lt;br /&gt;
    * 50 LEDs gelb 3mm&lt;br /&gt;
    * 1 Schlüssellampe von Ansmann&lt;br /&gt;
    * 1 240x128 Display (Ich weiß allerdings nicht, obs noch geht)&lt;br /&gt;
    * 2 kleine Rollen Flachbandkabel&lt;br /&gt;
    * 12 Füße für Gehäuse / Platinen&lt;br /&gt;
    * 1 Musik CD&lt;br /&gt;
    * 1 Buch (kein Fachbuch)&lt;br /&gt;
    * 1 kleines Spiel&lt;br /&gt;
    * 4 Endtaster&lt;br /&gt;
    * 2 9-Pol D-Sub (Stecker/Buchse) Flachbandkabelverbindung&lt;br /&gt;
    * 4 ältere große Schalter&lt;br /&gt;
    * 1 Getriebemotor&lt;br /&gt;
    * 3 Buchsenleisten&lt;br /&gt;
    * 1 Gehäuse Anschluss mit Schraubklemme&lt;br /&gt;
    * 12 Abstandsbolzen (bei Interesse das nächste Mal auch mehr)&lt;br /&gt;
    * 10 Kabeldurchführungen (bei Interesse auch mehr)&lt;br /&gt;
    * 20 Schlauchanschlüsse blau (bei Interesse auch mehr)&lt;br /&gt;
    * Außerdem noch eine Sortimentbox '''!!! Wichtig: !!! Diese nicht herausnehmen!!!'''&lt;br /&gt;
&lt;br /&gt;
 * Max Hinze&lt;br /&gt;
    * 100 M3 Stoppmuttern&lt;br /&gt;
    * 6 IRF 540N&lt;br /&gt;
    * 1 Robo 168 Platine&lt;br /&gt;
    * 1 Staubsaugermotor mit Gebläse&lt;br /&gt;
    * 1 serielle Maus&lt;br /&gt;
    * 1 großer Schalter&lt;br /&gt;
    * 10 Schiebeschalter&lt;br /&gt;
    * 3 Endtaster&lt;br /&gt;
    * 1 EEPROM 24C256&lt;br /&gt;
    * 1 ATMega 8 SMD&lt;br /&gt;
    * 1 Kunstoffgehäuse&lt;br /&gt;
    * 15 Wiederverschlißbare Beutel&lt;br /&gt;
&lt;br /&gt;
 * Thund3r&lt;br /&gt;
    * 1 Asuro RS232 Transceiver&lt;br /&gt;
    * 1 9V Batterieclip&lt;br /&gt;
    * 6 Kabelbinder&lt;br /&gt;
    * 1 RS232 Stecker&lt;br /&gt;
    * 1 Monitorstecker (älter)&lt;br /&gt;
    * 1 ATA Kabel&lt;br /&gt;
    * 1 Schlitzschraubenzieher&lt;br /&gt;
    * 3 2,5A Glassicherungen (zB. für den RP6)&lt;br /&gt;
    * 1 Piezo summer (groß)&lt;br /&gt;
    * 2 DVDs (OVP)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 * HannoHupmann&lt;br /&gt;
    * 2 Servos&lt;br /&gt;
    * 1 LCD Display&lt;br /&gt;
    * 1 OLED Display &lt;br /&gt;
    * 1 Nummernfeld &lt;br /&gt;
    * 1 DVD - AI &lt;br /&gt;
    * 2 Kleine Lautsprecher&lt;br /&gt;
    * 2 5x2 Wannensteckerbuchsen&lt;br /&gt;
    * 3 Schrittmotoren&lt;br /&gt;
&lt;br /&gt;
=== Der Inhalt ===&lt;br /&gt;
Hier sollte immer der aktuelle Inhalt der Kiste zu finden sein. Also: entnommene Teile bitte löschen, neue Teile dazu schreiben:&lt;br /&gt;
&lt;br /&gt;
'''* In der Kiste:'''&lt;br /&gt;
     * 1 Tüte mit großen Elkos&lt;br /&gt;
     * 3 Tütchen LEDs&lt;br /&gt;
     * 1 Tütchen PTCs (noch 3 St.)&lt;br /&gt;
     * 2 Schrittmotoren (CD-Laufwerk)&lt;br /&gt;
     * 4 kleine Motoren&lt;br /&gt;
     * 1 kleiner Getriebemotor&lt;br /&gt;
     * 1 Hochstrompoti&lt;br /&gt;
     * 1 Steckernetzteil&lt;br /&gt;
     * 2 Europlatinen einseitig Kupfer (zum Ätzen)&lt;br /&gt;
     * etwas Moosgummi (antistatisch für ICs) ('''Eine Platte ging für die Box drauf''')&lt;br /&gt;
     * 3 große Mechanikbauteile aus Metall, 3 aus Platik&lt;br /&gt;
     * ein TT-Ball, zwei &amp;quot;Continental&amp;quot;-Flummis&lt;br /&gt;
     * ein paar Meter Doppellitze&lt;br /&gt;
     * Cuttermesser&lt;br /&gt;
     * Bleistifte, Filzstifte, Lineal&lt;br /&gt;
     * 5 SMD Sortimentboxen&lt;br /&gt;
     * 5 blaue Transportboxen&lt;br /&gt;
     * 1 Schlüssellampe von Ansmann&lt;br /&gt;
     * 1 240x128 Display (Ich weiß allerdings nicht, obs noch geht)&lt;br /&gt;
     * 2 kleine Rollen Flachbandkabel&lt;br /&gt;
     * 8 Füße für Gehäuse / Platinen&lt;br /&gt;
     * 1 Musik CD&lt;br /&gt;
     * 1 Buch (kein Fachbuch)&lt;br /&gt;
     * 1 kleines Spiel&lt;br /&gt;
     * 1 Tüte Endtaster&lt;br /&gt;
     * 2 9-Pol D-Sub Stecker Flachbandkabelverbindung&lt;br /&gt;
     * 4 ältere große Schalter&lt;br /&gt;
     * 1 Gehäuse Anschluss mit Schraubklemme&lt;br /&gt;
     * 1 Tüte Abstandsbolzen (bei Interesse das nächste Mal auch mehr)&lt;br /&gt;
     * 1 Tüte Kabeldurchführungen (bei Interesse auch mehr)&lt;br /&gt;
     * 1 Tüte Schlauchanschlüsse blau (bei Interesse auch mehr)&lt;br /&gt;
     * 100 M3 Stoppmuttern&lt;br /&gt;
     * 6 IRF 540N&lt;br /&gt;
     * 1 Robo 168 Platine &lt;br /&gt;
     * 1 Staubsaugermotor mit Gebläse&lt;br /&gt;
     * 1 serielle Maus&lt;br /&gt;
     * 1 großer Schalter&lt;br /&gt;
     * 3 Endtaster&lt;br /&gt;
     * 1 Kunstoffgehäuse&lt;br /&gt;
     * 15 Wiederverschließbare Beutel    &lt;br /&gt;
     * '''Außerdem noch eine Sortimentbox !!! Wichtig: !!! Diese nicht herausnehmen!!!'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''* In der Sortimentbox in der Kiste:'''&lt;br /&gt;
     * kleine Elkos &amp;amp; HF-Kondensatoren&lt;br /&gt;
     * 4 FETs IRF520&lt;br /&gt;
     * 1 SRAM 62LV1025-55&lt;br /&gt;
     * 3 NE567&lt;br /&gt;
     * X Logikgatter HEF40xx&lt;br /&gt;
     * 3 EPROMs&lt;br /&gt;
     * X diverse SMD-ICs&lt;br /&gt;
     * X Widerstandsnetzwerke 4k7-9&lt;br /&gt;
     * X Transistoren&lt;br /&gt;
     * X Schalter und Taster&lt;br /&gt;
     * 1 25pol D-Sub-Stecker, Lötanschluss&lt;br /&gt;
     * Drucker-LCD-Display&lt;br /&gt;
     * '''1''' Zahnarztbohrer (es waren 4!!!)&lt;br /&gt;
     * X kleine Mechanikbauteile aus Platik&lt;br /&gt;
     * 4 7-Segmentanzeigen&lt;br /&gt;
     * 1 EEPROM 24C256&lt;br /&gt;
     * ATMega 8 SMD&lt;br /&gt;
&lt;br /&gt;
'''* ... und natürlich das Logbuch'''&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Anmerkungen ==&lt;br /&gt;
Noch Fragen? Anregungen? &amp;lt;br /&amp;gt;&lt;br /&gt;
Bei Bedarf wird hier ergänzt&lt;/div&gt;</summary>
		<author><name>HannoHupmann</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Wanderkiste&amp;diff=16617</id>
		<title>Wanderkiste</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Wanderkiste&amp;diff=16617"/>
				<updated>2010-05-13T08:31:09Z</updated>
		
		<summary type="html">&lt;p&gt;HannoHupmann: /* Online Logbuch */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Entstanden auf Grund verschiedener Anregungen im Internet. Jeder Bastler besitzt Bauteile, die er selbst nicht braucht. Zum Wegwerfen zu schade - aber von möglichem Nutzen für andere Bastler.&lt;br /&gt;
&lt;br /&gt;
==Die Idee / Das Konzept:==&lt;br /&gt;
*Es wird eine Kiste mit Dingen befüllt, die man nicht mehr braucht oder von denen man zu viel hat.&amp;lt;br /&amp;gt;Danach wird die Kiste an einen Interessenten weitergeben / verschickt.&amp;lt;br /&amp;gt;Dieser kann sich dann Dinge, die hineingelegt wurden, aussuchen und danach auch wieder neue Sachen rein legen.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Interessenten tragen sich in eine Liste ein, aber dazu später mehr.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Für alles, was man sich aus der Kiste heraus nimmt,&amp;lt;br /&amp;gt;legt man etwas gleichwertig nützliches wieder hinein.&amp;lt;br /&amp;gt;Wobei hier nicht der finanzielle Wert im Vordergrund stehen soll,&amp;lt;br /&amp;gt;sondern der Nutzen bzw. die Freude, die ein Empfänger daran haben könnte.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Hierbei ist es wichtig, fair zu bleiben, d.h. nehmt nur das raus, was ihr auch brauchen könnt.&amp;lt;br /&amp;gt;Wenn ihr etwas wertvolleres herausnehmt, dann legt auch etwas wertvolleres wieder rein,&amp;lt;br /&amp;gt;sonst ist die Kiste nach ein paar Stationen schon wieder leer bzw. mit irgendwelchem Schrott gefüllt, und dass will keiner von uns.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Die Regeln (Kurzversion)==&lt;br /&gt;
* Nimmt man etwas aus der Kiste, so sollte man auch etwas hinein legen, das vergleichbaren Wert hat - nicht unbedingt finanziell, sondern von möglichem Nutzen für Andere.  &lt;br /&gt;
* Keinen Schrott in die Kiste legen (wie durchgebrannte Baugruppen, gebrochene Displays etc). Bei defekten Platinen, wenn möglich, die Art des Schadens angeben.&lt;br /&gt;
* Keine PC-Bauteile hineinlegen. Die machen eine Kiste schnell extrem schwer.&lt;br /&gt;
* Kiste, wenn irgend möglich, nicht länger als eine Woche behalten.&lt;br /&gt;
* Versand bitte nur als Paket (versichert) mit Hermes oder DHL.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Regeln (Ausführlich) ==&lt;br /&gt;
&lt;br /&gt;
===Wiki-Eintrag===&lt;br /&gt;
Jeder, der die Kiste bekommt, also jede Station, muss einen Eintrag hier in diesem Wiki-Artikel hinterlassen.&amp;lt;br /&amp;gt;&lt;br /&gt;
Darin enthalten sollte sein:&amp;lt;br /&amp;gt;&lt;br /&gt;
    * Ein Bild des Zustandes beim Empfang der Kiste&lt;br /&gt;
    * Datum bei Erhalt der Kiste&lt;br /&gt;
    * Was herausgenommen wurde&lt;br /&gt;
    * Was hineingelegt wurde&lt;br /&gt;
    * Ein Bild der Kiste bei Auslieferung&lt;br /&gt;
    * Datum bei Versand der Kiste&lt;br /&gt;
&lt;br /&gt;
===Die Empfänger / Der Versandt ===&lt;br /&gt;
* Aus der im Wiki veröffentlichten Liste kann man sich einen neuen Empfänger heraussuchen &amp;lt;br /&amp;gt;(wenn möglich nach der Reihenfolge gehen, der neue Empfänger sollte aber die Kiste noch nicht erhalten haben) Mit diesem tritt man zuallererst in Kontakt, dass er sich auf den Empfang der Kiste vorbereiten kann und nicht z.B. im Urlaub ist.&lt;br /&gt;
* Der neue Empfänger sollte, wenn möglich, diese Kiste noch nicht gehabt haben.&lt;br /&gt;
* Bitte die Adressaufkleber auf der Kiste komplett entfernen, sonst könnte es Probleme geben.&lt;br /&gt;
* Wenn die Kiste langsam kaputt geht, kann diese gerne ersetzt werden.&lt;br /&gt;
* Die Kiste immer als versichertes Paket versenden (wegen Trackingnummer).&lt;br /&gt;
* Die Kiste darf nur innerhalb Deutschlands versendet werden.&lt;br /&gt;
* Es ist natürlich auch möglich die Kiste persönlich weiter zu geben!&lt;br /&gt;
* Die Kiste sollte nach spätestens einer Woche weiter geschickt werden.&lt;br /&gt;
&lt;br /&gt;
===Versandinfo===&lt;br /&gt;
* [https://privatpaketservice.hlg.de/wps/portal/PRIPS_DEU/PREISE Hermes]: 4-9 Euro (abhängig von Größe); Versichert; Bis 25kg. Abgabe an [http://customer3.map24.com/hermes/?lang=de-DE Paketshops] oder Abholung von Zuhause (dann etwas teurer).&lt;br /&gt;
&lt;br /&gt;
* [http://www.dhl.de/de/paket/privatkunden/preisuebersicht.html DHL]: 3-13 Euro (abhängig von Größe und Gewicht). Versichert.&lt;br /&gt;
&lt;br /&gt;
===Das Log-Büchlein===&lt;br /&gt;
In der Kiste liegt ein kleines Buch. Dies ist das Logbuch, d.h. hier wird der Lebenslauf der Kiste beschrieben.&amp;lt;br /&amp;gt;&lt;br /&gt;
Hier tragt ihr auch folgendes ein:&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    * Datum bei Erhalt&lt;br /&gt;
    * Was herausgenommen wurde&lt;br /&gt;
    * Was hineingelegt wurde&lt;br /&gt;
    * Datum bei Versand&lt;br /&gt;
    * Neuer Empfänger&lt;br /&gt;
&lt;br /&gt;
===Persönliche Briefe===&lt;br /&gt;
Natürlich dürfen für den nächsten Empfänger auch persönliche Briefe etc. mitgeschickt werden.&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Was darf rein, was nicht?==&lt;br /&gt;
===Rein darf===&lt;br /&gt;
    * Da wir hier im Roboternetz sind, darf natürlich alles rein, was mit Robotern zu tun hat,&lt;br /&gt;
      also sowohl Elektronisches wie auch mechanische Bauteile.&lt;br /&gt;
    * CDs, DVDs.&lt;br /&gt;
    * Funktionierender Technikkram (Keine veraltete PC Hardware).&lt;br /&gt;
    * Bücher (Keine veralteten Zeitschriften).&lt;br /&gt;
    * Werkzeug aller Art (nur Funktionierendes).&lt;br /&gt;
    * Spiele (PC &amp;amp; Gesellschaftsspiele).&lt;br /&gt;
    * Sonstiges Brauchbares.&lt;br /&gt;
    * Über gut verpackte Süßigkeiten freut sich der nächste bestimmt (Gummibärchen etc...).&lt;br /&gt;
&lt;br /&gt;
===Was nicht rein darf===&lt;br /&gt;
    * Unbrauchbarer Krempel.&lt;br /&gt;
    * Defekte, durchgebrannte, kaputte Bauteile.&lt;br /&gt;
    * Veraltete Zeitschriften / PC Hardware etc.&lt;br /&gt;
    * Zerbrechliche Sachen und Flüssigkeiten (bzw. Tassen oder Gläser gut verpacken!).&lt;br /&gt;
&lt;br /&gt;
===Bestückung der Kiste===&lt;br /&gt;
* Bei Entnahme einer Sache mit möglichst einer gleichwertigen Sache befüllen.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Die Kiste ist zu voll, was nun?==&lt;br /&gt;
* Ist die Kiste zu voll, sollte zuerst unnützer Schrott aussortiert werden. (Bitte auch im Wikibeitrag vermerken)&lt;br /&gt;
* Sollte die Kiste immer noch zu voll sein, dann sollte man die Kiste splitten.&lt;br /&gt;
#Ein neuer Karton muss her.&lt;br /&gt;
#Der Inhalt wird gleichmäßig aufgeteilt (etwa gleicher Wert, nicht die gleichen Sachen, sonst ist´s doof).&lt;br /&gt;
#Ein neues Büchlein ist Pflicht.&lt;br /&gt;
##Das Alte Büchlein komplett übertragen (nur Namen &amp;amp; Datum).&lt;br /&gt;
#Einer der entstehenden Kisten einen eigenen Namen geben.&lt;br /&gt;
#Der zweiten Kiste den Namen der aufgespaltenen Kiste geben und passenden Suffix dranhängen &amp;lt;br/&amp;gt;(z.B. nicht mehr ''Kistenname'', sondern ''Kistenname2'').&lt;br /&gt;
# Bitte an zwei verschiedene Empfänger verschicken.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Die Liste ==&lt;br /&gt;
'''Wanderkiste Interessenten Liste'''&lt;br /&gt;
Du willst auch mal eine Wanderkiste erhalten?&amp;lt;br /&amp;gt;&lt;br /&gt;
Dann schreibe doch hier folgende Dinge als Infos:&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- Deine Wünsche&amp;lt;br /&amp;gt;&lt;br /&gt;
- Wenn du willst: Was hast du zu bieten?&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
{{FarbigerRahmen|&lt;br /&gt;
Aus datenschutzrechtlichen Gründen und deinem eigenen Interesse bitte keine Adresse hier hin schreiben.&amp;lt;br /&amp;gt;&lt;br /&gt;
Kontakt kann über das Forum, das Nachrichtenmodul oder per Mail aufgenommen werden!&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier trägt sich jeder ein, der mitmachen möchte...&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&amp;quot;&lt;br /&gt;
|+ '''Interessenliste'''&lt;br /&gt;
|-&lt;br /&gt;
| '''Erhalten am (''Kiste'')'''|| '''Kontakt - Forum''' || '''Kontakt - RN-Wissen''' || '''Wünsche''' || '''zu Bieten''' || '''Sonstiges'''&lt;br /&gt;
|-&lt;br /&gt;
| '''11.11.2011''' (''Beispielkiste'') || [http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=ID Profilname] || [http://www.rn-wissen.de/index.php/Benutzer:Profilname Profilname] || Ich wünsche Mikrocontroller, Bauteile, CDs, DVDs || Ich biete einige seltene Bauteile z.B. ... || Hier z.B. eintragen ob eine Kiste gesplittet wurde&lt;br /&gt;
|-&lt;br /&gt;
|  || [http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=35267 Yaro] || [http://www.rn-wissen.de/index.php/Benutzer:Yaro Yaro] || Ungewöhnliche Sensoren, Mechanische Bauteile || Standardbauteile, Motoren, Zahnarzt-Bohrer || '''Sputnik erstellt am: 15.03.2010'''&lt;br /&gt;
|-&lt;br /&gt;
| '''18.03.2010''' (''Sputnik'') || [http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=36199 Williwilli] || [http://www.rn-wissen.de/index.php/Benutzer:Williwilli Williwilli] ||  ||  ||&lt;br /&gt;
|-&lt;br /&gt;
| '''25.03.2010''' (''Sputnik'') || [http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=42535 fUnK3r] || [http://www.rn-wissen.de/index.php/Benutzer:FUnK3r fUnK3r] || Natürlich alles mögliche an elektronischen Bauteilen und alles mögliche was mit Casemodding zu tun hat, außerdem gerne auch was Süßes und gute Bücher/DVD usw.|| Bauteile, Edelstahl Kabeldurchführungen, Schlauchverbinder, diverses anderes Kleinzeug ||&lt;br /&gt;
|-&lt;br /&gt;
| '''08.04.2010''' (''Sputnik'') || [http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=33426h Max Hinze] || [http://www.rn-wissen.de/index.php/Benutzer:Max_Hinze Max Hinze] || alles mögliche || Kleinzeugs, Platinen.etc. ||&lt;br /&gt;
|-&lt;br /&gt;
| '''15.04.2010''' (''Sputnik'')  || [http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=38729 Thund3r] || [http://www.rn-wissen.de/index.php/Benutzer:Thund3r Thund3r] || elektronische und mechanische Bauteile, Servos, Werkzeuge, Sensoren, Motoren Pfostenstecker o.ä.|| Werkzeug, LEDs, Bauteile, mechanische Komponenten etc. || &lt;br /&gt;
|-&lt;br /&gt;
| '''4.05.2010''' (''Sputnik'')|| [http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=16367 HannoHupmann] || [http://www.rn-wissen.de/index.php/Benutzer:HannoHupmann HannoHupmann] || || Servos, Displays, Bauteile, Diverses ||&lt;br /&gt;
|-&lt;br /&gt;
|  || [http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=40635 DeVlinder] || [http://www.rn-wissen.de/index.php/Benutzer:DeVlinder DeVlinder] || || Standardbauteile, H-Brücken-ICs (SMD), Stecker-/Buchsenleisten, Beschleunigungssensor ||&lt;br /&gt;
|-&lt;br /&gt;
|  || [http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=41246 asurofreak.] || [http://www.rn-wissen.de/index.php/Benutzer:Asurofreak. asurofreak.] || µC´s, Bauteile(helle LED´s),Servos,Robo Control 168... || Netzteile, Bauteile aller Art, Kabel, CDs, Solarpanels, ... ||&lt;br /&gt;
|-&lt;br /&gt;
|  || [http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=44703 Alex.] || [http://www.rn-wissen.de/index.php/Benutzer:MrRoboStriker MrRoboStriker.] || Sensoren,Servos,Bücher, alles mögliche... || Motoren,Potis,Stiftleisten =)tüten Alles mögliche... || Foren Name mit je einem unter und senkrecht Strich vorne und hinten!&lt;br /&gt;
|-&lt;br /&gt;
|  || [http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=37645 tobi.robotz] || [http://www.rn-wissen.de/index.php/Benutzer:Haurucki haurucki] ||Sensoren, Servos, Werkzeug, alles ||AD-Wandler mit LCD Display, LCD-Displays mit Steuer-IC, Motoren, Zugmagnet, Vakuumpumpe, und mehr. ||&lt;br /&gt;
|-&lt;br /&gt;
|  || [http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=42295 Martinius11] || [http://www.rn-wissen.de/index.php/Benutzer:Martinius Martinius] || LEDs, Servos, Thyristoren, Flachbandkabel || Wiederstände, alle möglichen Bauteile, Metallplaten, defekten Asuro(Platine Kaput Bauteile OK) || Bitte vor schicken informieren!&lt;br /&gt;
|-&lt;br /&gt;
|  || [...] || [...] || || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Kiste '''Sputnik''' ==&lt;br /&gt;
=== Der Weg ===&lt;br /&gt;
* '''''[http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=35267 Yaro]''''' geschickt an '''''[http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=36199 Williwilli]''''' am '''''15.03.2010'''''&lt;br /&gt;
* '''''[http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=36199 Williwilli]''''' Kiste erhalten am '''''18.03.2010'''''&lt;br /&gt;
* '''''[http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=36199 Williwilli]''''' geschickt an '''''[http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=42535 fUnK3r]''''' am '''''24.03.2010'''''&lt;br /&gt;
* '''''[http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=42535 fUnK3r]''''' Kiste erhalten am '''''25.03.2010'''''&lt;br /&gt;
* '''''[http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=42535 fUnK3r]''''' geschickt an '''''[http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=33426h Max Hinze]''''' am '''''06.04.2010'''''&lt;br /&gt;
* '''''[http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=33426h Max Hinze]''''' Kiste erhalten am '''''08.04.2010'''''&lt;br /&gt;
* '''''[http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=33426h Max Hinze]''''' geschickt an '''''[http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=38729 Thund3r]''''' am '''''14.04.2010'''''&lt;br /&gt;
* '''''[http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=38729 Thund3r]''''' Kiste erhalten am '''''15.04.2010'''''&lt;br /&gt;
&lt;br /&gt;
[[Bild:Karte_Deutschland_Wanderkiste.JPG]]&lt;br /&gt;
&lt;br /&gt;
=== Online Logbuch ===&lt;br /&gt;
    * Foto beim Öffnen der Kiste&lt;br /&gt;
    * Was herausgenommen wurde&lt;br /&gt;
    * Was hineingelegt wurde&lt;br /&gt;
    * Ein Bild der Kiste bei Auslieferung&lt;br /&gt;
    * Datum bei Versand der Kiste&lt;br /&gt;
&lt;br /&gt;
''Williwilli''&lt;br /&gt;
Foto beim Öffnen der Kiste am 19.03.2010&amp;lt;br/&amp;gt;[[Bild:Wanderkiste.JPG]]&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Foto beim Versand der Kiste am 24.03.2010&amp;lt;br/&amp;gt;[[Bild:Wanderkiste1.JPG]]&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
''fUnK3r''&lt;br /&gt;
Foto beim Empfang der Kiste am 25.03.2010&amp;lt;br/&amp;gt;[[Bild:Wanderkiste_erhalten.JPG]]&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Foto beim Öffnen der Kiste am 25.03.2010&amp;lt;br/&amp;gt;[[Bild:Wanderkiste_inhalt.jpg]]&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Foto von der neuen Box in der Kiste am 01.04.2010&amp;lt;br/&amp;gt;[[Bild:Wanderkiste_neue_box.jpg]]&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Foto vom Inhalt der Kiste am 02.04.2010&amp;lt;br/&amp;gt;[[Bild:Wanderkiste_versandt.jpg]]&amp;lt;br/&amp;gt;&lt;br /&gt;
Auf der Seite liegend das Logbuch und das perfekte Füllmaterial, damit die Kiste keinen Schaden mehr nimmt.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Max Hinze Foto beim Öffnen der Kiste am 08.04.2010&amp;lt;br/&amp;gt;[[Bild:Wanderkiste-öffnen.JPG]]&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Thund3r Foto beim Öffnen der Kiste am 14.04.2010&amp;lt;br/&amp;gt;  [[Bild:Aaa.JPG]]&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Thund3r Foto vom Inhalt der Kiste &amp;lt;br/&amp;gt; [[Bild:Bbb.JPG]]&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Herausgenommen:'''&lt;br /&gt;
 * Williwilli&lt;br /&gt;
    * 3 St. NE567&lt;br /&gt;
    * 2 St 100nF HF-Kondensatoren&lt;br /&gt;
    * 8 St. Taster&lt;br /&gt;
    * 5 St. IRF520&lt;br /&gt;
    * 1 St. Zahnarztbohrer&lt;br /&gt;
    * 2 St. Laborkabel&lt;br /&gt;
&lt;br /&gt;
 * fUnK3r&lt;br /&gt;
    * 3   St. EPROM&lt;br /&gt;
    * 100 St. LEDs 5mm&lt;br /&gt;
    * 1   St. Zahnarztbohrer&lt;br /&gt;
    * 1   St. Platine mit Tastern &amp;amp; LEDs&lt;br /&gt;
    * 2   St. PTC&lt;br /&gt;
&lt;br /&gt;
 * Max Hinze&lt;br /&gt;
    * 4   St. Gehäusefüße&lt;br /&gt;
    * 2   St. 7- Segmentanzeigen&lt;br /&gt;
    * 2   St. Schiebeschalter&lt;br /&gt;
    * 2   St. Endtaster&lt;br /&gt;
    * 1   St. Taster&lt;br /&gt;
    * 1   St. Zahnarztbohrer&lt;br /&gt;
    * 3   St. Buchsenleisten&lt;br /&gt;
    * 1   St. 9-Pol D-Sub Buchse&lt;br /&gt;
&lt;br /&gt;
 * Thund3r&lt;br /&gt;
    * 4   St. Schiebeschalter&lt;br /&gt;
    * 8   St. Abstanzbolzen&lt;br /&gt;
    * 1   St. 8 pol. Flachbandkabe&lt;br /&gt;
    * 2   St. 7-Segmentanzeigen&lt;br /&gt;
    * 75  St. 3mm LEDs&lt;br /&gt;
    * 1   St. kleiner Motor&lt;br /&gt;
    * 2   St. IEC 60384&lt;br /&gt;
    * 1   St. 9A473g&lt;br /&gt;
    * 1   St. Tischtennisball&lt;br /&gt;
    * 6   St. Beutel&lt;br /&gt;
    * 1   St. Staubsaugmotor&lt;br /&gt;
&lt;br /&gt;
* HannoHupmann&lt;br /&gt;
    * 3   St. Gummibärchen &lt;br /&gt;
    * 4   St. Abstanzbolzen&lt;br /&gt;
    * 1   St. kleiner Motor&lt;br /&gt;
    * 1   St. LCD Display&lt;br /&gt;
    * 1   St. Gummiball (für meine Katze) &lt;br /&gt;
    * 2   St. Verpackungsboxen&lt;br /&gt;
    * 1   St. Piezosummer (groß)    &lt;br /&gt;
    * 1   St. DVD &lt;br /&gt;
    * Teil der Stopmuttern &lt;br /&gt;
    * 2   St. On/Off Schilder&lt;br /&gt;
&lt;br /&gt;
'''Hineingelegt:'''&lt;br /&gt;
 * Williwilli&lt;br /&gt;
    * 3 Taster, 1 Schalter&lt;br /&gt;
    * 25pol D-Sub-Stecker, Lötanschluß&lt;br /&gt;
    * 6 EPROMs&lt;br /&gt;
    * diverse SMD-ICs&lt;br /&gt;
    * 100 LEDs 5mm - 4 Farben&lt;br /&gt;
    * 75 LEDs 3mm - 3 Farben&lt;br /&gt;
    * Steckernetzteil 6,8V DC&lt;br /&gt;
    * 5 dicke PTCs von ITT&lt;br /&gt;
    * 2 Europlatinen einseitig Kupfer (zum Ätzen)&lt;br /&gt;
    * etwas Moosgummi (antistatisch für ICs)&lt;br /&gt;
&lt;br /&gt;
 * fUnK3r&lt;br /&gt;
    * 3 kleine Motoren&lt;br /&gt;
    * 4 7-Segmentanzeigen&lt;br /&gt;
    * 5 Schiebeschalter&lt;br /&gt;
    * 5 SMD Sortimentboxen&lt;br /&gt;
    * 5 blaue Transportboxen&lt;br /&gt;
    * 50 LEDs grün 5mm (Low Current)&lt;br /&gt;
    * 50 LEDs gelb 3mm&lt;br /&gt;
    * 1 Schlüssellampe von Ansmann&lt;br /&gt;
    * 1 240x128 Display (Ich weiß allerdings nicht, obs noch geht)&lt;br /&gt;
    * 2 kleine Rollen Flachbandkabel&lt;br /&gt;
    * 12 Füße für Gehäuse / Platinen&lt;br /&gt;
    * 1 Musik CD&lt;br /&gt;
    * 1 Buch (kein Fachbuch)&lt;br /&gt;
    * 1 kleines Spiel&lt;br /&gt;
    * 4 Endtaster&lt;br /&gt;
    * 2 9-Pol D-Sub (Stecker/Buchse) Flachbandkabelverbindung&lt;br /&gt;
    * 4 ältere große Schalter&lt;br /&gt;
    * 1 Getriebemotor&lt;br /&gt;
    * 3 Buchsenleisten&lt;br /&gt;
    * 1 Gehäuse Anschluss mit Schraubklemme&lt;br /&gt;
    * 12 Abstandsbolzen (bei Interesse das nächste Mal auch mehr)&lt;br /&gt;
    * 10 Kabeldurchführungen (bei Interesse auch mehr)&lt;br /&gt;
    * 20 Schlauchanschlüsse blau (bei Interesse auch mehr)&lt;br /&gt;
    * Außerdem noch eine Sortimentbox '''!!! Wichtig: !!! Diese nicht herausnehmen!!!'''&lt;br /&gt;
&lt;br /&gt;
 * Max Hinze&lt;br /&gt;
    * 100 M3 Stoppmuttern&lt;br /&gt;
    * 6 IRF 540N&lt;br /&gt;
    * 1 Robo 168 Platine&lt;br /&gt;
    * 1 Staubsaugermotor mit Gebläse&lt;br /&gt;
    * 1 serielle Maus&lt;br /&gt;
    * 1 großer Schalter&lt;br /&gt;
    * 10 Schiebeschalter&lt;br /&gt;
    * 3 Endtaster&lt;br /&gt;
    * 1 EEPROM 24C256&lt;br /&gt;
    * 1 ATMega 8 SMD&lt;br /&gt;
    * 1 Kunstoffgehäuse&lt;br /&gt;
    * 15 Wiederverschlißbare Beutel&lt;br /&gt;
&lt;br /&gt;
 * Thund3r&lt;br /&gt;
    * 1 Asuro RS232 Transceiver&lt;br /&gt;
    * 1 9V Batterieclip&lt;br /&gt;
    * 6 Kabelbinder&lt;br /&gt;
    * 1 RS232 Stecker&lt;br /&gt;
    * 1 Monitorstecker (älter)&lt;br /&gt;
    * 1 ATA Kabel&lt;br /&gt;
    * 1 Schlitzschraubenzieher&lt;br /&gt;
    * 3 2,5A Glassicherungen (zB. für den RP6)&lt;br /&gt;
    * 1 Piezo summer (groß)&lt;br /&gt;
    * 2 DVDs (OVP)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 * HannoHupmann&lt;br /&gt;
    * 2 Servos&lt;br /&gt;
    * 1 LCD Display&lt;br /&gt;
    * 1 OLED Display &lt;br /&gt;
    * 1 Nummernfeld &lt;br /&gt;
    * 1 DVD - AI &lt;br /&gt;
    * 2 Kleine Lautsprecher&lt;br /&gt;
    * 2 5x2 Wannensteckerbuchsen&lt;br /&gt;
&lt;br /&gt;
=== Der Inhalt ===&lt;br /&gt;
Hier sollte immer der aktuelle Inhalt der Kiste zu finden sein. Also: entnommene Teile bitte löschen, neue Teile dazu schreiben:&lt;br /&gt;
&lt;br /&gt;
'''* In der Kiste:'''&lt;br /&gt;
     * 1 Tüte mit großen Elkos&lt;br /&gt;
     * 3 Tütchen LEDs&lt;br /&gt;
     * 1 Tütchen PTCs (noch 3 St.)&lt;br /&gt;
     * 2 Schrittmotoren (CD-Laufwerk)&lt;br /&gt;
     * 4 kleine Motoren&lt;br /&gt;
     * 1 kleiner Getriebemotor&lt;br /&gt;
     * 1 Hochstrompoti&lt;br /&gt;
     * 1 Steckernetzteil&lt;br /&gt;
     * 2 Europlatinen einseitig Kupfer (zum Ätzen)&lt;br /&gt;
     * etwas Moosgummi (antistatisch für ICs) ('''Eine Platte ging für die Box drauf''')&lt;br /&gt;
     * 3 große Mechanikbauteile aus Metall, 3 aus Platik&lt;br /&gt;
     * ein TT-Ball, zwei &amp;quot;Continental&amp;quot;-Flummis&lt;br /&gt;
     * ein paar Meter Doppellitze&lt;br /&gt;
     * Cuttermesser&lt;br /&gt;
     * Bleistifte, Filzstifte, Lineal&lt;br /&gt;
     * 5 SMD Sortimentboxen&lt;br /&gt;
     * 5 blaue Transportboxen&lt;br /&gt;
     * 1 Schlüssellampe von Ansmann&lt;br /&gt;
     * 1 240x128 Display (Ich weiß allerdings nicht, obs noch geht)&lt;br /&gt;
     * 2 kleine Rollen Flachbandkabel&lt;br /&gt;
     * 8 Füße für Gehäuse / Platinen&lt;br /&gt;
     * 1 Musik CD&lt;br /&gt;
     * 1 Buch (kein Fachbuch)&lt;br /&gt;
     * 1 kleines Spiel&lt;br /&gt;
     * 1 Tüte Endtaster&lt;br /&gt;
     * 2 9-Pol D-Sub Stecker Flachbandkabelverbindung&lt;br /&gt;
     * 4 ältere große Schalter&lt;br /&gt;
     * 1 Gehäuse Anschluss mit Schraubklemme&lt;br /&gt;
     * 1 Tüte Abstandsbolzen (bei Interesse das nächste Mal auch mehr)&lt;br /&gt;
     * 1 Tüte Kabeldurchführungen (bei Interesse auch mehr)&lt;br /&gt;
     * 1 Tüte Schlauchanschlüsse blau (bei Interesse auch mehr)&lt;br /&gt;
     * 100 M3 Stoppmuttern&lt;br /&gt;
     * 6 IRF 540N&lt;br /&gt;
     * 1 Robo 168 Platine &lt;br /&gt;
     * 1 Staubsaugermotor mit Gebläse&lt;br /&gt;
     * 1 serielle Maus&lt;br /&gt;
     * 1 großer Schalter&lt;br /&gt;
     * 3 Endtaster&lt;br /&gt;
     * 1 Kunstoffgehäuse&lt;br /&gt;
     * 15 Wiederverschließbare Beutel    &lt;br /&gt;
     * '''Außerdem noch eine Sortimentbox !!! Wichtig: !!! Diese nicht herausnehmen!!!'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''* In der Sortimentbox in der Kiste:'''&lt;br /&gt;
     * kleine Elkos &amp;amp; HF-Kondensatoren&lt;br /&gt;
     * 4 FETs IRF520&lt;br /&gt;
     * 1 SRAM 62LV1025-55&lt;br /&gt;
     * 3 NE567&lt;br /&gt;
     * X Logikgatter HEF40xx&lt;br /&gt;
     * 3 EPROMs&lt;br /&gt;
     * X diverse SMD-ICs&lt;br /&gt;
     * X Widerstandsnetzwerke 4k7-9&lt;br /&gt;
     * X Transistoren&lt;br /&gt;
     * X Schalter und Taster&lt;br /&gt;
     * 1 25pol D-Sub-Stecker, Lötanschluss&lt;br /&gt;
     * Drucker-LCD-Display&lt;br /&gt;
     * '''1''' Zahnarztbohrer (es waren 4!!!)&lt;br /&gt;
     * X kleine Mechanikbauteile aus Platik&lt;br /&gt;
     * 4 7-Segmentanzeigen&lt;br /&gt;
     * 1 EEPROM 24C256&lt;br /&gt;
     * ATMega 8 SMD&lt;br /&gt;
&lt;br /&gt;
'''* ... und natürlich das Logbuch'''&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Anmerkungen ==&lt;br /&gt;
Noch Fragen? Anregungen? &amp;lt;br /&amp;gt;&lt;br /&gt;
Bei Bedarf wird hier ergänzt&lt;/div&gt;</summary>
		<author><name>HannoHupmann</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Wanderkiste&amp;diff=16616</id>
		<title>Wanderkiste</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Wanderkiste&amp;diff=16616"/>
				<updated>2010-05-13T08:29:11Z</updated>
		
		<summary type="html">&lt;p&gt;HannoHupmann: /* Online Logbuch */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Entstanden auf Grund verschiedener Anregungen im Internet. Jeder Bastler besitzt Bauteile, die er selbst nicht braucht. Zum Wegwerfen zu schade - aber von möglichem Nutzen für andere Bastler.&lt;br /&gt;
&lt;br /&gt;
==Die Idee / Das Konzept:==&lt;br /&gt;
*Es wird eine Kiste mit Dingen befüllt, die man nicht mehr braucht oder von denen man zu viel hat.&amp;lt;br /&amp;gt;Danach wird die Kiste an einen Interessenten weitergeben / verschickt.&amp;lt;br /&amp;gt;Dieser kann sich dann Dinge, die hineingelegt wurden, aussuchen und danach auch wieder neue Sachen rein legen.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Interessenten tragen sich in eine Liste ein, aber dazu später mehr.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Für alles, was man sich aus der Kiste heraus nimmt,&amp;lt;br /&amp;gt;legt man etwas gleichwertig nützliches wieder hinein.&amp;lt;br /&amp;gt;Wobei hier nicht der finanzielle Wert im Vordergrund stehen soll,&amp;lt;br /&amp;gt;sondern der Nutzen bzw. die Freude, die ein Empfänger daran haben könnte.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Hierbei ist es wichtig, fair zu bleiben, d.h. nehmt nur das raus, was ihr auch brauchen könnt.&amp;lt;br /&amp;gt;Wenn ihr etwas wertvolleres herausnehmt, dann legt auch etwas wertvolleres wieder rein,&amp;lt;br /&amp;gt;sonst ist die Kiste nach ein paar Stationen schon wieder leer bzw. mit irgendwelchem Schrott gefüllt, und dass will keiner von uns.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Die Regeln (Kurzversion)==&lt;br /&gt;
* Nimmt man etwas aus der Kiste, so sollte man auch etwas hinein legen, das vergleichbaren Wert hat - nicht unbedingt finanziell, sondern von möglichem Nutzen für Andere.  &lt;br /&gt;
* Keinen Schrott in die Kiste legen (wie durchgebrannte Baugruppen, gebrochene Displays etc). Bei defekten Platinen, wenn möglich, die Art des Schadens angeben.&lt;br /&gt;
* Keine PC-Bauteile hineinlegen. Die machen eine Kiste schnell extrem schwer.&lt;br /&gt;
* Kiste, wenn irgend möglich, nicht länger als eine Woche behalten.&lt;br /&gt;
* Versand bitte nur als Paket (versichert) mit Hermes oder DHL.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Regeln (Ausführlich) ==&lt;br /&gt;
&lt;br /&gt;
===Wiki-Eintrag===&lt;br /&gt;
Jeder, der die Kiste bekommt, also jede Station, muss einen Eintrag hier in diesem Wiki-Artikel hinterlassen.&amp;lt;br /&amp;gt;&lt;br /&gt;
Darin enthalten sollte sein:&amp;lt;br /&amp;gt;&lt;br /&gt;
    * Ein Bild des Zustandes beim Empfang der Kiste&lt;br /&gt;
    * Datum bei Erhalt der Kiste&lt;br /&gt;
    * Was herausgenommen wurde&lt;br /&gt;
    * Was hineingelegt wurde&lt;br /&gt;
    * Ein Bild der Kiste bei Auslieferung&lt;br /&gt;
    * Datum bei Versand der Kiste&lt;br /&gt;
&lt;br /&gt;
===Die Empfänger / Der Versandt ===&lt;br /&gt;
* Aus der im Wiki veröffentlichten Liste kann man sich einen neuen Empfänger heraussuchen &amp;lt;br /&amp;gt;(wenn möglich nach der Reihenfolge gehen, der neue Empfänger sollte aber die Kiste noch nicht erhalten haben) Mit diesem tritt man zuallererst in Kontakt, dass er sich auf den Empfang der Kiste vorbereiten kann und nicht z.B. im Urlaub ist.&lt;br /&gt;
* Der neue Empfänger sollte, wenn möglich, diese Kiste noch nicht gehabt haben.&lt;br /&gt;
* Bitte die Adressaufkleber auf der Kiste komplett entfernen, sonst könnte es Probleme geben.&lt;br /&gt;
* Wenn die Kiste langsam kaputt geht, kann diese gerne ersetzt werden.&lt;br /&gt;
* Die Kiste immer als versichertes Paket versenden (wegen Trackingnummer).&lt;br /&gt;
* Die Kiste darf nur innerhalb Deutschlands versendet werden.&lt;br /&gt;
* Es ist natürlich auch möglich die Kiste persönlich weiter zu geben!&lt;br /&gt;
* Die Kiste sollte nach spätestens einer Woche weiter geschickt werden.&lt;br /&gt;
&lt;br /&gt;
===Versandinfo===&lt;br /&gt;
* [https://privatpaketservice.hlg.de/wps/portal/PRIPS_DEU/PREISE Hermes]: 4-9 Euro (abhängig von Größe); Versichert; Bis 25kg. Abgabe an [http://customer3.map24.com/hermes/?lang=de-DE Paketshops] oder Abholung von Zuhause (dann etwas teurer).&lt;br /&gt;
&lt;br /&gt;
* [http://www.dhl.de/de/paket/privatkunden/preisuebersicht.html DHL]: 3-13 Euro (abhängig von Größe und Gewicht). Versichert.&lt;br /&gt;
&lt;br /&gt;
===Das Log-Büchlein===&lt;br /&gt;
In der Kiste liegt ein kleines Buch. Dies ist das Logbuch, d.h. hier wird der Lebenslauf der Kiste beschrieben.&amp;lt;br /&amp;gt;&lt;br /&gt;
Hier tragt ihr auch folgendes ein:&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    * Datum bei Erhalt&lt;br /&gt;
    * Was herausgenommen wurde&lt;br /&gt;
    * Was hineingelegt wurde&lt;br /&gt;
    * Datum bei Versand&lt;br /&gt;
    * Neuer Empfänger&lt;br /&gt;
&lt;br /&gt;
===Persönliche Briefe===&lt;br /&gt;
Natürlich dürfen für den nächsten Empfänger auch persönliche Briefe etc. mitgeschickt werden.&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Was darf rein, was nicht?==&lt;br /&gt;
===Rein darf===&lt;br /&gt;
    * Da wir hier im Roboternetz sind, darf natürlich alles rein, was mit Robotern zu tun hat,&lt;br /&gt;
      also sowohl Elektronisches wie auch mechanische Bauteile.&lt;br /&gt;
    * CDs, DVDs.&lt;br /&gt;
    * Funktionierender Technikkram (Keine veraltete PC Hardware).&lt;br /&gt;
    * Bücher (Keine veralteten Zeitschriften).&lt;br /&gt;
    * Werkzeug aller Art (nur Funktionierendes).&lt;br /&gt;
    * Spiele (PC &amp;amp; Gesellschaftsspiele).&lt;br /&gt;
    * Sonstiges Brauchbares.&lt;br /&gt;
    * Über gut verpackte Süßigkeiten freut sich der nächste bestimmt (Gummibärchen etc...).&lt;br /&gt;
&lt;br /&gt;
===Was nicht rein darf===&lt;br /&gt;
    * Unbrauchbarer Krempel.&lt;br /&gt;
    * Defekte, durchgebrannte, kaputte Bauteile.&lt;br /&gt;
    * Veraltete Zeitschriften / PC Hardware etc.&lt;br /&gt;
    * Zerbrechliche Sachen und Flüssigkeiten (bzw. Tassen oder Gläser gut verpacken!).&lt;br /&gt;
&lt;br /&gt;
===Bestückung der Kiste===&lt;br /&gt;
* Bei Entnahme einer Sache mit möglichst einer gleichwertigen Sache befüllen.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Die Kiste ist zu voll, was nun?==&lt;br /&gt;
* Ist die Kiste zu voll, sollte zuerst unnützer Schrott aussortiert werden. (Bitte auch im Wikibeitrag vermerken)&lt;br /&gt;
* Sollte die Kiste immer noch zu voll sein, dann sollte man die Kiste splitten.&lt;br /&gt;
#Ein neuer Karton muss her.&lt;br /&gt;
#Der Inhalt wird gleichmäßig aufgeteilt (etwa gleicher Wert, nicht die gleichen Sachen, sonst ist´s doof).&lt;br /&gt;
#Ein neues Büchlein ist Pflicht.&lt;br /&gt;
##Das Alte Büchlein komplett übertragen (nur Namen &amp;amp; Datum).&lt;br /&gt;
#Einer der entstehenden Kisten einen eigenen Namen geben.&lt;br /&gt;
#Der zweiten Kiste den Namen der aufgespaltenen Kiste geben und passenden Suffix dranhängen &amp;lt;br/&amp;gt;(z.B. nicht mehr ''Kistenname'', sondern ''Kistenname2'').&lt;br /&gt;
# Bitte an zwei verschiedene Empfänger verschicken.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Die Liste ==&lt;br /&gt;
'''Wanderkiste Interessenten Liste'''&lt;br /&gt;
Du willst auch mal eine Wanderkiste erhalten?&amp;lt;br /&amp;gt;&lt;br /&gt;
Dann schreibe doch hier folgende Dinge als Infos:&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- Deine Wünsche&amp;lt;br /&amp;gt;&lt;br /&gt;
- Wenn du willst: Was hast du zu bieten?&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
{{FarbigerRahmen|&lt;br /&gt;
Aus datenschutzrechtlichen Gründen und deinem eigenen Interesse bitte keine Adresse hier hin schreiben.&amp;lt;br /&amp;gt;&lt;br /&gt;
Kontakt kann über das Forum, das Nachrichtenmodul oder per Mail aufgenommen werden!&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier trägt sich jeder ein, der mitmachen möchte...&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&amp;quot;&lt;br /&gt;
|+ '''Interessenliste'''&lt;br /&gt;
|-&lt;br /&gt;
| '''Erhalten am (''Kiste'')'''|| '''Kontakt - Forum''' || '''Kontakt - RN-Wissen''' || '''Wünsche''' || '''zu Bieten''' || '''Sonstiges'''&lt;br /&gt;
|-&lt;br /&gt;
| '''11.11.2011''' (''Beispielkiste'') || [http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=ID Profilname] || [http://www.rn-wissen.de/index.php/Benutzer:Profilname Profilname] || Ich wünsche Mikrocontroller, Bauteile, CDs, DVDs || Ich biete einige seltene Bauteile z.B. ... || Hier z.B. eintragen ob eine Kiste gesplittet wurde&lt;br /&gt;
|-&lt;br /&gt;
|  || [http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=35267 Yaro] || [http://www.rn-wissen.de/index.php/Benutzer:Yaro Yaro] || Ungewöhnliche Sensoren, Mechanische Bauteile || Standardbauteile, Motoren, Zahnarzt-Bohrer || '''Sputnik erstellt am: 15.03.2010'''&lt;br /&gt;
|-&lt;br /&gt;
| '''18.03.2010''' (''Sputnik'') || [http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=36199 Williwilli] || [http://www.rn-wissen.de/index.php/Benutzer:Williwilli Williwilli] ||  ||  ||&lt;br /&gt;
|-&lt;br /&gt;
| '''25.03.2010''' (''Sputnik'') || [http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=42535 fUnK3r] || [http://www.rn-wissen.de/index.php/Benutzer:FUnK3r fUnK3r] || Natürlich alles mögliche an elektronischen Bauteilen und alles mögliche was mit Casemodding zu tun hat, außerdem gerne auch was Süßes und gute Bücher/DVD usw.|| Bauteile, Edelstahl Kabeldurchführungen, Schlauchverbinder, diverses anderes Kleinzeug ||&lt;br /&gt;
|-&lt;br /&gt;
| '''08.04.2010''' (''Sputnik'') || [http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=33426h Max Hinze] || [http://www.rn-wissen.de/index.php/Benutzer:Max_Hinze Max Hinze] || alles mögliche || Kleinzeugs, Platinen.etc. ||&lt;br /&gt;
|-&lt;br /&gt;
| '''15.04.2010''' (''Sputnik'')  || [http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=38729 Thund3r] || [http://www.rn-wissen.de/index.php/Benutzer:Thund3r Thund3r] || elektronische und mechanische Bauteile, Servos, Werkzeuge, Sensoren, Motoren Pfostenstecker o.ä.|| Werkzeug, LEDs, Bauteile, mechanische Komponenten etc. || &lt;br /&gt;
|-&lt;br /&gt;
| '''4.05.2010''' (''Sputnik'')|| [http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=16367 HannoHupmann] || [http://www.rn-wissen.de/index.php/Benutzer:HannoHupmann HannoHupmann] || || Servos, Displays, Bauteile, Diverses ||&lt;br /&gt;
|-&lt;br /&gt;
|  || [http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=40635 DeVlinder] || [http://www.rn-wissen.de/index.php/Benutzer:DeVlinder DeVlinder] || || Standardbauteile, H-Brücken-ICs (SMD), Stecker-/Buchsenleisten, Beschleunigungssensor ||&lt;br /&gt;
|-&lt;br /&gt;
|  || [http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=41246 asurofreak.] || [http://www.rn-wissen.de/index.php/Benutzer:Asurofreak. asurofreak.] || µC´s, Bauteile(helle LED´s),Servos,Robo Control 168... || Netzteile, Bauteile aller Art, Kabel, CDs, Solarpanels, ... ||&lt;br /&gt;
|-&lt;br /&gt;
|  || [http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=44703 Alex.] || [http://www.rn-wissen.de/index.php/Benutzer:MrRoboStriker MrRoboStriker.] || Sensoren,Servos,Bücher, alles mögliche... || Motoren,Potis,Stiftleisten =)tüten Alles mögliche... || Foren Name mit je einem unter und senkrecht Strich vorne und hinten!&lt;br /&gt;
|-&lt;br /&gt;
|  || [http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=37645 tobi.robotz] || [http://www.rn-wissen.de/index.php/Benutzer:Haurucki haurucki] ||Sensoren, Servos, Werkzeug, alles ||AD-Wandler mit LCD Display, LCD-Displays mit Steuer-IC, Motoren, Zugmagnet, Vakuumpumpe, und mehr. ||&lt;br /&gt;
|-&lt;br /&gt;
|  || [http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=42295 Martinius11] || [http://www.rn-wissen.de/index.php/Benutzer:Martinius Martinius] || LEDs, Servos, Thyristoren, Flachbandkabel || Wiederstände, alle möglichen Bauteile, Metallplaten, defekten Asuro(Platine Kaput Bauteile OK) || Bitte vor schicken informieren!&lt;br /&gt;
|-&lt;br /&gt;
|  || [...] || [...] || || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Kiste '''Sputnik''' ==&lt;br /&gt;
=== Der Weg ===&lt;br /&gt;
* '''''[http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=35267 Yaro]''''' geschickt an '''''[http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=36199 Williwilli]''''' am '''''15.03.2010'''''&lt;br /&gt;
* '''''[http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=36199 Williwilli]''''' Kiste erhalten am '''''18.03.2010'''''&lt;br /&gt;
* '''''[http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=36199 Williwilli]''''' geschickt an '''''[http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=42535 fUnK3r]''''' am '''''24.03.2010'''''&lt;br /&gt;
* '''''[http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=42535 fUnK3r]''''' Kiste erhalten am '''''25.03.2010'''''&lt;br /&gt;
* '''''[http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=42535 fUnK3r]''''' geschickt an '''''[http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=33426h Max Hinze]''''' am '''''06.04.2010'''''&lt;br /&gt;
* '''''[http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=33426h Max Hinze]''''' Kiste erhalten am '''''08.04.2010'''''&lt;br /&gt;
* '''''[http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=33426h Max Hinze]''''' geschickt an '''''[http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=38729 Thund3r]''''' am '''''14.04.2010'''''&lt;br /&gt;
* '''''[http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=38729 Thund3r]''''' Kiste erhalten am '''''15.04.2010'''''&lt;br /&gt;
&lt;br /&gt;
[[Bild:Karte_Deutschland_Wanderkiste.JPG]]&lt;br /&gt;
&lt;br /&gt;
=== Online Logbuch ===&lt;br /&gt;
    * Foto beim Öffnen der Kiste&lt;br /&gt;
    * Was herausgenommen wurde&lt;br /&gt;
    * Was hineingelegt wurde&lt;br /&gt;
    * Ein Bild der Kiste bei Auslieferung&lt;br /&gt;
    * Datum bei Versand der Kiste&lt;br /&gt;
&lt;br /&gt;
''Williwilli''&lt;br /&gt;
Foto beim Öffnen der Kiste am 19.03.2010&amp;lt;br/&amp;gt;[[Bild:Wanderkiste.JPG]]&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Foto beim Versand der Kiste am 24.03.2010&amp;lt;br/&amp;gt;[[Bild:Wanderkiste1.JPG]]&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
''fUnK3r''&lt;br /&gt;
Foto beim Empfang der Kiste am 25.03.2010&amp;lt;br/&amp;gt;[[Bild:Wanderkiste_erhalten.JPG]]&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Foto beim Öffnen der Kiste am 25.03.2010&amp;lt;br/&amp;gt;[[Bild:Wanderkiste_inhalt.jpg]]&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Foto von der neuen Box in der Kiste am 01.04.2010&amp;lt;br/&amp;gt;[[Bild:Wanderkiste_neue_box.jpg]]&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Foto vom Inhalt der Kiste am 02.04.2010&amp;lt;br/&amp;gt;[[Bild:Wanderkiste_versandt.jpg]]&amp;lt;br/&amp;gt;&lt;br /&gt;
Auf der Seite liegend das Logbuch und das perfekte Füllmaterial, damit die Kiste keinen Schaden mehr nimmt.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Max Hinze Foto beim Öffnen der Kiste am 08.04.2010&amp;lt;br/&amp;gt;[[Bild:Wanderkiste-öffnen.JPG]]&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Thund3r Foto beim Öffnen der Kiste am 14.04.2010&amp;lt;br/&amp;gt;  [[Bild:Aaa.JPG]]&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Thund3r Foto vom Inhalt der Kiste &amp;lt;br/&amp;gt; [[Bild:Bbb.JPG]]&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Herausgenommen:'''&lt;br /&gt;
 * Williwilli&lt;br /&gt;
    * 3 St. NE567&lt;br /&gt;
    * 2 St 100nF HF-Kondensatoren&lt;br /&gt;
    * 8 St. Taster&lt;br /&gt;
    * 5 St. IRF520&lt;br /&gt;
    * 1 St. Zahnarztbohrer&lt;br /&gt;
    * 2 St. Laborkabel&lt;br /&gt;
&lt;br /&gt;
 * fUnK3r&lt;br /&gt;
    * 3   St. EPROM&lt;br /&gt;
    * 100 St. LEDs 5mm&lt;br /&gt;
    * 1   St. Zahnarztbohrer&lt;br /&gt;
    * 1   St. Platine mit Tastern &amp;amp; LEDs&lt;br /&gt;
    * 2   St. PTC&lt;br /&gt;
&lt;br /&gt;
 * Max Hinze&lt;br /&gt;
    * 4   St. Gehäusefüße&lt;br /&gt;
    * 2   St. 7- Segmentanzeigen&lt;br /&gt;
    * 2   St. Schiebeschalter&lt;br /&gt;
    * 2   St. Endtaster&lt;br /&gt;
    * 1   St. Taster&lt;br /&gt;
    * 1   St. Zahnarztbohrer&lt;br /&gt;
    * 3   St. Buchsenleisten&lt;br /&gt;
    * 1   St. 9-Pol D-Sub Buchse&lt;br /&gt;
&lt;br /&gt;
 * Thund3r&lt;br /&gt;
    * 4   St. Schiebeschalter&lt;br /&gt;
    * 8   St. Abstanzbolzen&lt;br /&gt;
    * 1   St. 8 pol. Flachbandkabe&lt;br /&gt;
    * 2   St. 7-Segmentanzeigen&lt;br /&gt;
    * 75  St. 3mm LEDs&lt;br /&gt;
    * 1   St. kleiner Motor&lt;br /&gt;
    * 2   St. IEC 60384&lt;br /&gt;
    * 1   St. 9A473g&lt;br /&gt;
    * 1   St. Tischtennisball&lt;br /&gt;
    * 6   St. Beutel&lt;br /&gt;
    * 1   St. Staubsaugmotor&lt;br /&gt;
&lt;br /&gt;
* HannoHupmann&lt;br /&gt;
    * 3   St. Gummibärchen &lt;br /&gt;
    * 4   St. Abstanzbolzen&lt;br /&gt;
    * 1   St. kleiner Motor&lt;br /&gt;
    * 1   St. LCD Display&lt;br /&gt;
    * 1   St. Gummiball (für meine Katze) &lt;br /&gt;
    * 2   St. Verpackungsboxen&lt;br /&gt;
    * 1   St. Piezosummer (groß)    &lt;br /&gt;
    * 1   St. DVD &lt;br /&gt;
&lt;br /&gt;
'''Hineingelegt:'''&lt;br /&gt;
 * Williwilli&lt;br /&gt;
    * 3 Taster, 1 Schalter&lt;br /&gt;
    * 25pol D-Sub-Stecker, Lötanschluß&lt;br /&gt;
    * 6 EPROMs&lt;br /&gt;
    * diverse SMD-ICs&lt;br /&gt;
    * 100 LEDs 5mm - 4 Farben&lt;br /&gt;
    * 75 LEDs 3mm - 3 Farben&lt;br /&gt;
    * Steckernetzteil 6,8V DC&lt;br /&gt;
    * 5 dicke PTCs von ITT&lt;br /&gt;
    * 2 Europlatinen einseitig Kupfer (zum Ätzen)&lt;br /&gt;
    * etwas Moosgummi (antistatisch für ICs)&lt;br /&gt;
&lt;br /&gt;
 * fUnK3r&lt;br /&gt;
    * 3 kleine Motoren&lt;br /&gt;
    * 4 7-Segmentanzeigen&lt;br /&gt;
    * 5 Schiebeschalter&lt;br /&gt;
    * 5 SMD Sortimentboxen&lt;br /&gt;
    * 5 blaue Transportboxen&lt;br /&gt;
    * 50 LEDs grün 5mm (Low Current)&lt;br /&gt;
    * 50 LEDs gelb 3mm&lt;br /&gt;
    * 1 Schlüssellampe von Ansmann&lt;br /&gt;
    * 1 240x128 Display (Ich weiß allerdings nicht, obs noch geht)&lt;br /&gt;
    * 2 kleine Rollen Flachbandkabel&lt;br /&gt;
    * 12 Füße für Gehäuse / Platinen&lt;br /&gt;
    * 1 Musik CD&lt;br /&gt;
    * 1 Buch (kein Fachbuch)&lt;br /&gt;
    * 1 kleines Spiel&lt;br /&gt;
    * 4 Endtaster&lt;br /&gt;
    * 2 9-Pol D-Sub (Stecker/Buchse) Flachbandkabelverbindung&lt;br /&gt;
    * 4 ältere große Schalter&lt;br /&gt;
    * 1 Getriebemotor&lt;br /&gt;
    * 3 Buchsenleisten&lt;br /&gt;
    * 1 Gehäuse Anschluss mit Schraubklemme&lt;br /&gt;
    * 12 Abstandsbolzen (bei Interesse das nächste Mal auch mehr)&lt;br /&gt;
    * 10 Kabeldurchführungen (bei Interesse auch mehr)&lt;br /&gt;
    * 20 Schlauchanschlüsse blau (bei Interesse auch mehr)&lt;br /&gt;
    * Außerdem noch eine Sortimentbox '''!!! Wichtig: !!! Diese nicht herausnehmen!!!'''&lt;br /&gt;
&lt;br /&gt;
 * Max Hinze&lt;br /&gt;
    * 100 M3 Stoppmuttern&lt;br /&gt;
    * 6 IRF 540N&lt;br /&gt;
    * 1 Robo 168 Platine&lt;br /&gt;
    * 1 Staubsaugermotor mit Gebläse&lt;br /&gt;
    * 1 serielle Maus&lt;br /&gt;
    * 1 großer Schalter&lt;br /&gt;
    * 10 Schiebeschalter&lt;br /&gt;
    * 3 Endtaster&lt;br /&gt;
    * 1 EEPROM 24C256&lt;br /&gt;
    * 1 ATMega 8 SMD&lt;br /&gt;
    * 1 Kunstoffgehäuse&lt;br /&gt;
    * 15 Wiederverschlißbare Beutel&lt;br /&gt;
&lt;br /&gt;
 * Thund3r&lt;br /&gt;
    * 1 Asuro RS232 Transceiver&lt;br /&gt;
    * 1 9V Batterieclip&lt;br /&gt;
    * 6 Kabelbinder&lt;br /&gt;
    * 1 RS232 Stecker&lt;br /&gt;
    * 1 Monitorstecker (älter)&lt;br /&gt;
    * 1 ATA Kabel&lt;br /&gt;
    * 1 Schlitzschraubenzieher&lt;br /&gt;
    * 3 2,5A Glassicherungen (zB. für den RP6)&lt;br /&gt;
    * 1 Piezo summer (groß)&lt;br /&gt;
    * 2 DVDs (OVP)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 * HannoHupmann&lt;br /&gt;
    * 2 Servos&lt;br /&gt;
    * 1 LCD Display&lt;br /&gt;
    * 1 OLED Display &lt;br /&gt;
    * 1 Nummernfeld &lt;br /&gt;
    * 1 DVD - AI &lt;br /&gt;
    * 2 Kleine Lautsprecher&lt;br /&gt;
    * 2 5x2 Wannensteckerbuchsen&lt;br /&gt;
&lt;br /&gt;
=== Der Inhalt ===&lt;br /&gt;
Hier sollte immer der aktuelle Inhalt der Kiste zu finden sein. Also: entnommene Teile bitte löschen, neue Teile dazu schreiben:&lt;br /&gt;
&lt;br /&gt;
'''* In der Kiste:'''&lt;br /&gt;
     * 1 Tüte mit großen Elkos&lt;br /&gt;
     * 3 Tütchen LEDs&lt;br /&gt;
     * 1 Tütchen PTCs (noch 3 St.)&lt;br /&gt;
     * 2 Schrittmotoren (CD-Laufwerk)&lt;br /&gt;
     * 4 kleine Motoren&lt;br /&gt;
     * 1 kleiner Getriebemotor&lt;br /&gt;
     * 1 Hochstrompoti&lt;br /&gt;
     * 1 Steckernetzteil&lt;br /&gt;
     * 2 Europlatinen einseitig Kupfer (zum Ätzen)&lt;br /&gt;
     * etwas Moosgummi (antistatisch für ICs) ('''Eine Platte ging für die Box drauf''')&lt;br /&gt;
     * 3 große Mechanikbauteile aus Metall, 3 aus Platik&lt;br /&gt;
     * ein TT-Ball, zwei &amp;quot;Continental&amp;quot;-Flummis&lt;br /&gt;
     * ein paar Meter Doppellitze&lt;br /&gt;
     * Cuttermesser&lt;br /&gt;
     * Bleistifte, Filzstifte, Lineal&lt;br /&gt;
     * 5 SMD Sortimentboxen&lt;br /&gt;
     * 5 blaue Transportboxen&lt;br /&gt;
     * 1 Schlüssellampe von Ansmann&lt;br /&gt;
     * 1 240x128 Display (Ich weiß allerdings nicht, obs noch geht)&lt;br /&gt;
     * 2 kleine Rollen Flachbandkabel&lt;br /&gt;
     * 8 Füße für Gehäuse / Platinen&lt;br /&gt;
     * 1 Musik CD&lt;br /&gt;
     * 1 Buch (kein Fachbuch)&lt;br /&gt;
     * 1 kleines Spiel&lt;br /&gt;
     * 1 Tüte Endtaster&lt;br /&gt;
     * 2 9-Pol D-Sub Stecker Flachbandkabelverbindung&lt;br /&gt;
     * 4 ältere große Schalter&lt;br /&gt;
     * 1 Gehäuse Anschluss mit Schraubklemme&lt;br /&gt;
     * 1 Tüte Abstandsbolzen (bei Interesse das nächste Mal auch mehr)&lt;br /&gt;
     * 1 Tüte Kabeldurchführungen (bei Interesse auch mehr)&lt;br /&gt;
     * 1 Tüte Schlauchanschlüsse blau (bei Interesse auch mehr)&lt;br /&gt;
     * 100 M3 Stoppmuttern&lt;br /&gt;
     * 6 IRF 540N&lt;br /&gt;
     * 1 Robo 168 Platine &lt;br /&gt;
     * 1 Staubsaugermotor mit Gebläse&lt;br /&gt;
     * 1 serielle Maus&lt;br /&gt;
     * 1 großer Schalter&lt;br /&gt;
     * 3 Endtaster&lt;br /&gt;
     * 1 Kunstoffgehäuse&lt;br /&gt;
     * 15 Wiederverschließbare Beutel    &lt;br /&gt;
     * '''Außerdem noch eine Sortimentbox !!! Wichtig: !!! Diese nicht herausnehmen!!!'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''* In der Sortimentbox in der Kiste:'''&lt;br /&gt;
     * kleine Elkos &amp;amp; HF-Kondensatoren&lt;br /&gt;
     * 4 FETs IRF520&lt;br /&gt;
     * 1 SRAM 62LV1025-55&lt;br /&gt;
     * 3 NE567&lt;br /&gt;
     * X Logikgatter HEF40xx&lt;br /&gt;
     * 3 EPROMs&lt;br /&gt;
     * X diverse SMD-ICs&lt;br /&gt;
     * X Widerstandsnetzwerke 4k7-9&lt;br /&gt;
     * X Transistoren&lt;br /&gt;
     * X Schalter und Taster&lt;br /&gt;
     * 1 25pol D-Sub-Stecker, Lötanschluss&lt;br /&gt;
     * Drucker-LCD-Display&lt;br /&gt;
     * '''1''' Zahnarztbohrer (es waren 4!!!)&lt;br /&gt;
     * X kleine Mechanikbauteile aus Platik&lt;br /&gt;
     * 4 7-Segmentanzeigen&lt;br /&gt;
     * 1 EEPROM 24C256&lt;br /&gt;
     * ATMega 8 SMD&lt;br /&gt;
&lt;br /&gt;
'''* ... und natürlich das Logbuch'''&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Anmerkungen ==&lt;br /&gt;
Noch Fragen? Anregungen? &amp;lt;br /&amp;gt;&lt;br /&gt;
Bei Bedarf wird hier ergänzt&lt;/div&gt;</summary>
		<author><name>HannoHupmann</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Wanderkiste&amp;diff=16574</id>
		<title>Wanderkiste</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Wanderkiste&amp;diff=16574"/>
				<updated>2010-05-05T08:21:29Z</updated>
		
		<summary type="html">&lt;p&gt;HannoHupmann: /* Die Liste */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Entstanden auf Grund verschiedener Anregungen im Internet. Jeder Bastler besitzt Bauteile, die er selbst nicht braucht. Zum Wegwerfen zu schade - aber von möglichem Nutzen für andere Bastler.&lt;br /&gt;
&lt;br /&gt;
==Die Idee / Das Konzept:==&lt;br /&gt;
*Es wird eine Kiste mit Dingen befüllt, die man nicht mehr braucht oder von denen man zu viel hat.&amp;lt;br /&amp;gt;Danach wird die Kiste an einen Interessenten weitergeben / verschickt.&amp;lt;br /&amp;gt;Dieser kann sich dann Dinge, die hineingelegt wurden, aussuchen und danach auch wieder neue Sachen rein legen.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Interessenten tragen sich in eine Liste ein, aber dazu später mehr.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Für alles, was man sich aus der Kiste heraus nimmt,&amp;lt;br /&amp;gt;legt man etwas gleichwertig nützliches wieder hinein.&amp;lt;br /&amp;gt;Wobei hier nicht der finanzielle Wert im Vordergrund stehen soll,&amp;lt;br /&amp;gt;sondern der Nutzen bzw. die Freude, die ein Empfänger daran haben könnte.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Hierbei ist es wichtig, fair zu bleiben, d.h. nehmt nur das raus, was ihr auch brauchen könnt.&amp;lt;br /&amp;gt;Wenn ihr etwas wertvolleres herausnehmt, dann legt auch etwas wertvolleres wieder rein,&amp;lt;br /&amp;gt;sonst ist die Kiste nach ein paar Stationen schon wieder leer bzw. mit irgendwelchem Schrott gefüllt, und dass will keiner von uns.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Die Regeln (Kurzversion)==&lt;br /&gt;
* Nimmt man etwas aus der Kiste, so sollte man auch etwas hinein legen, das vergleichbaren Wert hat - nicht unbedingt finanziell, sondern von möglichem Nutzen für Andere.  &lt;br /&gt;
* Keinen Schrott in die Kiste legen (wie durchgebrannte Baugruppen, gebrochene Displays etc). Bei defekten Platinen, wenn möglich, die Art des Schadens angeben.&lt;br /&gt;
* Keine PC-Bauteile hineinlegen. Die machen eine Kiste schnell extrem schwer.&lt;br /&gt;
* Kiste, wenn irgend möglich, nicht länger als eine Woche behalten.&lt;br /&gt;
* Versand bitte nur als Paket (versichert) mit Hermes oder DHL.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Regeln (Ausführlich) ==&lt;br /&gt;
&lt;br /&gt;
===Wiki-Eintrag===&lt;br /&gt;
Jeder, der die Kiste bekommt, also jede Station, muss einen Eintrag hier in diesem Wiki-Artikel hinterlassen.&amp;lt;br /&amp;gt;&lt;br /&gt;
Darin enthalten sollte sein:&amp;lt;br /&amp;gt;&lt;br /&gt;
    * Ein Bild des Zustandes beim Empfang der Kiste&lt;br /&gt;
    * Datum bei Erhalt der Kiste&lt;br /&gt;
    * Was herausgenommen wurde&lt;br /&gt;
    * Was hineingelegt wurde&lt;br /&gt;
    * Ein Bild der Kiste bei Auslieferung&lt;br /&gt;
    * Datum bei Versand der Kiste&lt;br /&gt;
&lt;br /&gt;
===Die Empfänger / Der Versandt ===&lt;br /&gt;
* Aus der im Wiki veröffentlichten Liste kann man sich einen neuen Empfänger heraussuchen &amp;lt;br /&amp;gt;(wenn möglich nach der Reihenfolge gehen, der neue Empfänger sollte aber die Kiste noch nicht erhalten haben) Mit diesem tritt man zuallererst in Kontakt, dass er sich auf den Empfang der Kiste vorbereiten kann und nicht z.B. im Urlaub ist.&lt;br /&gt;
* Der neue Empfänger sollte, wenn möglich, diese Kiste noch nicht gehabt haben.&lt;br /&gt;
* Bitte die Adressaufkleber auf der Kiste komplett entfernen, sonst könnte es Probleme geben.&lt;br /&gt;
* Wenn die Kiste langsam kaputt geht, kann diese gerne ersetzt werden.&lt;br /&gt;
* Die Kiste immer als versichertes Paket versenden (wegen Trackingnummer).&lt;br /&gt;
* Die Kiste darf nur innerhalb Deutschlands versendet werden.&lt;br /&gt;
* Es ist natürlich auch möglich die Kiste persönlich weiter zu geben!&lt;br /&gt;
* Die Kiste sollte nach spätestens einer Woche weiter geschickt werden.&lt;br /&gt;
&lt;br /&gt;
===Versandinfo===&lt;br /&gt;
* [https://privatpaketservice.hlg.de/wps/portal/PRIPS_DEU/PREISE Hermes]: 4-9 Euro (abhängig von Größe); Versichert; Bis 25kg. Abgabe an [http://customer3.map24.com/hermes/?lang=de-DE Paketshops] oder Abholung von Zuhause (dann etwas teurer).&lt;br /&gt;
&lt;br /&gt;
* [http://www.dhl.de/de/paket/privatkunden/preisuebersicht.html DHL]: 3-13 Euro (abhängig von Größe und Gewicht). Versichert.&lt;br /&gt;
&lt;br /&gt;
===Das Log-Büchlein===&lt;br /&gt;
In der Kiste liegt ein kleines Buch. Dies ist das Logbuch, d.h. hier wird der Lebenslauf der Kiste beschrieben.&amp;lt;br /&amp;gt;&lt;br /&gt;
Hier tragt ihr auch folgendes ein:&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    * Datum bei Erhalt&lt;br /&gt;
    * Was herausgenommen wurde&lt;br /&gt;
    * Was hineingelegt wurde&lt;br /&gt;
    * Datum bei Versand&lt;br /&gt;
    * Neuer Empfänger&lt;br /&gt;
&lt;br /&gt;
===Persönliche Briefe===&lt;br /&gt;
Natürlich dürfen für den nächsten Empfänger auch persönliche Briefe etc. mitgeschickt werden.&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Was darf rein, was nicht?==&lt;br /&gt;
===Rein darf===&lt;br /&gt;
    * Da wir hier im Roboternetz sind, darf natürlich alles rein, was mit Robotern zu tun hat,&lt;br /&gt;
      also sowohl Elektronisches wie auch mechanische Bauteile.&lt;br /&gt;
    * CDs, DVDs.&lt;br /&gt;
    * Funktionierender Technikkram (Keine veraltete PC Hardware).&lt;br /&gt;
    * Bücher (Keine veralteten Zeitschriften).&lt;br /&gt;
    * Werkzeug aller Art (nur Funktionierendes).&lt;br /&gt;
    * Spiele (PC &amp;amp; Gesellschaftsspiele).&lt;br /&gt;
    * Sonstiges Brauchbares.&lt;br /&gt;
    * Über gut verpackte Süßigkeiten freut sich der nächste bestimmt (Gummibärchen etc...).&lt;br /&gt;
&lt;br /&gt;
===Was nicht rein darf===&lt;br /&gt;
    * Unbrauchbarer Krempel.&lt;br /&gt;
    * Defekte, durchgebrannte, kaputte Bauteile.&lt;br /&gt;
    * Veraltete Zeitschriften / PC Hardware etc.&lt;br /&gt;
    * Zerbrechliche Sachen und Flüssigkeiten (bzw. Tassen oder Gläser gut verpacken!).&lt;br /&gt;
&lt;br /&gt;
===Bestückung der Kiste===&lt;br /&gt;
* Bei Entnahme einer Sache mit möglichst einer gleichwertigen Sache befüllen.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Die Kiste ist zu voll, was nun?==&lt;br /&gt;
* Ist die Kiste zu voll, sollte zuerst unnützer Schrott aussortiert werden. (Bitte auch im Wikibeitrag vermerken)&lt;br /&gt;
* Sollte die Kiste immer noch zu voll sein, dann sollte man die Kiste splitten.&lt;br /&gt;
#Ein neuer Karton muss her.&lt;br /&gt;
#Der Inhalt wird gleichmäßig aufgeteilt (etwa gleicher Wert, nicht die gleichen Sachen, sonst ist´s doof).&lt;br /&gt;
#Ein neues Büchlein ist Pflicht.&lt;br /&gt;
##Das Alte Büchlein komplett übertragen (nur Namen &amp;amp; Datum).&lt;br /&gt;
#Einer der entstehenden Kisten einen eigenen Namen geben.&lt;br /&gt;
#Der zweiten Kiste den Namen der aufgespaltenen Kiste geben und passenden Suffix dranhängen &amp;lt;br/&amp;gt;(z.B. nicht mehr ''Kistenname'', sondern ''Kistenname2'').&lt;br /&gt;
# Bitte an zwei verschiedene Empfänger verschicken.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Die Liste ==&lt;br /&gt;
'''Wanderkiste Interessenten Liste'''&lt;br /&gt;
Du willst auch mal eine Wanderkiste erhalten?&amp;lt;br /&amp;gt;&lt;br /&gt;
Dann schreibe doch hier folgende Dinge als Infos:&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- Deine Wünsche&amp;lt;br /&amp;gt;&lt;br /&gt;
- Wenn du willst: Was hast du zu bieten?&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
{{FarbigerRahmen|&lt;br /&gt;
Aus datenschutzrechtlichen Gründen und deinem eigenen Interesse bitte keine Adresse hier hin schreiben.&amp;lt;br /&amp;gt;&lt;br /&gt;
Kontakt kann über das Forum, das Nachrichtenmodul oder per Mail aufgenommen werden!&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier trägt sich jeder ein, der mitmachen möchte...&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&amp;quot;&lt;br /&gt;
|+ '''Interessenliste'''&lt;br /&gt;
|-&lt;br /&gt;
| '''Erhalten am (''Kiste'')'''|| '''Kontakt - Forum''' || '''Kontakt - RN-Wissen''' || '''Wünsche''' || '''zu Bieten''' || '''Sonstiges'''&lt;br /&gt;
|-&lt;br /&gt;
| '''11.11.2011''' (''Beispielkiste'') || [http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=ID Profilname] || [http://www.rn-wissen.de/index.php/Benutzer:Profilname Profilname] || Ich wünsche Mikrocontroller, Bauteile, CDs, DVDs || Ich biete einige seltene Bauteile z.B. ... || Hier z.B. eintragen ob eine Kiste gesplittet wurde&lt;br /&gt;
|-&lt;br /&gt;
|  || [http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=35267 Yaro] || [http://www.rn-wissen.de/index.php/Benutzer:Yaro Yaro] || Ungewöhnliche Sensoren, Mechanische Bauteile || Standardbauteile, Motoren, Zahnarzt-Bohrer || '''Sputnik erstellt am: 15.03.2010'''&lt;br /&gt;
|-&lt;br /&gt;
| '''18.03.2010''' (''Sputnik'') || [http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=36199 Williwilli] || [http://www.rn-wissen.de/index.php/Benutzer:Williwilli Williwilli] ||  ||  ||&lt;br /&gt;
|-&lt;br /&gt;
| '''25.03.2010''' (''Sputnik'') || [http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=42535 fUnK3r] || [http://www.rn-wissen.de/index.php/Benutzer:FUnK3r fUnK3r] || Natürlich alles mögliche an elektronischen Bauteilen und alles mögliche was mit Casemodding zu tun hat, außerdem gerne auch was Süßes und gute Bücher/DVD usw.|| Bauteile, Edelstahl Kabeldurchführungen, Schlauchverbinder, diverses anderes Kleinzeug ||&lt;br /&gt;
|-&lt;br /&gt;
| '''08.04.2010''' (''Sputnik'') || [http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=33426h Max Hinze] || [http://www.rn-wissen.de/index.php/Benutzer:Max_Hinze Max Hinze] || alles mögliche || Kleinzeugs, Platinen.etc. ||&lt;br /&gt;
|-&lt;br /&gt;
| '''15.04.2010''' (''Sputnik'')  || [http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=38729 Thund3r] || [http://www.rn-wissen.de/index.php/Benutzer:Thund3r Thund3r] || elektronische und mechanische Bauteile, Servos, Werkzeuge, Sensoren, Motoren Pfostenstecker o.ä.|| Werkzeug, LEDs, Bauteile, mechanische Komponenten etc. || &lt;br /&gt;
|-&lt;br /&gt;
| '''4.05.2010''' (''Sputnik'')|| [http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=16367 HannoHupmann] || [http://www.rn-wissen.de/index.php/Benutzer:HannoHupmann HannoHupmann] || || Servos, Displays, Bauteile, Diverses ||&lt;br /&gt;
|-&lt;br /&gt;
|  || [http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=40635 DeVlinder] || [http://www.rn-wissen.de/index.php/Benutzer:DeVlinder DeVlinder] || || Standardbauteile, H-Brücken-ICs (SMD), Stecker-/Buchsenleisten, Beschleunigungssensor||&lt;br /&gt;
|-&lt;br /&gt;
|  || [http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=41246 asurofreak.] || [http://www.rn-wissen.de/index.php/Benutzer:Asurofreak. asurofreak.] || µC´s, Bauteile(helle LED´s),Servos,Robo Control 168... || Netzteile, Bauteile aller Art, ... ||&lt;br /&gt;
|-&lt;br /&gt;
|  || [http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=44703 Alex.] || [http://www.rn-wissen.de/index.php/Benutzer:MrRoboStriker MrRoboStriker.] || Sensoren,Servos,Bücher, alles mögliche... || Motoren,Potis,Stiftleisten =)tüten Alles mögliche... || Foren Name mit je einem unter und senkrecht Strich vorne und hinten!&lt;br /&gt;
|-&lt;br /&gt;
|  || [http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=37645 tobi.robotz] || [http://www.rn-wissen.de/index.php/Benutzer:Haurucki haurucki] ||Sensoren, Servos, Werkzeug, alles ||AD-Wandler mit LCD Display, LCD-Displays mit Steuer-IC, Motoren, Zugmagnet, Vakuumpumpe, und mehr. ||&lt;br /&gt;
|-&lt;br /&gt;
|  || [http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=42295 Martinius11] || [http://www.rn-wissen.de/index.php/Benutzer:Martinius Martinius] || LEDs, Servos, Thyristoren, Flachbandkabel || Wiederstände, alle möglichen Bauteile, Metallplaten, defekten Asuro(Platine Kaput Bauteile OK) || Bitte vor schicken informieren!&lt;br /&gt;
|-&lt;br /&gt;
|  || [...] || [...] || || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Kiste '''Sputnik''' ==&lt;br /&gt;
=== Der Weg ===&lt;br /&gt;
* '''''[http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=35267 Yaro]''''' geschickt an '''''[http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=36199 Williwilli]''''' am '''''15.03.2010'''''&lt;br /&gt;
* '''''[http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=36199 Williwilli]''''' Kiste erhalten am '''''18.03.2010'''''&lt;br /&gt;
* '''''[http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=36199 Williwilli]''''' geschickt an '''''[http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=42535 fUnK3r]''''' am '''''24.03.2010'''''&lt;br /&gt;
* '''''[http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=42535 fUnK3r]''''' Kiste erhalten am '''''25.03.2010'''''&lt;br /&gt;
* '''''[http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=42535 fUnK3r]''''' geschickt an '''''[http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=33426h Max Hinze]''''' am '''''06.04.2010'''''&lt;br /&gt;
* '''''[http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=33426h Max Hinze]''''' Kiste erhalten am '''''08.04.2010'''''&lt;br /&gt;
* '''''[http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=33426h Max Hinze]''''' geschickt an '''''[http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=38729 Thund3r]''''' am '''''14.04.2010'''''&lt;br /&gt;
* '''''[http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=38729 Thund3r]''''' Kiste erhalten am '''''15.04.2010'''''&lt;br /&gt;
&lt;br /&gt;
[[Bild:Karte_Deutschland_Wanderkiste.JPG]]&lt;br /&gt;
&lt;br /&gt;
=== Online Logbuch ===&lt;br /&gt;
    * Foto beim Öffnen der Kiste&lt;br /&gt;
    * Was herausgenommen wurde&lt;br /&gt;
    * Was hineingelegt wurde&lt;br /&gt;
    * Ein Bild der Kiste bei Auslieferung&lt;br /&gt;
    * Datum bei Versand der Kiste&lt;br /&gt;
&lt;br /&gt;
''Williwilli''&lt;br /&gt;
Foto beim Öffnen der Kiste am 19.03.2010&amp;lt;br/&amp;gt;[[Bild:Wanderkiste.JPG]]&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Foto beim Versand der Kiste am 24.03.2010&amp;lt;br/&amp;gt;[[Bild:Wanderkiste1.JPG]]&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
''fUnK3r''&lt;br /&gt;
Foto beim Empfang der Kiste am 25.03.2010&amp;lt;br/&amp;gt;[[Bild:Wanderkiste_erhalten.JPG]]&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Foto beim Öffnen der Kiste am 25.03.2010&amp;lt;br/&amp;gt;[[Bild:Wanderkiste_inhalt.jpg]]&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Foto von der neuen Box in der Kiste am 01.04.2010&amp;lt;br/&amp;gt;[[Bild:Wanderkiste_neue_box.jpg]]&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Foto vom Inhalt der Kiste am 02.04.2010&amp;lt;br/&amp;gt;[[Bild:Wanderkiste_versandt.jpg]]&amp;lt;br/&amp;gt;&lt;br /&gt;
Auf der Seite liegend das Logbuch und das perfekte Füllmaterial, damit die Kiste keinen Schaden mehr nimmt.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Max Hinze Foto beim Öffnen der Kiste am 08.04.2010&amp;lt;br/&amp;gt;[[Bild:Wanderkiste-öffnen.JPG]]&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Thund3r Foto beim Öffnen der Kiste am 14.04.2010&amp;lt;br/&amp;gt;  [[Bild:Aaa.JPG]]&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Thund3r Foto vom Inhalt der Kiste &amp;lt;br/&amp;gt; [[Bild:Bbb.JPG]]&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Herausgenommen:'''&lt;br /&gt;
 * Williwilli&lt;br /&gt;
    * 3 St. NE567&lt;br /&gt;
    * 2 St 100nF HF-Kondensatoren&lt;br /&gt;
    * 8 St. Taster&lt;br /&gt;
    * 5 St. IRF520&lt;br /&gt;
    * 1 St. Zahnarztbohrer&lt;br /&gt;
    * 2 St. Laborkabel&lt;br /&gt;
&lt;br /&gt;
 * fUnK3r&lt;br /&gt;
    * 3   St. EPROM&lt;br /&gt;
    * 100 St. LEDs 5mm&lt;br /&gt;
    * 1   St. Zahnarztbohrer&lt;br /&gt;
    * 1   St. Platine mit Tastern &amp;amp; LEDs&lt;br /&gt;
    * 2   St. PTC&lt;br /&gt;
&lt;br /&gt;
 * Max Hinze&lt;br /&gt;
    * 4   St. Gehäusefüße&lt;br /&gt;
    * 2   St. 7- Segmentanzeigen&lt;br /&gt;
    * 2   St. Schiebeschalter&lt;br /&gt;
    * 2   St. Endtaster&lt;br /&gt;
    * 1   St. Taster&lt;br /&gt;
    * 1   St. Zahnarztbohrer&lt;br /&gt;
    * 3   St. Buchsenleisten&lt;br /&gt;
    * 1   St. 9-Pol D-Sub Buchse&lt;br /&gt;
&lt;br /&gt;
 * Thund3r&lt;br /&gt;
    * 4   St. Schiebeschalter&lt;br /&gt;
    * 8   St. Abstanzbolzen&lt;br /&gt;
    * 1   St. 8 pol. Flachbandkabe&lt;br /&gt;
    * 2   St. 7-Segmentanzeigen&lt;br /&gt;
    * 75  St. 3mm LEDs&lt;br /&gt;
    * 1   St. kleiner Motor&lt;br /&gt;
    * 2   St. IEC 60384&lt;br /&gt;
    * 1   St. 9A473g&lt;br /&gt;
    * 1   St. Tischtennisball&lt;br /&gt;
    * 6   St. Beutel&lt;br /&gt;
    * 1   St. Staubsaugmotor&lt;br /&gt;
&lt;br /&gt;
'''Hineingelegt:'''&lt;br /&gt;
 * Williwilli&lt;br /&gt;
    * 3 Taster, 1 Schalter&lt;br /&gt;
    * 25pol D-Sub-Stecker, Lötanschluß&lt;br /&gt;
    * 6 EPROMs&lt;br /&gt;
    * diverse SMD-ICs&lt;br /&gt;
    * 100 LEDs 5mm - 4 Farben&lt;br /&gt;
    * 75 LEDs 3mm - 3 Farben&lt;br /&gt;
    * Steckernetzteil 6,8V DC&lt;br /&gt;
    * 5 dicke PTCs von ITT&lt;br /&gt;
    * 2 Europlatinen einseitig Kupfer (zum Ätzen)&lt;br /&gt;
    * etwas Moosgummi (antistatisch für ICs)&lt;br /&gt;
&lt;br /&gt;
 * fUnK3r&lt;br /&gt;
    * 3 kleine Motoren&lt;br /&gt;
    * 4 7-Segmentanzeigen&lt;br /&gt;
    * 5 Schiebeschalter&lt;br /&gt;
    * 5 SMD Sortimentboxen&lt;br /&gt;
    * 5 blaue Transportboxen&lt;br /&gt;
    * 50 LEDs grün 5mm (Low Current)&lt;br /&gt;
    * 50 LEDs gelb 3mm&lt;br /&gt;
    * 1 Schlüssellampe von Ansmann&lt;br /&gt;
    * 1 240x128 Display (Ich weiß allerdings nicht, obs noch geht)&lt;br /&gt;
    * 2 kleine Rollen Flachbandkabel&lt;br /&gt;
    * 12 Füße für Gehäuse / Platinen&lt;br /&gt;
    * 1 Musik CD&lt;br /&gt;
    * 1 Buch (kein Fachbuch)&lt;br /&gt;
    * 1 kleines Spiel&lt;br /&gt;
    * 4 Endtaster&lt;br /&gt;
    * 2 9-Pol D-Sub (Stecker/Buchse) Flachbandkabelverbindung&lt;br /&gt;
    * 4 ältere große Schalter&lt;br /&gt;
    * 1 Getriebemotor&lt;br /&gt;
    * 3 Buchsenleisten&lt;br /&gt;
    * 1 Gehäuse Anschluss mit Schraubklemme&lt;br /&gt;
    * 12 Abstandsbolzen (bei Interesse das nächste Mal auch mehr)&lt;br /&gt;
    * 10 Kabeldurchführungen (bei Interesse auch mehr)&lt;br /&gt;
    * 20 Schlauchanschlüsse blau (bei Interesse auch mehr)&lt;br /&gt;
    * Außerdem noch eine Sortimentbox '''!!! Wichtig: !!! Diese nicht herausnehmen!!!'''&lt;br /&gt;
&lt;br /&gt;
 * Max Hinze&lt;br /&gt;
    * 100 M3 Stoppmuttern&lt;br /&gt;
    * 6 IRF 540N&lt;br /&gt;
    * 1 Robo 168 Platine&lt;br /&gt;
    * 1 Staubsaugermotor mit Gebläse&lt;br /&gt;
    * 1 serielle Maus&lt;br /&gt;
    * 1 großer Schalter&lt;br /&gt;
    * 10 Schiebeschalter&lt;br /&gt;
    * 3 Endtaster&lt;br /&gt;
    * 1 EEPROM 24C256&lt;br /&gt;
    * 1 ATMega 8 SMD&lt;br /&gt;
    * 1 Kunstoffgehäuse&lt;br /&gt;
    * 15 Wiederverschlißbare Beutel&lt;br /&gt;
&lt;br /&gt;
 * Thund3r&lt;br /&gt;
    * 1 Asuro RS232 Transceiver&lt;br /&gt;
    * 1 9V Batterieclip&lt;br /&gt;
    * 6 Kabelbinder&lt;br /&gt;
    * 1 RS232 Stecker&lt;br /&gt;
    * 1 Monitorstecker (älter)&lt;br /&gt;
    * 1 ATA Kabel&lt;br /&gt;
    * 1 Schlitzschraubenzieher&lt;br /&gt;
    * 3 2,5A Glassicherungen (zB. für den RP6)&lt;br /&gt;
    * 1 Piezo summer (groß)&lt;br /&gt;
    * 2 DVDs (OVP)&lt;br /&gt;
&lt;br /&gt;
=== Der Inhalt ===&lt;br /&gt;
Hier sollte immer der aktuelle Inhalt der Kiste zu finden sein. Also: entnommene Teile bitte löschen, neue Teile dazu schreiben:&lt;br /&gt;
&lt;br /&gt;
'''* In der Kiste:'''&lt;br /&gt;
     * 1 Tüte mit großen Elkos&lt;br /&gt;
     * 3 Tütchen LEDs&lt;br /&gt;
     * 1 Tütchen PTCs (noch 3 St.)&lt;br /&gt;
     * 2 Schrittmotoren (CD-Laufwerk)&lt;br /&gt;
     * 4 kleine Motoren&lt;br /&gt;
     * 1 kleiner Getriebemotor&lt;br /&gt;
     * 1 Hochstrompoti&lt;br /&gt;
     * 1 Steckernetzteil&lt;br /&gt;
     * 2 Europlatinen einseitig Kupfer (zum Ätzen)&lt;br /&gt;
     * etwas Moosgummi (antistatisch für ICs) ('''Eine Platte ging für die Box drauf''')&lt;br /&gt;
     * 3 große Mechanikbauteile aus Metall, 3 aus Platik&lt;br /&gt;
     * ein TT-Ball, zwei &amp;quot;Continental&amp;quot;-Flummis&lt;br /&gt;
     * ein paar Meter Doppellitze&lt;br /&gt;
     * Cuttermesser&lt;br /&gt;
     * Bleistifte, Filzstifte, Lineal&lt;br /&gt;
     * 5 SMD Sortimentboxen&lt;br /&gt;
     * 5 blaue Transportboxen&lt;br /&gt;
     * 1 Schlüssellampe von Ansmann&lt;br /&gt;
     * 1 240x128 Display (Ich weiß allerdings nicht, obs noch geht)&lt;br /&gt;
     * 2 kleine Rollen Flachbandkabel&lt;br /&gt;
     * 8 Füße für Gehäuse / Platinen&lt;br /&gt;
     * 1 Musik CD&lt;br /&gt;
     * 1 Buch (kein Fachbuch)&lt;br /&gt;
     * 1 kleines Spiel&lt;br /&gt;
     * 1 Tüte Endtaster&lt;br /&gt;
     * 2 9-Pol D-Sub Stecker Flachbandkabelverbindung&lt;br /&gt;
     * 4 ältere große Schalter&lt;br /&gt;
     * 1 Gehäuse Anschluss mit Schraubklemme&lt;br /&gt;
     * 1 Tüte Abstandsbolzen (bei Interesse das nächste Mal auch mehr)&lt;br /&gt;
     * 1 Tüte Kabeldurchführungen (bei Interesse auch mehr)&lt;br /&gt;
     * 1 Tüte Schlauchanschlüsse blau (bei Interesse auch mehr)&lt;br /&gt;
     * 100 M3 Stoppmuttern&lt;br /&gt;
     * 6 IRF 540N&lt;br /&gt;
     * 1 Robo 168 Platine &lt;br /&gt;
     * 1 Staubsaugermotor mit Gebläse&lt;br /&gt;
     * 1 serielle Maus&lt;br /&gt;
     * 1 großer Schalter&lt;br /&gt;
     * 3 Endtaster&lt;br /&gt;
     * 1 Kunstoffgehäuse&lt;br /&gt;
     * 15 Wiederverschließbare Beutel    &lt;br /&gt;
     * '''Außerdem noch eine Sortimentbox !!! Wichtig: !!! Diese nicht herausnehmen!!!'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''* In der Sortimentbox in der Kiste:'''&lt;br /&gt;
     * kleine Elkos &amp;amp; HF-Kondensatoren&lt;br /&gt;
     * 4 FETs IRF520&lt;br /&gt;
     * 1 SRAM 62LV1025-55&lt;br /&gt;
     * 3 NE567&lt;br /&gt;
     * X Logikgatter HEF40xx&lt;br /&gt;
     * 3 EPROMs&lt;br /&gt;
     * X diverse SMD-ICs&lt;br /&gt;
     * X Widerstandsnetzwerke 4k7-9&lt;br /&gt;
     * X Transistoren&lt;br /&gt;
     * X Schalter und Taster&lt;br /&gt;
     * 1 25pol D-Sub-Stecker, Lötanschluss&lt;br /&gt;
     * Drucker-LCD-Display&lt;br /&gt;
     * '''1''' Zahnarztbohrer (es waren 4!!!)&lt;br /&gt;
     * X kleine Mechanikbauteile aus Platik&lt;br /&gt;
     * 4 7-Segmentanzeigen&lt;br /&gt;
     * 1 EEPROM 24C256&lt;br /&gt;
     * ATMega 8 SMD&lt;br /&gt;
&lt;br /&gt;
'''* ... und natürlich das Logbuch'''&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Anmerkungen ==&lt;br /&gt;
Noch Fragen? Anregungen? &amp;lt;br /&amp;gt;&lt;br /&gt;
Bei Bedarf wird hier ergänzt&lt;/div&gt;</summary>
		<author><name>HannoHupmann</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=TWI_Slave_mit_avr-gcc&amp;diff=16186</id>
		<title>TWI Slave mit avr-gcc</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=TWI_Slave_mit_avr-gcc&amp;diff=16186"/>
				<updated>2010-04-05T17:33:58Z</updated>
		
		<summary type="html">&lt;p&gt;HannoHupmann: /* Slave Testprogramm */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Programm für einen AVR mit [[TWI]] (Hardware-[[I2C]])-Schnittstelle als Slave.&lt;br /&gt;
Manchmal stellt sich die Aufgabe, mehrere AVRs per [[I2C]] zu vernetzen. Ein Beispiel ist die Erweiterung eines bestehenden Systems um einen leistungsstärkeren Controller. Dies ist etwa beim [[Asuro]] oder [[Yeti]] denkbar, um z.B. mehr Ein/Ausgänge oder Speicherplatz zu bekommen.&lt;br /&gt;
&lt;br /&gt;
Man kann aber beim Bau eines Roboters auch von Anfang an auf ein System von mehreren vernetzten Controllern setzen. So kann man verschiedene Aufgabe, die weitgehend unabhängig voneinader gleichzeitg erledigt werden müssen, besser verteilen. Denkbar ist z.B. ein Controller für die Motorsteuerung, einer für die Sensorik, einer für Ein-und Ausgabe (wie LCD und Bedientaster),... , und ein zentraler Controller, der die Richtung vorgibt und alle anderen Controller mit Befehlen versorgt. Ein konkretes Beispiel ist der Roboterbausatz Nibo (siehe: [http://www.nicai-systems.de/nibo.html]) von nicai-systems, der einen Atmel ATmega128 als Hauptcontroller und zwei Atmel ATtiny44 als Controller für die Motorsteuerung und die IR-Sensorik einsetzt. Die Kommunikation läuft mit 400 kHz über den I2C-Bus mit dem ATmega128 als Master. &lt;br /&gt;
&lt;br /&gt;
Außerdem wurde der Code für zwei Mega32 mit dem AVR Studio getestet Beachte: im AVR-Studio ist default ein ATmega128 eingestellt, unter Projekt -&amp;gt; Configuration Options kann das Device geändert werden, außerdem ist die Frequency einzustellen. In meinem Fall waren es 7372800Hz da ich in der Schaltung einen entsprechenden Quarz eingebaut habe. Die Verbindung zwischen Master und Slave erfolgt über die Pins 22 (SCL) und 23 (SDA) und gemeinsamer GND. Abschlusswiderstände (4,7kOhm) nicht vergessen, am besten beim Master, siehe auch I2C-Definitionen.   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Schließlich kann ein entsprechend programmierter AVR auch als Ersatz für handelsübliche I2C-Bauteile dienen. Der kleinste AVR mit Hardware-I2C, der ATmega48, ist mit 1,30€ (Reichelt) billiger als viele normale I2C-ICs. Er kann bei entsprechender Programmierung z.B. die Aufgaben von zwei PCF8574 (8bit-Portexpander, 1,25€) und einem PCF8591 (4fach AD-Wandler, 2,35€) übernehmen und außerdem noch als I2C-EEPROM mit 256 Bytes dienen. &lt;br /&gt;
&lt;br /&gt;
Das folgende Programm (twislave.c) steuert das TWI (Hardware-I2C)-Interface eines AVRs als Slave an. Es müsste auf allen AVRs der Mega-Reihe funktionieren, die über eine TWI-Schnittstelle verfügen. &lt;br /&gt;
&lt;br /&gt;
Das System ist als eine Art Dualport-RAM konzipiert, Master und Slave teilen sich also einen Speicherbereich und können darüber Daten austauschen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Master ==&lt;br /&gt;
Ein Testprogramm für den Master. Es wird die [http://homepage.hispeed.ch/peterfleury/avr-software.html#libs I2C-Master-Bibliothek von Peter Fleury] verwendet.&lt;br /&gt;
Es wird geprüft, ob der Slave bereit ist, dann werden drei Bytes erst in den Slave geschrieben, und anschließend wieder ausgelesen.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// I2C-Master-Routinen von Peter Fleury verwenden &lt;br /&gt;
// siehe http://homepage.hispeed.ch/peterfleury/avr-software.html#libs&lt;br /&gt;
// Hier sind auch die Datein: i2cmaster.h und twimaster.c zu finden, die benötigt werden&lt;br /&gt;
// (wer mit AVR-Studio arbeitet braucht nur diese Datein)&lt;br /&gt;
// Letztes Update des Codes 5. April 2010 durch HannoHupmann&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;quot;i2cmaster.h&amp;quot;  &lt;br /&gt;
#define SLAVE_ADRESSE 0x50&lt;br /&gt;
&lt;br /&gt;
uint8_t byte1 = 42;&lt;br /&gt;
uint8_t byte2 = 43;&lt;br /&gt;
uint8_t byte3 = 44;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  i2c_init();         // init I2C interface&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if(!(i2c_start(SLAVE_ADRESSE+I2C_WRITE))) //Slave bereit zum schreiben?&lt;br /&gt;
{&lt;br /&gt;
  i2c_write(0x00);  // Buffer Startadresse setzen 	&lt;br /&gt;
  i2c_write(byte1); // Drei Bytes schreiben...&lt;br /&gt;
  i2c_write(byte2); &lt;br /&gt;
  i2c_write(byte3); &lt;br /&gt;
  i2c_stop();       // Zugriff beenden&lt;br /&gt;
}&lt;br /&gt;
else&lt;br /&gt;
{&lt;br /&gt;
  /* Hier könnte eine Fehlermeldung ausgegeben werden... */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if(!(i2c_start(SLAVE_ADRESSE+I2C_WRITE))) //Slave bereit zum lesen?&lt;br /&gt;
{&lt;br /&gt;
  i2c_write(0x00); //Buffer Startadresse zum Auslesen&lt;br /&gt;
  i2c_rep_start(SLAVE_ADRESSE+I2C_READ); //Lesen beginnen&lt;br /&gt;
&lt;br /&gt;
  byte1= i2c_readAck(); // Bytes lesen...&lt;br /&gt;
  byte2= i2c_readAck();&lt;br /&gt;
  byte3= i2c_readNak(); // letztes Byte lesen, darum kein ACK&lt;br /&gt;
  i2c_stop();           // Zugriff beenden&lt;br /&gt;
} &lt;br /&gt;
else&lt;br /&gt;
{&lt;br /&gt;
  /* Hier könnte eine Fehlermeldung ausgegeben werden... */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if ((byte1 != 42)||(byte2 != 43)||(byte3 != 44))&lt;br /&gt;
{&lt;br /&gt;
  /* Die Bytes wurden nicht korrekt übertragen und wieder gelesen! */ &lt;br /&gt;
}&lt;br /&gt;
    for(;;);	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Code wurde von HannoHupmann auf einem Mega32 getestet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Code sollte ohne Probleme kompiliert werden, eventuell fehlen die oben genannten Datein wenn es nicht klappt.&lt;br /&gt;
&lt;br /&gt;
== Slave == &lt;br /&gt;
Hier soll nun der Code behandelt werden der für den Slave-Controller notwendig ist. Der vorgestellte Code schreibt die Register des Slaves an die Serielle Schnittstelle, mit einem Terminal Programm kann man sich die Ausgabe ansehen und überprüfen ob alles korrekt funktioniert. &lt;br /&gt;
Der Code ist wieder an den von Peter Fleury angelehnt.&lt;br /&gt;
&lt;br /&gt;
Für den Mega32 hab ich die twislave.c nicht gebraucht. Dafür aber die uart.c und uart.h welche sich auch bei Peter Fleury finden lassen. Diese müssen nicht angepasst werden. Wichtig ist die richtige Frquenz sonst ist die Ausgabe nicht korrekt. Der Slave sollte ohne Master folgende Ausgabe haben: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
i2cdata: &lt;br /&gt;
10&lt;br /&gt;
11&lt;br /&gt;
12&lt;br /&gt;
13&lt;br /&gt;
usw. &lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Die Register werden der Reihe nach mit ihrem Wert angezeigt. Wird der Master hinzugefügt sollte nun folgende Ausgabe im Terminal erscheinen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
i2cdata: &lt;br /&gt;
42&lt;br /&gt;
43&lt;br /&gt;
44&lt;br /&gt;
13&lt;br /&gt;
usw. &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Slave Testprogramm ==&lt;br /&gt;
Ein Testprogramm für den Slave. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
Testprogramm für den Slave &lt;br /&gt;
Der Buffer wird mit Werten gefüllt. Dann wird er fortlaufend über die serielle Schnittstelle ausgegeben.&lt;br /&gt;
*/&lt;br /&gt;
#include &amp;lt;util/twi.h&amp;gt; 		//enthält z.B. die Bezeichnungen für die Statuscodes in TWSR&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;  //dient zur Behandlung der Interrupts&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt; 		//definiert den Datentyp uint8_t&lt;br /&gt;
#include &amp;quot;twislave.h&amp;quot;&lt;br /&gt;
#include &amp;quot;uart.h&amp;quot;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#define BAUD 9600 //Baudrate&lt;br /&gt;
#define SLAVE_ADRESSE 0x50 //Die Slave-Adresse&lt;br /&gt;
&lt;br /&gt;
int main (void)&lt;br /&gt;
{&lt;br /&gt;
//TWI als Slave mit Adresse slaveadr starten&lt;br /&gt;
init_twi_slave(SLAVE_ADRESSE);&lt;br /&gt;
&lt;br /&gt;
//i2cdatamit Werten füllen, die der Master auslesen und ändern kann&lt;br /&gt;
for(uint8_t i=0;i&amp;lt;i2c_buffer_size;i++)&lt;br /&gt;
	{&lt;br /&gt;
		i2cdata[i]=10+i;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
//Serielle Schnittstelle aktivieren&lt;br /&gt;
uart_init((UART_BAUD_SELECT((BAUD),F_CPU)));&lt;br /&gt;
uart_puts(&amp;quot;I2C-Test\r\n&amp;quot;);&lt;br /&gt;
uart_puts(&amp;quot;Teste I2C-Slave mit Adresse &amp;quot;); uart_puti(SLAVE_ADRESSE);&lt;br /&gt;
uart_puts(&amp;quot;\r\n&amp;quot;);&lt;br /&gt;
uart_puts(&amp;quot;\r\n&amp;quot;); //Leerzeile&lt;br /&gt;
&lt;br /&gt;
//in einer Endlosschleife den Inhalt der Buffer ausgeben&lt;br /&gt;
while(1) &lt;br /&gt;
{&lt;br /&gt;
	uart_puts(&amp;quot;i2cdata:\r\n&amp;quot;);&lt;br /&gt;
	for(uint8_t i=0;i&amp;lt;i2c_buffer_size;i++)&lt;br /&gt;
		{&lt;br /&gt;
			uart_puti(i2cdata[i]);&lt;br /&gt;
			uart_puts(&amp;quot;\r\n&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	uart_puts(&amp;quot;\r\n&amp;quot;);//leerzeile&lt;br /&gt;
warte(500);&lt;br /&gt;
} //end.while&lt;br /&gt;
} //end.main&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Slave sourcecode ==&lt;br /&gt;
Die twislave.c für den Slave. Stand: 5.4.2010 &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;util/twi.h&amp;gt; 		//enthält z.B. die Bezeichnungen für die Statuscodes in TWSR&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;  //dient zur Behandlung der Interrupts&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt; 		//definiert den Datentyp uint8_t&lt;br /&gt;
#include &amp;quot;twislave.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
//%%%%%%%% Globale Variablen, die vom Hauptprogramm genutzt werden %%%%%%%%&lt;br /&gt;
/*Der Buffer, in dem die Daten gespeichert werden. &lt;br /&gt;
Aus Sicht des Masters läuft der Zugrif auf den Buffer genau wie bei einem I2C-EEPROm ab.&lt;br /&gt;
Für den Slave ist es eine globale Variable&lt;br /&gt;
*/&lt;br /&gt;
volatile uint8_t i2cdata[i2c_buffer_size+1];&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
volatile uint8_t buffer_adr; //&amp;quot;Adressregister&amp;quot; für den Buffer&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*Initaliserung des TWI-Inteface. Muss zu Beginn aufgerufen werden, sowie bei einem Wechsel der Slave Adresse&lt;br /&gt;
Parameter adr: gewünschte Slave-Adresse&lt;br /&gt;
*/&lt;br /&gt;
void init_twi_slave(uint8_t adr)&lt;br /&gt;
{&lt;br /&gt;
	TWAR= adr; //Adresse setzen&lt;br /&gt;
	TWCR &amp;amp;= ~(1&amp;lt;&amp;lt;TWSTA)|(1&amp;lt;&amp;lt;TWSTO);&lt;br /&gt;
	TWCR|= (1&amp;lt;&amp;lt;TWEA) | (1&amp;lt;&amp;lt;TWEN)|(1&amp;lt;&amp;lt;TWIE); 	&lt;br /&gt;
	buffer_adr=0xFF;  &lt;br /&gt;
	sei();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Je nach Statuscode in TWSR müssen verschiedene Bitmuster in TWCR geschreiben werden(siehe Tabellen im Datenblatt!). &lt;br /&gt;
//Makros für die verwendeten Bitmuster:&lt;br /&gt;
&lt;br /&gt;
//ACK nach empfangenen Daten senden/ ACK nach gesendeten Daten erwarten&lt;br /&gt;
#define TWCR_ACK TWCR = (1&amp;lt;&amp;lt;TWEN)|(1&amp;lt;&amp;lt;TWIE)|(1&amp;lt;&amp;lt;TWINT)|(1&amp;lt;&amp;lt;TWEA)|(0&amp;lt;&amp;lt;TWSTA)|(0&amp;lt;&amp;lt;TWSTO)|(0&amp;lt;&amp;lt;TWWC);  &lt;br /&gt;
&lt;br /&gt;
//NACK nach empfangenen Daten senden/ NACK nach gesendeten Daten erwarten     &lt;br /&gt;
#define TWCR_NACK TWCR = (1&amp;lt;&amp;lt;TWEN)|(1&amp;lt;&amp;lt;TWIE)|(1&amp;lt;&amp;lt;TWINT)|(0&amp;lt;&amp;lt;TWEA)|(0&amp;lt;&amp;lt;TWSTA)|(0&amp;lt;&amp;lt;TWSTO)|(0&amp;lt;&amp;lt;TWWC);&lt;br /&gt;
&lt;br /&gt;
//switched to the non adressed slave mode...&lt;br /&gt;
#define TWCR_RESET TWCR = (1&amp;lt;&amp;lt;TWEN)|(1&amp;lt;&amp;lt;TWIE)|(1&amp;lt;&amp;lt;TWINT)|(1&amp;lt;&amp;lt;TWEA)|(0&amp;lt;&amp;lt;TWSTA)|(0&amp;lt;&amp;lt;TWSTO)|(0&amp;lt;&amp;lt;TWWC);  &lt;br /&gt;
//Die Bitmuster für TWCR_ACK und TWCR_RESET sind gleich. Dies ist kein Fehler und dient nur der Übersicht!&lt;br /&gt;
&lt;br /&gt;
/*ISR, die bei einem Ereignis auf dem Bus ausgelöst wird. Im Register TWSR befindet sich dann &lt;br /&gt;
ein Statuscode, anhand dessen die Situation festgestellt werden kann.&lt;br /&gt;
*/&lt;br /&gt;
ISR (TWI_vect)  &lt;br /&gt;
{&lt;br /&gt;
uint8_t data=0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
switch (TW_STATUS) //TWI-Statusregister prüfen und nötige Aktion bestimmen &lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
// Slave Receiver &lt;br /&gt;
&lt;br /&gt;
case TW_SR_SLA_ACK: // 0x60 Slave Receiver, Slave wurde adressiert	&lt;br /&gt;
	TWCR_ACK; // nächstes Datenbyte empfangen, ACK danach senden&lt;br /&gt;
	buffer_adr=0xFF; //Bufferposition ist undefiniert&lt;br /&gt;
break;&lt;br /&gt;
	&lt;br /&gt;
case TW_SR_DATA_ACK: // 0x80 Slave Receiver, ein Datenbyte wurde empfangen&lt;br /&gt;
	data=TWDR; //Empfangene Daten auslesen&lt;br /&gt;
	if (buffer_adr == 0xFF) //erster Zugriff, Bufferposition setzen&lt;br /&gt;
		{&lt;br /&gt;
			//Kontrolle ob gewünschte Adresse im erlaubten bereich&lt;br /&gt;
			if(data&amp;lt;i2c_buffer_size)&lt;br /&gt;
				{&lt;br /&gt;
					buffer_adr= data; //Bufferposition wie adressiert setzen&lt;br /&gt;
				}&lt;br /&gt;
			else&lt;br /&gt;
				{&lt;br /&gt;
					buffer_adr=0; //Adresse auf Null setzen. Ist das sinnvoll? TO DO!&lt;br /&gt;
				}				&lt;br /&gt;
			TWCR_ACK;	// nächstes Datenbyte empfangen, ACK danach, um nächstes Byte anzufordern&lt;br /&gt;
		}&lt;br /&gt;
	else //weiterer Zugriff, nachdem die Position im Buffer gesetzt wurde. NUn die Daten empfangen und speichern&lt;br /&gt;
		{&lt;br /&gt;
		&lt;br /&gt;
			if(buffer_adr&amp;lt;i2c_buffer_size)&lt;br /&gt;
				{&lt;br /&gt;
					if(!I2C_reg_Schreibschutz[buffer_adr]) //Wenn Position nicht schreibgeschützt...&lt;br /&gt;
						i2cdata[buffer_adr]=data; 			//...dann Daten in Buffer schreibe&lt;br /&gt;
						&lt;br /&gt;
						&lt;br /&gt;
				}&lt;br /&gt;
			buffer_adr++; //Buffer-Adresse weiterzählen für nächsten Schreibzugriff&lt;br /&gt;
			TWCR_ACK;	&lt;br /&gt;
		}&lt;br /&gt;
break;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Slave transmitter&lt;br /&gt;
&lt;br /&gt;
case TW_ST_SLA_ACK: //0xA8 Slave wurde im Lesemodus adressiert und hat ein ACK zurückgegeben.&lt;br /&gt;
	//Hier steht kein break! Es wird also der folgende Code ebenfalls ausgeführt!&lt;br /&gt;
	&lt;br /&gt;
case TW_ST_DATA_ACK: //0xB8 Slave Transmitter, Daten wurden angefordert&lt;br /&gt;
&lt;br /&gt;
	if (buffer_adr == 0xFF) //zuvor keine Leseadresse angegeben! &lt;br /&gt;
		{&lt;br /&gt;
			buffer_adr=0;&lt;br /&gt;
		}	&lt;br /&gt;
		&lt;br /&gt;
	if(buffer_adr&amp;lt;i2c_buffer_size)	&lt;br /&gt;
		{&lt;br /&gt;
			TWDR = i2cdata[buffer_adr]; //Datenbyte senden&lt;br /&gt;
			buffer_adr++; //bufferadresse für nächstes Byte weiterzählen&lt;br /&gt;
		}&lt;br /&gt;
	else&lt;br /&gt;
		{&lt;br /&gt;
			TWDR=0; //Kein Daten mehr im Buffer&lt;br /&gt;
		}&lt;br /&gt;
	TWCR_ACK;&lt;br /&gt;
break;&lt;br /&gt;
&lt;br /&gt;
case TW_ST_DATA_NACK: // 0xC0 Keine Daten mehr gefordert &lt;br /&gt;
case TW_SR_DATA_NACK: // 0x88 &lt;br /&gt;
case TW_ST_LAST_DATA: // 0xC8  Last data byte in TWDR has been transmitted (TWEA = “0”); ACK has been received&lt;br /&gt;
case TW_SR_STOP:      // 0xA0 STOP empfangen&lt;br /&gt;
default: 	&lt;br /&gt;
    TWCR_RESET;&lt;br /&gt;
break;&lt;br /&gt;
	&lt;br /&gt;
} //end.switch (TW_STATUS)&lt;br /&gt;
} //end.ISR(TWI_vect)&lt;br /&gt;
&lt;br /&gt;
////Ende von twislave.c////&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Slave header ==&lt;br /&gt;
Die zugehörige Headerdatei twislave.h für den Slave. Stand: 19.2.2010&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#ifndef _TWISLAVE_H&lt;br /&gt;
#define _TWISLAVE_H&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;util/twi.h&amp;gt; 		  //enthaelt z.B. die Bezeichnungen fuer die Statuscodes in TWSR&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;  //dient zur behandlung der Interrupts&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt; 		    //definiert den Datentyp uint8_t&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 *  @defgroup twislave TWI-Slave&lt;br /&gt;
 *  @code #include &amp;quot;twislave.h&amp;quot; @endcode&lt;br /&gt;
 * &lt;br /&gt;
 *  @brief Betrieb eines AVRs mit Hardware-TWI-Schnittstelle als Slave.&lt;br /&gt;
 *  Zu Beginn muss init_twi_slave mit der gewuenschten Slave-Adresse als&lt;br /&gt;
 *  Parameter aufgerufen werden.&lt;br /&gt;
 *&lt;br /&gt;
 * Der Datenaustausch mit dem Master erfolgt ueber den Buffer i2cdata, &lt;br /&gt;
 * auf den von Master und Slave zugegriffen werden kann. &lt;br /&gt;
 * Dies ist fuer den Slave eine globale Variable (Array aus uint8_t). &lt;br /&gt;
&lt;br /&gt;
 * Der Zugriff durch den Master erfolgt aehnlich wie bei einem&lt;br /&gt;
 * normalen I2C-EEPROM.&lt;br /&gt;
 * Man sendet zunaechst die Bufferposition, an die man schreiben will,&lt;br /&gt;
 * und dann die Daten. &lt;br /&gt;
 * Die Bufferposition wird automatisch hochgezaehlt, sodass man mehrere&lt;br /&gt;
 * Datenbytes hintereinander schreiben kann, ohne jedesmal die &lt;br /&gt;
 * Bufferadresse zu schreiben.&lt;br /&gt;
 *&lt;br /&gt;
 * Um vom Master aus zu lesen, uebertraegt man zunaechst in einem &lt;br /&gt;
 * Schreibzugriff die gewuenschte Bufferposition und liest dann nach&lt;br /&gt;
 * einem repeated start die Daten aus. Die Bufferposition wird &lt;br /&gt;
 * automatisch hochgezaehlt, sodass man mehrere Datenbytes&lt;br /&gt;
 * hintereinander lesen kann, ohne jedesmal die Bufferposition zu&lt;br /&gt;
 * schreiben.&lt;br /&gt;
 *&lt;br /&gt;
 * Abgefangene Fehlbedienung durch den Master:&lt;br /&gt;
 * - Lesen ueber die Grenze des txbuffers hinaus&lt;br /&gt;
 * - Schreiben ueber die Grenzen des rxbuffers hinaus&lt;br /&gt;
 * - Angabe einer ungueltigen Schreib/Lese-Adresse&lt;br /&gt;
 * - Lesezugriff, ohne vorher Leseadresse geschrieben zu haben&lt;br /&gt;
 * &lt;br /&gt;
 *  @author uwegw&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*@{*/&lt;br /&gt;
&lt;br /&gt;
//%%%%%%%% von Benutzer konfigurierbare Einstellungen %%%%%%%%&lt;br /&gt;
/**@brief Groesse des Buffers in Byte (2..254) */&lt;br /&gt;
#define i2c_buffer_size 10// I2C_REG_ANZAHL 254 Hier kann eingestellt werden wieviele Register ausgegeben werden&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//%%%%%%%% Globale Variablen, die vom Hauptprogramm genutzt werden %%%%%%%%&lt;br /&gt;
/**@brief Der Buffer, in dem die Daten gespeichert werden.&lt;br /&gt;
 * Aus Sicht des Masters laeuft der Zugrif auf den Buffer genau wie&lt;br /&gt;
 *  bei einem I2C-EEPROm ab.&lt;br /&gt;
 * Fuer den Slave ist es eine globale Variable&lt;br /&gt;
*/&lt;br /&gt;
volatile uint8_t i2cdata[i2c_buffer_size+1];&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**@brief Initaliserung des TWI-Inteface. Muss zu Beginn aufgerufen werden, sowie bei einem Wechsel der Slave Adresse&lt;br /&gt;
 * @param adr gewuenschte Slave-Adresse */&lt;br /&gt;
void init_twi_slave(uint8_t adr);&lt;br /&gt;
&lt;br /&gt;
//%%%%%%%% ab hier sind normalerweise keine weiteren Aenderungen erforderlich! %%%%%%%%//&lt;br /&gt;
//____________________________________________________________________________________//&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Bei zu alten AVR-GCC-Versionen werden die Interrupts anders genutzt, daher in diesem Fall mit Fehlermeldung abbrechen&lt;br /&gt;
#if (__GNUC__ * 100 + __GNUC_MINOR__) &amp;lt; 304&lt;br /&gt;
	#error &amp;quot;This library requires AVR-GCC 3.4.5 or later, update to newer AVR-GCC compiler !&amp;quot;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
//Schutz vor unsinnigen Buffergroessen&lt;br /&gt;
#if (i2c_buffer_size &amp;gt; 254)&lt;br /&gt;
	#error Buffer zu gross gewaehlt! Maximal 254 Bytes erlaubt.&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#if (i2c_buffer_size &amp;lt; 2)&lt;br /&gt;
	#error Buffer muss mindestens zwei Byte gross sein!&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#endif //#ifdef _TWISLAVE_H&lt;br /&gt;
////Ende von twislave.h////&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Microcontroller]]&lt;br /&gt;
[[Kategorie:Quellcode C]]&lt;/div&gt;</summary>
		<author><name>HannoHupmann</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=TWI_Slave_mit_avr-gcc&amp;diff=16185</id>
		<title>TWI Slave mit avr-gcc</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=TWI_Slave_mit_avr-gcc&amp;diff=16185"/>
				<updated>2010-04-05T17:21:11Z</updated>
		
		<summary type="html">&lt;p&gt;HannoHupmann: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Programm für einen AVR mit [[TWI]] (Hardware-[[I2C]])-Schnittstelle als Slave.&lt;br /&gt;
Manchmal stellt sich die Aufgabe, mehrere AVRs per [[I2C]] zu vernetzen. Ein Beispiel ist die Erweiterung eines bestehenden Systems um einen leistungsstärkeren Controller. Dies ist etwa beim [[Asuro]] oder [[Yeti]] denkbar, um z.B. mehr Ein/Ausgänge oder Speicherplatz zu bekommen.&lt;br /&gt;
&lt;br /&gt;
Man kann aber beim Bau eines Roboters auch von Anfang an auf ein System von mehreren vernetzten Controllern setzen. So kann man verschiedene Aufgabe, die weitgehend unabhängig voneinader gleichzeitg erledigt werden müssen, besser verteilen. Denkbar ist z.B. ein Controller für die Motorsteuerung, einer für die Sensorik, einer für Ein-und Ausgabe (wie LCD und Bedientaster),... , und ein zentraler Controller, der die Richtung vorgibt und alle anderen Controller mit Befehlen versorgt. Ein konkretes Beispiel ist der Roboterbausatz Nibo (siehe: [http://www.nicai-systems.de/nibo.html]) von nicai-systems, der einen Atmel ATmega128 als Hauptcontroller und zwei Atmel ATtiny44 als Controller für die Motorsteuerung und die IR-Sensorik einsetzt. Die Kommunikation läuft mit 400 kHz über den I2C-Bus mit dem ATmega128 als Master. &lt;br /&gt;
&lt;br /&gt;
Außerdem wurde der Code für zwei Mega32 mit dem AVR Studio getestet Beachte: im AVR-Studio ist default ein ATmega128 eingestellt, unter Projekt -&amp;gt; Configuration Options kann das Device geändert werden, außerdem ist die Frequency einzustellen. In meinem Fall waren es 7372800Hz da ich in der Schaltung einen entsprechenden Quarz eingebaut habe. Die Verbindung zwischen Master und Slave erfolgt über die Pins 22 (SCL) und 23 (SDA) und gemeinsamer GND. Abschlusswiderstände (4,7kOhm) nicht vergessen, am besten beim Master, siehe auch I2C-Definitionen.   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Schließlich kann ein entsprechend programmierter AVR auch als Ersatz für handelsübliche I2C-Bauteile dienen. Der kleinste AVR mit Hardware-I2C, der ATmega48, ist mit 1,30€ (Reichelt) billiger als viele normale I2C-ICs. Er kann bei entsprechender Programmierung z.B. die Aufgaben von zwei PCF8574 (8bit-Portexpander, 1,25€) und einem PCF8591 (4fach AD-Wandler, 2,35€) übernehmen und außerdem noch als I2C-EEPROM mit 256 Bytes dienen. &lt;br /&gt;
&lt;br /&gt;
Das folgende Programm (twislave.c) steuert das TWI (Hardware-I2C)-Interface eines AVRs als Slave an. Es müsste auf allen AVRs der Mega-Reihe funktionieren, die über eine TWI-Schnittstelle verfügen. &lt;br /&gt;
&lt;br /&gt;
Das System ist als eine Art Dualport-RAM konzipiert, Master und Slave teilen sich also einen Speicherbereich und können darüber Daten austauschen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Master ==&lt;br /&gt;
Ein Testprogramm für den Master. Es wird die [http://homepage.hispeed.ch/peterfleury/avr-software.html#libs I2C-Master-Bibliothek von Peter Fleury] verwendet.&lt;br /&gt;
Es wird geprüft, ob der Slave bereit ist, dann werden drei Bytes erst in den Slave geschrieben, und anschließend wieder ausgelesen.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// I2C-Master-Routinen von Peter Fleury verwenden &lt;br /&gt;
// siehe http://homepage.hispeed.ch/peterfleury/avr-software.html#libs&lt;br /&gt;
// Hier sind auch die Datein: i2cmaster.h und twimaster.c zu finden, die benötigt werden&lt;br /&gt;
// (wer mit AVR-Studio arbeitet braucht nur diese Datein)&lt;br /&gt;
// Letztes Update des Codes 5. April 2010 durch HannoHupmann&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;quot;i2cmaster.h&amp;quot;  &lt;br /&gt;
#define SLAVE_ADRESSE 0x50&lt;br /&gt;
&lt;br /&gt;
uint8_t byte1 = 42;&lt;br /&gt;
uint8_t byte2 = 43;&lt;br /&gt;
uint8_t byte3 = 44;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  i2c_init();         // init I2C interface&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if(!(i2c_start(SLAVE_ADRESSE+I2C_WRITE))) //Slave bereit zum schreiben?&lt;br /&gt;
{&lt;br /&gt;
  i2c_write(0x00);  // Buffer Startadresse setzen 	&lt;br /&gt;
  i2c_write(byte1); // Drei Bytes schreiben...&lt;br /&gt;
  i2c_write(byte2); &lt;br /&gt;
  i2c_write(byte3); &lt;br /&gt;
  i2c_stop();       // Zugriff beenden&lt;br /&gt;
}&lt;br /&gt;
else&lt;br /&gt;
{&lt;br /&gt;
  /* Hier könnte eine Fehlermeldung ausgegeben werden... */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if(!(i2c_start(SLAVE_ADRESSE+I2C_WRITE))) //Slave bereit zum lesen?&lt;br /&gt;
{&lt;br /&gt;
  i2c_write(0x00); //Buffer Startadresse zum Auslesen&lt;br /&gt;
  i2c_rep_start(SLAVE_ADRESSE+I2C_READ); //Lesen beginnen&lt;br /&gt;
&lt;br /&gt;
  byte1= i2c_readAck(); // Bytes lesen...&lt;br /&gt;
  byte2= i2c_readAck();&lt;br /&gt;
  byte3= i2c_readNak(); // letztes Byte lesen, darum kein ACK&lt;br /&gt;
  i2c_stop();           // Zugriff beenden&lt;br /&gt;
} &lt;br /&gt;
else&lt;br /&gt;
{&lt;br /&gt;
  /* Hier könnte eine Fehlermeldung ausgegeben werden... */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if ((byte1 != 42)||(byte2 != 43)||(byte3 != 44))&lt;br /&gt;
{&lt;br /&gt;
  /* Die Bytes wurden nicht korrekt übertragen und wieder gelesen! */ &lt;br /&gt;
}&lt;br /&gt;
    for(;;);	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Code wurde von HannoHupmann auf einem Mega32 getestet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Code sollte ohne Probleme kompiliert werden, eventuell fehlen die oben genannten Datein wenn es nicht klappt.&lt;br /&gt;
&lt;br /&gt;
== Slave == &lt;br /&gt;
Hier soll nun der Code behandelt werden der für den Slave-Controller notwendig ist. Der vorgestellte Code schreibt die Register des Slaves an die Serielle Schnittstelle, mit einem Terminal Programm kann man sich die Ausgabe ansehen und überprüfen ob alles korrekt funktioniert. &lt;br /&gt;
Der Code ist wieder an den von Peter Fleury angelehnt.&lt;br /&gt;
&lt;br /&gt;
Für den Mega32 hab ich die twislave.c nicht gebraucht. Dafür aber die uart.c und uart.h welche sich auch bei Peter Fleury finden lassen. Diese müssen nicht angepasst werden. Wichtig ist die richtige Frquenz sonst ist die Ausgabe nicht korrekt. Der Slave sollte ohne Master folgende Ausgabe haben: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
i2cdata: &lt;br /&gt;
10&lt;br /&gt;
11&lt;br /&gt;
12&lt;br /&gt;
13&lt;br /&gt;
usw. &lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Die Register werden der Reihe nach mit ihrem Wert angezeigt. Wird der Master hinzugefügt sollte nun folgende Ausgabe im Terminal erscheinen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
i2cdata: &lt;br /&gt;
42&lt;br /&gt;
43&lt;br /&gt;
44&lt;br /&gt;
13&lt;br /&gt;
usw. &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Slave Testprogramm ==&lt;br /&gt;
Ein Testprogramm für den Slave. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
Testprogramm für den Slave &lt;br /&gt;
Der Buffer wird mit Werten gefüllt. Dann wird er fortlaufend über die serielle Schnittstelle ausgegeben.&lt;br /&gt;
*/&lt;br /&gt;
#include &amp;lt;util/twi.h&amp;gt; 		//enthält z.B. die Bezeichnungen für die Statuscodes in TWSR&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;  //dient zur Behandlung der Interrupts&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt; 		//definiert den Datentyp uint8_t&lt;br /&gt;
#include &amp;quot;twislave.h&amp;quot;&lt;br /&gt;
#include &amp;quot;uart.h&amp;quot;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#define BAUD 9600 //Baudrate&lt;br /&gt;
#define SLAVE_ADRESSE 0x50 //Die Slave-Adresse&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
volatile uint8_t i2cdata[i2c_buffer_size+1];&lt;br /&gt;
volatile uint8_t buffer_adr; 					//&amp;quot;Adressregister&amp;quot; für den Buffer&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*Initaliserung des TWI-Inteface. Muss zu Beginn aufgerufen werden, sowie bei einem Wechsel der Slave Adresse&lt;br /&gt;
Parameter adr: gewünschte Slave-Adresse&lt;br /&gt;
*/&lt;br /&gt;
void init_twi_slave(uint8_t adr)&lt;br /&gt;
{&lt;br /&gt;
	TWAR= adr; //Adresse setzen&lt;br /&gt;
	TWCR &amp;amp;= ~(1&amp;lt;&amp;lt;TWSTA)|(1&amp;lt;&amp;lt;TWSTO);&lt;br /&gt;
	TWCR|= (1&amp;lt;&amp;lt;TWEA) | (1&amp;lt;&amp;lt;TWEN)|(1&amp;lt;&amp;lt;TWIE); 	&lt;br /&gt;
	buffer_adr=0xFF;  &lt;br /&gt;
	sei();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Je nach Statuscode in TWSR müssen verschiedene Bitmuster in TWCR geschreiben werden(siehe Tabellen im Datenblatt!). &lt;br /&gt;
//Makros für die verwendeten Bitmuster:&lt;br /&gt;
&lt;br /&gt;
//ACK nach empfangenen Daten senden/ ACK nach gesendeten Daten erwarten&lt;br /&gt;
#define TWCR_ACK TWCR = (1&amp;lt;&amp;lt;TWEN)|(1&amp;lt;&amp;lt;TWIE)|(1&amp;lt;&amp;lt;TWINT)|(1&amp;lt;&amp;lt;TWEA)|(0&amp;lt;&amp;lt;TWSTA)|(0&amp;lt;&amp;lt;TWSTO)|(0&amp;lt;&amp;lt;TWWC);  &lt;br /&gt;
&lt;br /&gt;
//NACK nach empfangenen Daten senden/ NACK nach gesendeten Daten erwarten     &lt;br /&gt;
#define TWCR_NACK TWCR = (1&amp;lt;&amp;lt;TWEN)|(1&amp;lt;&amp;lt;TWIE)|(1&amp;lt;&amp;lt;TWINT)|(0&amp;lt;&amp;lt;TWEA)|(0&amp;lt;&amp;lt;TWSTA)|(0&amp;lt;&amp;lt;TWSTO)|(0&amp;lt;&amp;lt;TWWC);&lt;br /&gt;
&lt;br /&gt;
//switched to the non adressed slave mode...&lt;br /&gt;
#define TWCR_RESET TWCR = (1&amp;lt;&amp;lt;TWEN)|(1&amp;lt;&amp;lt;TWIE)|(1&amp;lt;&amp;lt;TWINT)|(1&amp;lt;&amp;lt;TWEA)|(0&amp;lt;&amp;lt;TWSTA)|(0&amp;lt;&amp;lt;TWSTO)|(0&amp;lt;&amp;lt;TWWC);  &lt;br /&gt;
//Die Bitmuster für TWCR_ACK und TWCR_RESET sind gleich. Dies ist kein Fehler und dient nur der Übersicht!&lt;br /&gt;
&lt;br /&gt;
/*ISR, die bei einem Ereignis auf dem Bus ausgelöst wird. Im Register TWSR befindet sich dann &lt;br /&gt;
ein Statuscode, anhand dessen die Situation festgestellt werden kann.&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ISR (TWI_vect)  &lt;br /&gt;
{&lt;br /&gt;
	uint8_t data=0;&lt;br /&gt;
	switch (TW_STATUS) //TWI-Statusregister prüfen und nötige Aktion bestimmen &lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
// Slave Receiver &lt;br /&gt;
&lt;br /&gt;
	case TW_SR_SLA_ACK: // 0x60 Slave Receiver, Slave wurde adressiert	&lt;br /&gt;
	     TWCR_ACK; // nächstes Datenbyte empfangen, ACK danach senden&lt;br /&gt;
		 buffer_adr=0xFF; //Bufferposition ist undefiniert&lt;br /&gt;
		 break;&lt;br /&gt;
	&lt;br /&gt;
	case TW_SR_DATA_ACK: // 0x80 Slave Receiver, ein Datenbyte wurde empfangen&lt;br /&gt;
	 	 data=TWDR; //Empfangene Daten auslesen&lt;br /&gt;
		 if (buffer_adr == 0xFF) //erster Zugriff, Bufferposition setzen&lt;br /&gt;
			{&lt;br /&gt;
			//Kontrolle ob gewünschte Adresse im erlaubten bereich&lt;br /&gt;
			if(data&amp;lt;i2c_buffer_size)&lt;br /&gt;
				{&lt;br /&gt;
					buffer_adr= data; //Bufferposition wie adressiert setzen&lt;br /&gt;
				}&lt;br /&gt;
			else&lt;br /&gt;
				{&lt;br /&gt;
					buffer_adr=0; //Adresse auf Null setzen. Ist das sinnvoll? TO DO!&lt;br /&gt;
				}				&lt;br /&gt;
			TWCR_ACK;	// nächstes Datenbyte empfangen, ACK danach, um nächstes Byte anzufordern&lt;br /&gt;
		 }&lt;br /&gt;
		 else //weiterer Zugriff, nachdem die Position im Buffer gesetzt wurde. NUn die Daten empfangen und speichern&lt;br /&gt;
		 {&lt;br /&gt;
		&lt;br /&gt;
			if(buffer_adr&amp;lt;i2c_buffer_size)&lt;br /&gt;
				{&lt;br /&gt;
					//if(!I2C_reg_Schreibschutz[buffer_adr]) //Wenn Position nicht schreibgeschützt...&lt;br /&gt;
						i2cdata[buffer_adr]=data; 			//...dann Daten in Buffer schreibe&lt;br /&gt;
						&lt;br /&gt;
						&lt;br /&gt;
				}&lt;br /&gt;
			buffer_adr++; //Buffer-Adresse weiterzählen für nächsten Schreibzugriff&lt;br /&gt;
			TWCR_ACK;	&lt;br /&gt;
		 }&lt;br /&gt;
		break;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Slave transmitter&lt;br /&gt;
&lt;br /&gt;
		case TW_ST_SLA_ACK: //0xA8 Slave wurde im Lesemodus adressiert und hat ein ACK zurückgegeben.&lt;br /&gt;
	//Hier steht kein break! Es wird also der folgende Code ebenfalls ausgeführt!&lt;br /&gt;
	&lt;br /&gt;
		case TW_ST_DATA_ACK: //0xB8 Slave Transmitter, Daten wurden angefordert&lt;br /&gt;
			if (buffer_adr == 0xFF) //zuvor keine Leseadresse angegeben! &lt;br /&gt;
			{&lt;br /&gt;
			buffer_adr=0;&lt;br /&gt;
			}	&lt;br /&gt;
		&lt;br /&gt;
			if(buffer_adr&amp;lt;i2c_buffer_size)	&lt;br /&gt;
			{&lt;br /&gt;
			TWDR = i2cdata[buffer_adr]; //Datenbyte senden&lt;br /&gt;
			buffer_adr++; //bufferadresse für nächstes Byte weiterzählen&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
			TWDR=0; //Kein Daten mehr im Buffer&lt;br /&gt;
			}&lt;br /&gt;
			TWCR_ACK;&lt;br /&gt;
		break;&lt;br /&gt;
&lt;br /&gt;
	case TW_ST_DATA_NACK: // 0xC0 Keine Daten mehr gefordert &lt;br /&gt;
	case TW_SR_DATA_NACK: // 0x88 &lt;br /&gt;
	case TW_ST_LAST_DATA: // 0xC8  Last data byte in TWDR has been transmitted (TWEA = “0”); ACK has been received&lt;br /&gt;
	case TW_SR_STOP:      // 0xA0 STOP empfangen&lt;br /&gt;
	default: 	&lt;br /&gt;
    TWCR_RESET;&lt;br /&gt;
	break;&lt;br /&gt;
	} //end.switch (TW_STATUS)&lt;br /&gt;
} //end.ISR(TWI_vect)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void warte (int loop)  //loop: wartezeit in ms &lt;br /&gt;
{&lt;br /&gt;
	int i;&lt;br /&gt;
	for(i=0;i&amp;lt;loop;i++) _delay_ms(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main (void)&lt;br /&gt;
{&lt;br /&gt;
//TWI als Slave mit Adresse slaveadr starten&lt;br /&gt;
init_twi_slave(SLAVE_ADRESSE);&lt;br /&gt;
&lt;br /&gt;
//i2cdatamit Werten füllen, die der Master auslesen und ändern kann&lt;br /&gt;
for(uint8_t i=0;i&amp;lt;i2c_buffer_size;i++)&lt;br /&gt;
	{&lt;br /&gt;
		i2cdata[i]=10+i;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
//Serielle Schnittstelle aktivieren&lt;br /&gt;
uart_init((UART_BAUD_SELECT((BAUD),F_CPU)));&lt;br /&gt;
uart_puts(&amp;quot;I2C-Test\r\n&amp;quot;);&lt;br /&gt;
uart_puts(&amp;quot;Teste I2C-Slave mit Adresse &amp;quot;); uart_puti(SLAVE_ADRESSE);&lt;br /&gt;
uart_puts(&amp;quot;\r\n&amp;quot;);&lt;br /&gt;
uart_puts(&amp;quot;\r\n&amp;quot;); //Leerzeile&lt;br /&gt;
&lt;br /&gt;
//in einer Endlosschleife den Inhalt der Buffer ausgeben&lt;br /&gt;
while(1) &lt;br /&gt;
{&lt;br /&gt;
	uart_puts(&amp;quot;i2cdata:\r\n&amp;quot;);&lt;br /&gt;
	for(uint8_t i=0;i&amp;lt;i2c_buffer_size;i++)&lt;br /&gt;
		{&lt;br /&gt;
			uart_puti(i2cdata[i]);&lt;br /&gt;
			uart_puts(&amp;quot;\r\n&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	uart_puts(&amp;quot;\r\n&amp;quot;);//leerzeile&lt;br /&gt;
warte(500);&lt;br /&gt;
} //end.while&lt;br /&gt;
} //end.main&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Slave sourcecode ==&lt;br /&gt;
Die twislave.c für den Slave. Stand: 5.4.2010 &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;util/twi.h&amp;gt; 		//enthält z.B. die Bezeichnungen für die Statuscodes in TWSR&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;  //dient zur Behandlung der Interrupts&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt; 		//definiert den Datentyp uint8_t&lt;br /&gt;
#include &amp;quot;twislave.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
//%%%%%%%% Globale Variablen, die vom Hauptprogramm genutzt werden %%%%%%%%&lt;br /&gt;
/*Der Buffer, in dem die Daten gespeichert werden. &lt;br /&gt;
Aus Sicht des Masters läuft der Zugrif auf den Buffer genau wie bei einem I2C-EEPROm ab.&lt;br /&gt;
Für den Slave ist es eine globale Variable&lt;br /&gt;
*/&lt;br /&gt;
volatile uint8_t i2cdata[i2c_buffer_size+1];&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
volatile uint8_t buffer_adr; //&amp;quot;Adressregister&amp;quot; für den Buffer&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*Initaliserung des TWI-Inteface. Muss zu Beginn aufgerufen werden, sowie bei einem Wechsel der Slave Adresse&lt;br /&gt;
Parameter adr: gewünschte Slave-Adresse&lt;br /&gt;
*/&lt;br /&gt;
void init_twi_slave(uint8_t adr)&lt;br /&gt;
{&lt;br /&gt;
	TWAR= adr; //Adresse setzen&lt;br /&gt;
	TWCR &amp;amp;= ~(1&amp;lt;&amp;lt;TWSTA)|(1&amp;lt;&amp;lt;TWSTO);&lt;br /&gt;
	TWCR|= (1&amp;lt;&amp;lt;TWEA) | (1&amp;lt;&amp;lt;TWEN)|(1&amp;lt;&amp;lt;TWIE); 	&lt;br /&gt;
	buffer_adr=0xFF;  &lt;br /&gt;
	sei();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Je nach Statuscode in TWSR müssen verschiedene Bitmuster in TWCR geschreiben werden(siehe Tabellen im Datenblatt!). &lt;br /&gt;
//Makros für die verwendeten Bitmuster:&lt;br /&gt;
&lt;br /&gt;
//ACK nach empfangenen Daten senden/ ACK nach gesendeten Daten erwarten&lt;br /&gt;
#define TWCR_ACK TWCR = (1&amp;lt;&amp;lt;TWEN)|(1&amp;lt;&amp;lt;TWIE)|(1&amp;lt;&amp;lt;TWINT)|(1&amp;lt;&amp;lt;TWEA)|(0&amp;lt;&amp;lt;TWSTA)|(0&amp;lt;&amp;lt;TWSTO)|(0&amp;lt;&amp;lt;TWWC);  &lt;br /&gt;
&lt;br /&gt;
//NACK nach empfangenen Daten senden/ NACK nach gesendeten Daten erwarten     &lt;br /&gt;
#define TWCR_NACK TWCR = (1&amp;lt;&amp;lt;TWEN)|(1&amp;lt;&amp;lt;TWIE)|(1&amp;lt;&amp;lt;TWINT)|(0&amp;lt;&amp;lt;TWEA)|(0&amp;lt;&amp;lt;TWSTA)|(0&amp;lt;&amp;lt;TWSTO)|(0&amp;lt;&amp;lt;TWWC);&lt;br /&gt;
&lt;br /&gt;
//switched to the non adressed slave mode...&lt;br /&gt;
#define TWCR_RESET TWCR = (1&amp;lt;&amp;lt;TWEN)|(1&amp;lt;&amp;lt;TWIE)|(1&amp;lt;&amp;lt;TWINT)|(1&amp;lt;&amp;lt;TWEA)|(0&amp;lt;&amp;lt;TWSTA)|(0&amp;lt;&amp;lt;TWSTO)|(0&amp;lt;&amp;lt;TWWC);  &lt;br /&gt;
//Die Bitmuster für TWCR_ACK und TWCR_RESET sind gleich. Dies ist kein Fehler und dient nur der Übersicht!&lt;br /&gt;
&lt;br /&gt;
/*ISR, die bei einem Ereignis auf dem Bus ausgelöst wird. Im Register TWSR befindet sich dann &lt;br /&gt;
ein Statuscode, anhand dessen die Situation festgestellt werden kann.&lt;br /&gt;
*/&lt;br /&gt;
ISR (TWI_vect)  &lt;br /&gt;
{&lt;br /&gt;
uint8_t data=0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
switch (TW_STATUS) //TWI-Statusregister prüfen und nötige Aktion bestimmen &lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
// Slave Receiver &lt;br /&gt;
&lt;br /&gt;
case TW_SR_SLA_ACK: // 0x60 Slave Receiver, Slave wurde adressiert	&lt;br /&gt;
	TWCR_ACK; // nächstes Datenbyte empfangen, ACK danach senden&lt;br /&gt;
	buffer_adr=0xFF; //Bufferposition ist undefiniert&lt;br /&gt;
break;&lt;br /&gt;
	&lt;br /&gt;
case TW_SR_DATA_ACK: // 0x80 Slave Receiver, ein Datenbyte wurde empfangen&lt;br /&gt;
	data=TWDR; //Empfangene Daten auslesen&lt;br /&gt;
	if (buffer_adr == 0xFF) //erster Zugriff, Bufferposition setzen&lt;br /&gt;
		{&lt;br /&gt;
			//Kontrolle ob gewünschte Adresse im erlaubten bereich&lt;br /&gt;
			if(data&amp;lt;i2c_buffer_size)&lt;br /&gt;
				{&lt;br /&gt;
					buffer_adr= data; //Bufferposition wie adressiert setzen&lt;br /&gt;
				}&lt;br /&gt;
			else&lt;br /&gt;
				{&lt;br /&gt;
					buffer_adr=0; //Adresse auf Null setzen. Ist das sinnvoll? TO DO!&lt;br /&gt;
				}				&lt;br /&gt;
			TWCR_ACK;	// nächstes Datenbyte empfangen, ACK danach, um nächstes Byte anzufordern&lt;br /&gt;
		}&lt;br /&gt;
	else //weiterer Zugriff, nachdem die Position im Buffer gesetzt wurde. NUn die Daten empfangen und speichern&lt;br /&gt;
		{&lt;br /&gt;
		&lt;br /&gt;
			if(buffer_adr&amp;lt;i2c_buffer_size)&lt;br /&gt;
				{&lt;br /&gt;
					if(!I2C_reg_Schreibschutz[buffer_adr]) //Wenn Position nicht schreibgeschützt...&lt;br /&gt;
						i2cdata[buffer_adr]=data; 			//...dann Daten in Buffer schreibe&lt;br /&gt;
						&lt;br /&gt;
						&lt;br /&gt;
				}&lt;br /&gt;
			buffer_adr++; //Buffer-Adresse weiterzählen für nächsten Schreibzugriff&lt;br /&gt;
			TWCR_ACK;	&lt;br /&gt;
		}&lt;br /&gt;
break;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Slave transmitter&lt;br /&gt;
&lt;br /&gt;
case TW_ST_SLA_ACK: //0xA8 Slave wurde im Lesemodus adressiert und hat ein ACK zurückgegeben.&lt;br /&gt;
	//Hier steht kein break! Es wird also der folgende Code ebenfalls ausgeführt!&lt;br /&gt;
	&lt;br /&gt;
case TW_ST_DATA_ACK: //0xB8 Slave Transmitter, Daten wurden angefordert&lt;br /&gt;
&lt;br /&gt;
	if (buffer_adr == 0xFF) //zuvor keine Leseadresse angegeben! &lt;br /&gt;
		{&lt;br /&gt;
			buffer_adr=0;&lt;br /&gt;
		}	&lt;br /&gt;
		&lt;br /&gt;
	if(buffer_adr&amp;lt;i2c_buffer_size)	&lt;br /&gt;
		{&lt;br /&gt;
			TWDR = i2cdata[buffer_adr]; //Datenbyte senden&lt;br /&gt;
			buffer_adr++; //bufferadresse für nächstes Byte weiterzählen&lt;br /&gt;
		}&lt;br /&gt;
	else&lt;br /&gt;
		{&lt;br /&gt;
			TWDR=0; //Kein Daten mehr im Buffer&lt;br /&gt;
		}&lt;br /&gt;
	TWCR_ACK;&lt;br /&gt;
break;&lt;br /&gt;
&lt;br /&gt;
case TW_ST_DATA_NACK: // 0xC0 Keine Daten mehr gefordert &lt;br /&gt;
case TW_SR_DATA_NACK: // 0x88 &lt;br /&gt;
case TW_ST_LAST_DATA: // 0xC8  Last data byte in TWDR has been transmitted (TWEA = “0”); ACK has been received&lt;br /&gt;
case TW_SR_STOP:      // 0xA0 STOP empfangen&lt;br /&gt;
default: 	&lt;br /&gt;
    TWCR_RESET;&lt;br /&gt;
break;&lt;br /&gt;
	&lt;br /&gt;
} //end.switch (TW_STATUS)&lt;br /&gt;
} //end.ISR(TWI_vect)&lt;br /&gt;
&lt;br /&gt;
////Ende von twislave.c////&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Slave header ==&lt;br /&gt;
Die zugehörige Headerdatei twislave.h für den Slave. Stand: 19.2.2010&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#ifndef _TWISLAVE_H&lt;br /&gt;
#define _TWISLAVE_H&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;util/twi.h&amp;gt; 		  //enthaelt z.B. die Bezeichnungen fuer die Statuscodes in TWSR&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;  //dient zur behandlung der Interrupts&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt; 		    //definiert den Datentyp uint8_t&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 *  @defgroup twislave TWI-Slave&lt;br /&gt;
 *  @code #include &amp;quot;twislave.h&amp;quot; @endcode&lt;br /&gt;
 * &lt;br /&gt;
 *  @brief Betrieb eines AVRs mit Hardware-TWI-Schnittstelle als Slave.&lt;br /&gt;
 *  Zu Beginn muss init_twi_slave mit der gewuenschten Slave-Adresse als&lt;br /&gt;
 *  Parameter aufgerufen werden.&lt;br /&gt;
 *&lt;br /&gt;
 * Der Datenaustausch mit dem Master erfolgt ueber den Buffer i2cdata, &lt;br /&gt;
 * auf den von Master und Slave zugegriffen werden kann. &lt;br /&gt;
 * Dies ist fuer den Slave eine globale Variable (Array aus uint8_t). &lt;br /&gt;
&lt;br /&gt;
 * Der Zugriff durch den Master erfolgt aehnlich wie bei einem&lt;br /&gt;
 * normalen I2C-EEPROM.&lt;br /&gt;
 * Man sendet zunaechst die Bufferposition, an die man schreiben will,&lt;br /&gt;
 * und dann die Daten. &lt;br /&gt;
 * Die Bufferposition wird automatisch hochgezaehlt, sodass man mehrere&lt;br /&gt;
 * Datenbytes hintereinander schreiben kann, ohne jedesmal die &lt;br /&gt;
 * Bufferadresse zu schreiben.&lt;br /&gt;
 *&lt;br /&gt;
 * Um vom Master aus zu lesen, uebertraegt man zunaechst in einem &lt;br /&gt;
 * Schreibzugriff die gewuenschte Bufferposition und liest dann nach&lt;br /&gt;
 * einem repeated start die Daten aus. Die Bufferposition wird &lt;br /&gt;
 * automatisch hochgezaehlt, sodass man mehrere Datenbytes&lt;br /&gt;
 * hintereinander lesen kann, ohne jedesmal die Bufferposition zu&lt;br /&gt;
 * schreiben.&lt;br /&gt;
 *&lt;br /&gt;
 * Abgefangene Fehlbedienung durch den Master:&lt;br /&gt;
 * - Lesen ueber die Grenze des txbuffers hinaus&lt;br /&gt;
 * - Schreiben ueber die Grenzen des rxbuffers hinaus&lt;br /&gt;
 * - Angabe einer ungueltigen Schreib/Lese-Adresse&lt;br /&gt;
 * - Lesezugriff, ohne vorher Leseadresse geschrieben zu haben&lt;br /&gt;
 * &lt;br /&gt;
 *  @author uwegw&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*@{*/&lt;br /&gt;
&lt;br /&gt;
//%%%%%%%% von Benutzer konfigurierbare Einstellungen %%%%%%%%&lt;br /&gt;
/**@brief Groesse des Buffers in Byte (2..254) */&lt;br /&gt;
#define i2c_buffer_size 10// I2C_REG_ANZAHL 254 Hier kann eingestellt werden wieviele Register ausgegeben werden&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//%%%%%%%% Globale Variablen, die vom Hauptprogramm genutzt werden %%%%%%%%&lt;br /&gt;
/**@brief Der Buffer, in dem die Daten gespeichert werden.&lt;br /&gt;
 * Aus Sicht des Masters laeuft der Zugrif auf den Buffer genau wie&lt;br /&gt;
 *  bei einem I2C-EEPROm ab.&lt;br /&gt;
 * Fuer den Slave ist es eine globale Variable&lt;br /&gt;
*/&lt;br /&gt;
volatile uint8_t i2cdata[i2c_buffer_size+1];&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**@brief Initaliserung des TWI-Inteface. Muss zu Beginn aufgerufen werden, sowie bei einem Wechsel der Slave Adresse&lt;br /&gt;
 * @param adr gewuenschte Slave-Adresse */&lt;br /&gt;
void init_twi_slave(uint8_t adr);&lt;br /&gt;
&lt;br /&gt;
//%%%%%%%% ab hier sind normalerweise keine weiteren Aenderungen erforderlich! %%%%%%%%//&lt;br /&gt;
//____________________________________________________________________________________//&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Bei zu alten AVR-GCC-Versionen werden die Interrupts anders genutzt, daher in diesem Fall mit Fehlermeldung abbrechen&lt;br /&gt;
#if (__GNUC__ * 100 + __GNUC_MINOR__) &amp;lt; 304&lt;br /&gt;
	#error &amp;quot;This library requires AVR-GCC 3.4.5 or later, update to newer AVR-GCC compiler !&amp;quot;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
//Schutz vor unsinnigen Buffergroessen&lt;br /&gt;
#if (i2c_buffer_size &amp;gt; 254)&lt;br /&gt;
	#error Buffer zu gross gewaehlt! Maximal 254 Bytes erlaubt.&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#if (i2c_buffer_size &amp;lt; 2)&lt;br /&gt;
	#error Buffer muss mindestens zwei Byte gross sein!&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#endif //#ifdef _TWISLAVE_H&lt;br /&gt;
////Ende von twislave.h////&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Microcontroller]]&lt;br /&gt;
[[Kategorie:Quellcode C]]&lt;/div&gt;</summary>
		<author><name>HannoHupmann</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=TWI_Slave_mit_avr-gcc&amp;diff=16184</id>
		<title>TWI Slave mit avr-gcc</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=TWI_Slave_mit_avr-gcc&amp;diff=16184"/>
				<updated>2010-04-05T17:17:12Z</updated>
		
		<summary type="html">&lt;p&gt;HannoHupmann: /* Master */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Programm für einen AVR mit [[TWI]] (Hardware-[[I2C]])-Schnittstelle als Slave.&lt;br /&gt;
Manchmal stellt sich die Aufgabe, mehrere AVRs per [[I2C]] zu vernetzen. Ein Beispiel ist die Erweiterung eines bestehenden Systems um einen leistungsstärkeren Controller. Dies ist etwa beim [[Asuro]] oder [[Yeti]] denkbar, um z.B. mehr Ein/Ausgänge oder Speicherplatz zu bekommen.&lt;br /&gt;
&lt;br /&gt;
Man kann aber beim Bau eines Roboters auch von Anfang an auf ein System von mehreren vernetzten Controllern setzen. So kann man verschiedene Aufgabe, die weitgehend unabhängig voneinader gleichzeitg erledigt werden müssen, besser verteilen. Denkbar ist z.B. ein Controller für die Motorsteuerung, einer für die Sensorik, einer für Ein-und Ausgabe (wie LCD und Bedientaster),... , und ein zentraler Controller, der die Richtung vorgibt und alle anderen Controller mit Befehlen versorgt. Ein konkretes Beispiel ist der Roboterbausatz Nibo (siehe: [http://www.nicai-systems.de/nibo.html]) von nicai-systems, der einen Atmel ATmega128 als Hauptcontroller und zwei Atmel ATtiny44 als Controller für die Motorsteuerung und die IR-Sensorik einsetzt. Die Kommunikation läuft mit 400 kHz über den I2C-Bus mit dem ATmega128 als Master. &lt;br /&gt;
&lt;br /&gt;
Außerdem wurde der Code für einen Mega32 mit dem AVR Studio getestet Beachte: im AVR-Studio ist default ein ATmega128 eingestellt, unter Projekt -&amp;gt; Configuration Options kann das Device geändert werden, außerdem ist die Frequency einzustellen. In meinem Fall waren es 7372800Hz da ich in der Schaltung einen entsprechenden Quarz eingebaut habe. Die Verbindung zwischen Master und Slave erfolgt über die Pins 22 (SCL) und 23 (SDA) und gemeinsamer GND. Abschlusswiderstände (4,7kOhm) nicht vergessen, am besten beim Master, siehe auch I2C-Definitionen.   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Schließlich kann ein entsprechend programmierter AVR auch als Ersatz für handelsübliche I2C-Bauteile dienen. Der kleinste AVR mit Hardware-I2C, der ATmega48, ist mit 1,30€ (Reichelt) billiger als viele normale I2C-ICs. Er kann bei entsprechender Programmierung z.B. die Aufgaben von zwei PCF8574 (8bit-Portexpander, 1,25€) und einem PCF8591 (4fach AD-Wandler, 2,35€) übernehmen und außerdem noch als I2C-EEPROM mit 256 Bytes dienen. &lt;br /&gt;
&lt;br /&gt;
Das folgende Programm (twislave.c) steuert das TWI (Hardware-I2C)-Interface eines AVRs als Slave an. Es müsste auf allen AVRs der Mega-Reihe funktionieren, die über eine TWI-Schnittstelle verfügen. &lt;br /&gt;
&lt;br /&gt;
Das System ist als eine Art Dualport-RAM konzipiert, Master und Slave teilen sich also einen Speicherbereich und können darüber Daten austauschen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Master ==&lt;br /&gt;
Ein Testprogramm für den Master. Es wird die [http://homepage.hispeed.ch/peterfleury/avr-software.html#libs I2C-Master-Bibliothek von Peter Fleury] verwendet.&lt;br /&gt;
Es wird geprüft, ob der Slave bereit ist, dann werden drei Bytes erst in den Slave geschrieben, und anschließend wieder ausgelesen.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// I2C-Master-Routinen von Peter Fleury verwenden &lt;br /&gt;
// siehe http://homepage.hispeed.ch/peterfleury/avr-software.html#libs&lt;br /&gt;
// Hier sind auch die Datein: i2cmaster.h und twimaster.c zu finden, die benötigt werden&lt;br /&gt;
// (wer mit AVR-Studio arbeitet braucht nur diese Datein)&lt;br /&gt;
// Letztes Update des Codes 5. April 2010 durch HannoHupmann&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;quot;i2cmaster.h&amp;quot;  &lt;br /&gt;
#define SLAVE_ADRESSE 0x50&lt;br /&gt;
&lt;br /&gt;
uint8_t byte1 = 42;&lt;br /&gt;
uint8_t byte2 = 43;&lt;br /&gt;
uint8_t byte3 = 44;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  i2c_init();         // init I2C interface&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if(!(i2c_start(SLAVE_ADRESSE+I2C_WRITE))) //Slave bereit zum schreiben?&lt;br /&gt;
{&lt;br /&gt;
  i2c_write(0x00);  // Buffer Startadresse setzen 	&lt;br /&gt;
  i2c_write(byte1); // Drei Bytes schreiben...&lt;br /&gt;
  i2c_write(byte2); &lt;br /&gt;
  i2c_write(byte3); &lt;br /&gt;
  i2c_stop();       // Zugriff beenden&lt;br /&gt;
}&lt;br /&gt;
else&lt;br /&gt;
{&lt;br /&gt;
  /* Hier könnte eine Fehlermeldung ausgegeben werden... */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if(!(i2c_start(SLAVE_ADRESSE+I2C_WRITE))) //Slave bereit zum lesen?&lt;br /&gt;
{&lt;br /&gt;
  i2c_write(0x00); //Buffer Startadresse zum Auslesen&lt;br /&gt;
  i2c_rep_start(SLAVE_ADRESSE+I2C_READ); //Lesen beginnen&lt;br /&gt;
&lt;br /&gt;
  byte1= i2c_readAck(); // Bytes lesen...&lt;br /&gt;
  byte2= i2c_readAck();&lt;br /&gt;
  byte3= i2c_readNak(); // letztes Byte lesen, darum kein ACK&lt;br /&gt;
  i2c_stop();           // Zugriff beenden&lt;br /&gt;
} &lt;br /&gt;
else&lt;br /&gt;
{&lt;br /&gt;
  /* Hier könnte eine Fehlermeldung ausgegeben werden... */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if ((byte1 != 42)||(byte2 != 43)||(byte3 != 44))&lt;br /&gt;
{&lt;br /&gt;
  /* Die Bytes wurden nicht korrekt übertragen und wieder gelesen! */ &lt;br /&gt;
}&lt;br /&gt;
    for(;;);	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Code wurde von HannoHupmann auf einem Mega32 getestet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Code sollte ohne Probleme kompiliert werden, eventuell fehlen die oben genannten Datein wenn es nicht klappt.&lt;br /&gt;
&lt;br /&gt;
== Slave == &lt;br /&gt;
Hier soll nun der Code behandelt werden der für den Slave-Controller notwendig ist. Der vorgestellte Code schreibt die Register des Slaves an die Serielle Schnittstelle, mit einem Terminal Programm kann man sich die Ausgabe ansehen und überprüfen ob alles korrekt funktioniert. &lt;br /&gt;
Der Code ist wieder an den von Peter Fleury angelehnt.&lt;br /&gt;
&lt;br /&gt;
Für den Mega32 hab ich die twislave.c nicht gebraucht. Dafür aber die uart.c und uart.h welche sich auch bei Peter Fleury finden lassen. Diese müssen nicht angepasst werden. Wichtig ist die richtige Frquenz sonst ist die Ausgabe nicht korrekt. Der Slave sollte ohne Master folgende Ausgabe haben: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
i2cdata: &lt;br /&gt;
10&lt;br /&gt;
11&lt;br /&gt;
12&lt;br /&gt;
13&lt;br /&gt;
usw. &lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Die Register werden der Reihe nach mit ihrem Wert angezeigt. Wird der Master hinzugefügt sollte nun folgende Ausgabe im Terminal erscheinen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
i2cdata: &lt;br /&gt;
42&lt;br /&gt;
43&lt;br /&gt;
44&lt;br /&gt;
13&lt;br /&gt;
usw. &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Slave Testprogramm ==&lt;br /&gt;
Ein Testprogramm für den Slave. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
Testprogramm für den Slave &lt;br /&gt;
Der Buffer wird mit Werten gefüllt. Dann wird er fortlaufend über die serielle Schnittstelle ausgegeben.&lt;br /&gt;
*/&lt;br /&gt;
#include &amp;lt;util/twi.h&amp;gt; 		//enthält z.B. die Bezeichnungen für die Statuscodes in TWSR&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;  //dient zur Behandlung der Interrupts&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt; 		//definiert den Datentyp uint8_t&lt;br /&gt;
#include &amp;quot;twislave.h&amp;quot;&lt;br /&gt;
#include &amp;quot;uart.h&amp;quot;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#define BAUD 9600 //Baudrate&lt;br /&gt;
#define SLAVE_ADRESSE 0x50 //Die Slave-Adresse&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
volatile uint8_t i2cdata[i2c_buffer_size+1];&lt;br /&gt;
volatile uint8_t buffer_adr; 					//&amp;quot;Adressregister&amp;quot; für den Buffer&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*Initaliserung des TWI-Inteface. Muss zu Beginn aufgerufen werden, sowie bei einem Wechsel der Slave Adresse&lt;br /&gt;
Parameter adr: gewünschte Slave-Adresse&lt;br /&gt;
*/&lt;br /&gt;
void init_twi_slave(uint8_t adr)&lt;br /&gt;
{&lt;br /&gt;
	TWAR= adr; //Adresse setzen&lt;br /&gt;
	TWCR &amp;amp;= ~(1&amp;lt;&amp;lt;TWSTA)|(1&amp;lt;&amp;lt;TWSTO);&lt;br /&gt;
	TWCR|= (1&amp;lt;&amp;lt;TWEA) | (1&amp;lt;&amp;lt;TWEN)|(1&amp;lt;&amp;lt;TWIE); 	&lt;br /&gt;
	buffer_adr=0xFF;  &lt;br /&gt;
	sei();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Je nach Statuscode in TWSR müssen verschiedene Bitmuster in TWCR geschreiben werden(siehe Tabellen im Datenblatt!). &lt;br /&gt;
//Makros für die verwendeten Bitmuster:&lt;br /&gt;
&lt;br /&gt;
//ACK nach empfangenen Daten senden/ ACK nach gesendeten Daten erwarten&lt;br /&gt;
#define TWCR_ACK TWCR = (1&amp;lt;&amp;lt;TWEN)|(1&amp;lt;&amp;lt;TWIE)|(1&amp;lt;&amp;lt;TWINT)|(1&amp;lt;&amp;lt;TWEA)|(0&amp;lt;&amp;lt;TWSTA)|(0&amp;lt;&amp;lt;TWSTO)|(0&amp;lt;&amp;lt;TWWC);  &lt;br /&gt;
&lt;br /&gt;
//NACK nach empfangenen Daten senden/ NACK nach gesendeten Daten erwarten     &lt;br /&gt;
#define TWCR_NACK TWCR = (1&amp;lt;&amp;lt;TWEN)|(1&amp;lt;&amp;lt;TWIE)|(1&amp;lt;&amp;lt;TWINT)|(0&amp;lt;&amp;lt;TWEA)|(0&amp;lt;&amp;lt;TWSTA)|(0&amp;lt;&amp;lt;TWSTO)|(0&amp;lt;&amp;lt;TWWC);&lt;br /&gt;
&lt;br /&gt;
//switched to the non adressed slave mode...&lt;br /&gt;
#define TWCR_RESET TWCR = (1&amp;lt;&amp;lt;TWEN)|(1&amp;lt;&amp;lt;TWIE)|(1&amp;lt;&amp;lt;TWINT)|(1&amp;lt;&amp;lt;TWEA)|(0&amp;lt;&amp;lt;TWSTA)|(0&amp;lt;&amp;lt;TWSTO)|(0&amp;lt;&amp;lt;TWWC);  &lt;br /&gt;
//Die Bitmuster für TWCR_ACK und TWCR_RESET sind gleich. Dies ist kein Fehler und dient nur der Übersicht!&lt;br /&gt;
&lt;br /&gt;
/*ISR, die bei einem Ereignis auf dem Bus ausgelöst wird. Im Register TWSR befindet sich dann &lt;br /&gt;
ein Statuscode, anhand dessen die Situation festgestellt werden kann.&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ISR (TWI_vect)  &lt;br /&gt;
{&lt;br /&gt;
	uint8_t data=0;&lt;br /&gt;
	switch (TW_STATUS) //TWI-Statusregister prüfen und nötige Aktion bestimmen &lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
// Slave Receiver &lt;br /&gt;
&lt;br /&gt;
	case TW_SR_SLA_ACK: // 0x60 Slave Receiver, Slave wurde adressiert	&lt;br /&gt;
	     TWCR_ACK; // nächstes Datenbyte empfangen, ACK danach senden&lt;br /&gt;
		 buffer_adr=0xFF; //Bufferposition ist undefiniert&lt;br /&gt;
		 break;&lt;br /&gt;
	&lt;br /&gt;
	case TW_SR_DATA_ACK: // 0x80 Slave Receiver, ein Datenbyte wurde empfangen&lt;br /&gt;
	 	 data=TWDR; //Empfangene Daten auslesen&lt;br /&gt;
		 if (buffer_adr == 0xFF) //erster Zugriff, Bufferposition setzen&lt;br /&gt;
			{&lt;br /&gt;
			//Kontrolle ob gewünschte Adresse im erlaubten bereich&lt;br /&gt;
			if(data&amp;lt;i2c_buffer_size)&lt;br /&gt;
				{&lt;br /&gt;
					buffer_adr= data; //Bufferposition wie adressiert setzen&lt;br /&gt;
				}&lt;br /&gt;
			else&lt;br /&gt;
				{&lt;br /&gt;
					buffer_adr=0; //Adresse auf Null setzen. Ist das sinnvoll? TO DO!&lt;br /&gt;
				}				&lt;br /&gt;
			TWCR_ACK;	// nächstes Datenbyte empfangen, ACK danach, um nächstes Byte anzufordern&lt;br /&gt;
		 }&lt;br /&gt;
		 else //weiterer Zugriff, nachdem die Position im Buffer gesetzt wurde. NUn die Daten empfangen und speichern&lt;br /&gt;
		 {&lt;br /&gt;
		&lt;br /&gt;
			if(buffer_adr&amp;lt;i2c_buffer_size)&lt;br /&gt;
				{&lt;br /&gt;
					//if(!I2C_reg_Schreibschutz[buffer_adr]) //Wenn Position nicht schreibgeschützt...&lt;br /&gt;
						i2cdata[buffer_adr]=data; 			//...dann Daten in Buffer schreibe&lt;br /&gt;
						&lt;br /&gt;
						&lt;br /&gt;
				}&lt;br /&gt;
			buffer_adr++; //Buffer-Adresse weiterzählen für nächsten Schreibzugriff&lt;br /&gt;
			TWCR_ACK;	&lt;br /&gt;
		 }&lt;br /&gt;
		break;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Slave transmitter&lt;br /&gt;
&lt;br /&gt;
		case TW_ST_SLA_ACK: //0xA8 Slave wurde im Lesemodus adressiert und hat ein ACK zurückgegeben.&lt;br /&gt;
	//Hier steht kein break! Es wird also der folgende Code ebenfalls ausgeführt!&lt;br /&gt;
	&lt;br /&gt;
		case TW_ST_DATA_ACK: //0xB8 Slave Transmitter, Daten wurden angefordert&lt;br /&gt;
			if (buffer_adr == 0xFF) //zuvor keine Leseadresse angegeben! &lt;br /&gt;
			{&lt;br /&gt;
			buffer_adr=0;&lt;br /&gt;
			}	&lt;br /&gt;
		&lt;br /&gt;
			if(buffer_adr&amp;lt;i2c_buffer_size)	&lt;br /&gt;
			{&lt;br /&gt;
			TWDR = i2cdata[buffer_adr]; //Datenbyte senden&lt;br /&gt;
			buffer_adr++; //bufferadresse für nächstes Byte weiterzählen&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
			TWDR=0; //Kein Daten mehr im Buffer&lt;br /&gt;
			}&lt;br /&gt;
			TWCR_ACK;&lt;br /&gt;
		break;&lt;br /&gt;
&lt;br /&gt;
	case TW_ST_DATA_NACK: // 0xC0 Keine Daten mehr gefordert &lt;br /&gt;
	case TW_SR_DATA_NACK: // 0x88 &lt;br /&gt;
	case TW_ST_LAST_DATA: // 0xC8  Last data byte in TWDR has been transmitted (TWEA = “0”); ACK has been received&lt;br /&gt;
	case TW_SR_STOP:      // 0xA0 STOP empfangen&lt;br /&gt;
	default: 	&lt;br /&gt;
    TWCR_RESET;&lt;br /&gt;
	break;&lt;br /&gt;
	} //end.switch (TW_STATUS)&lt;br /&gt;
} //end.ISR(TWI_vect)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void warte (int loop)  //loop: wartezeit in ms &lt;br /&gt;
{&lt;br /&gt;
	int i;&lt;br /&gt;
	for(i=0;i&amp;lt;loop;i++) _delay_ms(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main (void)&lt;br /&gt;
{&lt;br /&gt;
//TWI als Slave mit Adresse slaveadr starten&lt;br /&gt;
init_twi_slave(SLAVE_ADRESSE);&lt;br /&gt;
&lt;br /&gt;
//i2cdatamit Werten füllen, die der Master auslesen und ändern kann&lt;br /&gt;
for(uint8_t i=0;i&amp;lt;i2c_buffer_size;i++)&lt;br /&gt;
	{&lt;br /&gt;
		i2cdata[i]=10+i;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
//Serielle Schnittstelle aktivieren&lt;br /&gt;
uart_init((UART_BAUD_SELECT((BAUD),F_CPU)));&lt;br /&gt;
uart_puts(&amp;quot;I2C-Test\r\n&amp;quot;);&lt;br /&gt;
uart_puts(&amp;quot;Teste I2C-Slave mit Adresse &amp;quot;); uart_puti(SLAVE_ADRESSE);&lt;br /&gt;
uart_puts(&amp;quot;\r\n&amp;quot;);&lt;br /&gt;
uart_puts(&amp;quot;\r\n&amp;quot;); //Leerzeile&lt;br /&gt;
&lt;br /&gt;
//in einer Endlosschleife den Inhalt der Buffer ausgeben&lt;br /&gt;
while(1) &lt;br /&gt;
{&lt;br /&gt;
	uart_puts(&amp;quot;i2cdata:\r\n&amp;quot;);&lt;br /&gt;
	for(uint8_t i=0;i&amp;lt;i2c_buffer_size;i++)&lt;br /&gt;
		{&lt;br /&gt;
			uart_puti(i2cdata[i]);&lt;br /&gt;
			uart_puts(&amp;quot;\r\n&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	uart_puts(&amp;quot;\r\n&amp;quot;);//leerzeile&lt;br /&gt;
warte(500);&lt;br /&gt;
} //end.while&lt;br /&gt;
} //end.main&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Slave sourcecode ==&lt;br /&gt;
Die twislave.c für den Slave. Stand: 5.4.2010 &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;util/twi.h&amp;gt; 		//enthält z.B. die Bezeichnungen für die Statuscodes in TWSR&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;  //dient zur Behandlung der Interrupts&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt; 		//definiert den Datentyp uint8_t&lt;br /&gt;
#include &amp;quot;twislave.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
//%%%%%%%% Globale Variablen, die vom Hauptprogramm genutzt werden %%%%%%%%&lt;br /&gt;
/*Der Buffer, in dem die Daten gespeichert werden. &lt;br /&gt;
Aus Sicht des Masters läuft der Zugrif auf den Buffer genau wie bei einem I2C-EEPROm ab.&lt;br /&gt;
Für den Slave ist es eine globale Variable&lt;br /&gt;
*/&lt;br /&gt;
volatile uint8_t i2cdata[i2c_buffer_size+1];&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
volatile uint8_t buffer_adr; //&amp;quot;Adressregister&amp;quot; für den Buffer&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*Initaliserung des TWI-Inteface. Muss zu Beginn aufgerufen werden, sowie bei einem Wechsel der Slave Adresse&lt;br /&gt;
Parameter adr: gewünschte Slave-Adresse&lt;br /&gt;
*/&lt;br /&gt;
void init_twi_slave(uint8_t adr)&lt;br /&gt;
{&lt;br /&gt;
	TWAR= adr; //Adresse setzen&lt;br /&gt;
	TWCR &amp;amp;= ~(1&amp;lt;&amp;lt;TWSTA)|(1&amp;lt;&amp;lt;TWSTO);&lt;br /&gt;
	TWCR|= (1&amp;lt;&amp;lt;TWEA) | (1&amp;lt;&amp;lt;TWEN)|(1&amp;lt;&amp;lt;TWIE); 	&lt;br /&gt;
	buffer_adr=0xFF;  &lt;br /&gt;
	sei();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Je nach Statuscode in TWSR müssen verschiedene Bitmuster in TWCR geschreiben werden(siehe Tabellen im Datenblatt!). &lt;br /&gt;
//Makros für die verwendeten Bitmuster:&lt;br /&gt;
&lt;br /&gt;
//ACK nach empfangenen Daten senden/ ACK nach gesendeten Daten erwarten&lt;br /&gt;
#define TWCR_ACK TWCR = (1&amp;lt;&amp;lt;TWEN)|(1&amp;lt;&amp;lt;TWIE)|(1&amp;lt;&amp;lt;TWINT)|(1&amp;lt;&amp;lt;TWEA)|(0&amp;lt;&amp;lt;TWSTA)|(0&amp;lt;&amp;lt;TWSTO)|(0&amp;lt;&amp;lt;TWWC);  &lt;br /&gt;
&lt;br /&gt;
//NACK nach empfangenen Daten senden/ NACK nach gesendeten Daten erwarten     &lt;br /&gt;
#define TWCR_NACK TWCR = (1&amp;lt;&amp;lt;TWEN)|(1&amp;lt;&amp;lt;TWIE)|(1&amp;lt;&amp;lt;TWINT)|(0&amp;lt;&amp;lt;TWEA)|(0&amp;lt;&amp;lt;TWSTA)|(0&amp;lt;&amp;lt;TWSTO)|(0&amp;lt;&amp;lt;TWWC);&lt;br /&gt;
&lt;br /&gt;
//switched to the non adressed slave mode...&lt;br /&gt;
#define TWCR_RESET TWCR = (1&amp;lt;&amp;lt;TWEN)|(1&amp;lt;&amp;lt;TWIE)|(1&amp;lt;&amp;lt;TWINT)|(1&amp;lt;&amp;lt;TWEA)|(0&amp;lt;&amp;lt;TWSTA)|(0&amp;lt;&amp;lt;TWSTO)|(0&amp;lt;&amp;lt;TWWC);  &lt;br /&gt;
//Die Bitmuster für TWCR_ACK und TWCR_RESET sind gleich. Dies ist kein Fehler und dient nur der Übersicht!&lt;br /&gt;
&lt;br /&gt;
/*ISR, die bei einem Ereignis auf dem Bus ausgelöst wird. Im Register TWSR befindet sich dann &lt;br /&gt;
ein Statuscode, anhand dessen die Situation festgestellt werden kann.&lt;br /&gt;
*/&lt;br /&gt;
ISR (TWI_vect)  &lt;br /&gt;
{&lt;br /&gt;
uint8_t data=0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
switch (TW_STATUS) //TWI-Statusregister prüfen und nötige Aktion bestimmen &lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
// Slave Receiver &lt;br /&gt;
&lt;br /&gt;
case TW_SR_SLA_ACK: // 0x60 Slave Receiver, Slave wurde adressiert	&lt;br /&gt;
	TWCR_ACK; // nächstes Datenbyte empfangen, ACK danach senden&lt;br /&gt;
	buffer_adr=0xFF; //Bufferposition ist undefiniert&lt;br /&gt;
break;&lt;br /&gt;
	&lt;br /&gt;
case TW_SR_DATA_ACK: // 0x80 Slave Receiver, ein Datenbyte wurde empfangen&lt;br /&gt;
	data=TWDR; //Empfangene Daten auslesen&lt;br /&gt;
	if (buffer_adr == 0xFF) //erster Zugriff, Bufferposition setzen&lt;br /&gt;
		{&lt;br /&gt;
			//Kontrolle ob gewünschte Adresse im erlaubten bereich&lt;br /&gt;
			if(data&amp;lt;i2c_buffer_size)&lt;br /&gt;
				{&lt;br /&gt;
					buffer_adr= data; //Bufferposition wie adressiert setzen&lt;br /&gt;
				}&lt;br /&gt;
			else&lt;br /&gt;
				{&lt;br /&gt;
					buffer_adr=0; //Adresse auf Null setzen. Ist das sinnvoll? TO DO!&lt;br /&gt;
				}				&lt;br /&gt;
			TWCR_ACK;	// nächstes Datenbyte empfangen, ACK danach, um nächstes Byte anzufordern&lt;br /&gt;
		}&lt;br /&gt;
	else //weiterer Zugriff, nachdem die Position im Buffer gesetzt wurde. NUn die Daten empfangen und speichern&lt;br /&gt;
		{&lt;br /&gt;
		&lt;br /&gt;
			if(buffer_adr&amp;lt;i2c_buffer_size)&lt;br /&gt;
				{&lt;br /&gt;
					if(!I2C_reg_Schreibschutz[buffer_adr]) //Wenn Position nicht schreibgeschützt...&lt;br /&gt;
						i2cdata[buffer_adr]=data; 			//...dann Daten in Buffer schreibe&lt;br /&gt;
						&lt;br /&gt;
						&lt;br /&gt;
				}&lt;br /&gt;
			buffer_adr++; //Buffer-Adresse weiterzählen für nächsten Schreibzugriff&lt;br /&gt;
			TWCR_ACK;	&lt;br /&gt;
		}&lt;br /&gt;
break;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Slave transmitter&lt;br /&gt;
&lt;br /&gt;
case TW_ST_SLA_ACK: //0xA8 Slave wurde im Lesemodus adressiert und hat ein ACK zurückgegeben.&lt;br /&gt;
	//Hier steht kein break! Es wird also der folgende Code ebenfalls ausgeführt!&lt;br /&gt;
	&lt;br /&gt;
case TW_ST_DATA_ACK: //0xB8 Slave Transmitter, Daten wurden angefordert&lt;br /&gt;
&lt;br /&gt;
	if (buffer_adr == 0xFF) //zuvor keine Leseadresse angegeben! &lt;br /&gt;
		{&lt;br /&gt;
			buffer_adr=0;&lt;br /&gt;
		}	&lt;br /&gt;
		&lt;br /&gt;
	if(buffer_adr&amp;lt;i2c_buffer_size)	&lt;br /&gt;
		{&lt;br /&gt;
			TWDR = i2cdata[buffer_adr]; //Datenbyte senden&lt;br /&gt;
			buffer_adr++; //bufferadresse für nächstes Byte weiterzählen&lt;br /&gt;
		}&lt;br /&gt;
	else&lt;br /&gt;
		{&lt;br /&gt;
			TWDR=0; //Kein Daten mehr im Buffer&lt;br /&gt;
		}&lt;br /&gt;
	TWCR_ACK;&lt;br /&gt;
break;&lt;br /&gt;
&lt;br /&gt;
case TW_ST_DATA_NACK: // 0xC0 Keine Daten mehr gefordert &lt;br /&gt;
case TW_SR_DATA_NACK: // 0x88 &lt;br /&gt;
case TW_ST_LAST_DATA: // 0xC8  Last data byte in TWDR has been transmitted (TWEA = “0”); ACK has been received&lt;br /&gt;
case TW_SR_STOP:      // 0xA0 STOP empfangen&lt;br /&gt;
default: 	&lt;br /&gt;
    TWCR_RESET;&lt;br /&gt;
break;&lt;br /&gt;
	&lt;br /&gt;
} //end.switch (TW_STATUS)&lt;br /&gt;
} //end.ISR(TWI_vect)&lt;br /&gt;
&lt;br /&gt;
////Ende von twislave.c////&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Slave header ==&lt;br /&gt;
Die zugehörige Headerdatei twislave.h für den Slave. Stand: 19.2.2010&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#ifndef _TWISLAVE_H&lt;br /&gt;
#define _TWISLAVE_H&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;util/twi.h&amp;gt; 		  //enthaelt z.B. die Bezeichnungen fuer die Statuscodes in TWSR&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;  //dient zur behandlung der Interrupts&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt; 		    //definiert den Datentyp uint8_t&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 *  @defgroup twislave TWI-Slave&lt;br /&gt;
 *  @code #include &amp;quot;twislave.h&amp;quot; @endcode&lt;br /&gt;
 * &lt;br /&gt;
 *  @brief Betrieb eines AVRs mit Hardware-TWI-Schnittstelle als Slave.&lt;br /&gt;
 *  Zu Beginn muss init_twi_slave mit der gewuenschten Slave-Adresse als&lt;br /&gt;
 *  Parameter aufgerufen werden.&lt;br /&gt;
 *&lt;br /&gt;
 * Der Datenaustausch mit dem Master erfolgt ueber den Buffer i2cdata, &lt;br /&gt;
 * auf den von Master und Slave zugegriffen werden kann. &lt;br /&gt;
 * Dies ist fuer den Slave eine globale Variable (Array aus uint8_t). &lt;br /&gt;
&lt;br /&gt;
 * Der Zugriff durch den Master erfolgt aehnlich wie bei einem&lt;br /&gt;
 * normalen I2C-EEPROM.&lt;br /&gt;
 * Man sendet zunaechst die Bufferposition, an die man schreiben will,&lt;br /&gt;
 * und dann die Daten. &lt;br /&gt;
 * Die Bufferposition wird automatisch hochgezaehlt, sodass man mehrere&lt;br /&gt;
 * Datenbytes hintereinander schreiben kann, ohne jedesmal die &lt;br /&gt;
 * Bufferadresse zu schreiben.&lt;br /&gt;
 *&lt;br /&gt;
 * Um vom Master aus zu lesen, uebertraegt man zunaechst in einem &lt;br /&gt;
 * Schreibzugriff die gewuenschte Bufferposition und liest dann nach&lt;br /&gt;
 * einem repeated start die Daten aus. Die Bufferposition wird &lt;br /&gt;
 * automatisch hochgezaehlt, sodass man mehrere Datenbytes&lt;br /&gt;
 * hintereinander lesen kann, ohne jedesmal die Bufferposition zu&lt;br /&gt;
 * schreiben.&lt;br /&gt;
 *&lt;br /&gt;
 * Abgefangene Fehlbedienung durch den Master:&lt;br /&gt;
 * - Lesen ueber die Grenze des txbuffers hinaus&lt;br /&gt;
 * - Schreiben ueber die Grenzen des rxbuffers hinaus&lt;br /&gt;
 * - Angabe einer ungueltigen Schreib/Lese-Adresse&lt;br /&gt;
 * - Lesezugriff, ohne vorher Leseadresse geschrieben zu haben&lt;br /&gt;
 * &lt;br /&gt;
 *  @author uwegw&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*@{*/&lt;br /&gt;
&lt;br /&gt;
//%%%%%%%% von Benutzer konfigurierbare Einstellungen %%%%%%%%&lt;br /&gt;
/**@brief Groesse des Buffers in Byte (2..254) */&lt;br /&gt;
#define i2c_buffer_size 10// I2C_REG_ANZAHL 254 Hier kann eingestellt werden wieviele Register ausgegeben werden&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//%%%%%%%% Globale Variablen, die vom Hauptprogramm genutzt werden %%%%%%%%&lt;br /&gt;
/**@brief Der Buffer, in dem die Daten gespeichert werden.&lt;br /&gt;
 * Aus Sicht des Masters laeuft der Zugrif auf den Buffer genau wie&lt;br /&gt;
 *  bei einem I2C-EEPROm ab.&lt;br /&gt;
 * Fuer den Slave ist es eine globale Variable&lt;br /&gt;
*/&lt;br /&gt;
volatile uint8_t i2cdata[i2c_buffer_size+1];&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**@brief Initaliserung des TWI-Inteface. Muss zu Beginn aufgerufen werden, sowie bei einem Wechsel der Slave Adresse&lt;br /&gt;
 * @param adr gewuenschte Slave-Adresse */&lt;br /&gt;
void init_twi_slave(uint8_t adr);&lt;br /&gt;
&lt;br /&gt;
//%%%%%%%% ab hier sind normalerweise keine weiteren Aenderungen erforderlich! %%%%%%%%//&lt;br /&gt;
//____________________________________________________________________________________//&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Bei zu alten AVR-GCC-Versionen werden die Interrupts anders genutzt, daher in diesem Fall mit Fehlermeldung abbrechen&lt;br /&gt;
#if (__GNUC__ * 100 + __GNUC_MINOR__) &amp;lt; 304&lt;br /&gt;
	#error &amp;quot;This library requires AVR-GCC 3.4.5 or later, update to newer AVR-GCC compiler !&amp;quot;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
//Schutz vor unsinnigen Buffergroessen&lt;br /&gt;
#if (i2c_buffer_size &amp;gt; 254)&lt;br /&gt;
	#error Buffer zu gross gewaehlt! Maximal 254 Bytes erlaubt.&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#if (i2c_buffer_size &amp;lt; 2)&lt;br /&gt;
	#error Buffer muss mindestens zwei Byte gross sein!&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#endif //#ifdef _TWISLAVE_H&lt;br /&gt;
////Ende von twislave.h////&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Microcontroller]]&lt;br /&gt;
[[Kategorie:Quellcode C]]&lt;/div&gt;</summary>
		<author><name>HannoHupmann</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=TWI_Slave_mit_avr-gcc&amp;diff=16182</id>
		<title>TWI Slave mit avr-gcc</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=TWI_Slave_mit_avr-gcc&amp;diff=16182"/>
				<updated>2010-04-05T17:16:37Z</updated>
		
		<summary type="html">&lt;p&gt;HannoHupmann: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Programm für einen AVR mit [[TWI]] (Hardware-[[I2C]])-Schnittstelle als Slave.&lt;br /&gt;
Manchmal stellt sich die Aufgabe, mehrere AVRs per [[I2C]] zu vernetzen. Ein Beispiel ist die Erweiterung eines bestehenden Systems um einen leistungsstärkeren Controller. Dies ist etwa beim [[Asuro]] oder [[Yeti]] denkbar, um z.B. mehr Ein/Ausgänge oder Speicherplatz zu bekommen.&lt;br /&gt;
&lt;br /&gt;
Man kann aber beim Bau eines Roboters auch von Anfang an auf ein System von mehreren vernetzten Controllern setzen. So kann man verschiedene Aufgabe, die weitgehend unabhängig voneinader gleichzeitg erledigt werden müssen, besser verteilen. Denkbar ist z.B. ein Controller für die Motorsteuerung, einer für die Sensorik, einer für Ein-und Ausgabe (wie LCD und Bedientaster),... , und ein zentraler Controller, der die Richtung vorgibt und alle anderen Controller mit Befehlen versorgt. Ein konkretes Beispiel ist der Roboterbausatz Nibo (siehe: [http://www.nicai-systems.de/nibo.html]) von nicai-systems, der einen Atmel ATmega128 als Hauptcontroller und zwei Atmel ATtiny44 als Controller für die Motorsteuerung und die IR-Sensorik einsetzt. Die Kommunikation läuft mit 400 kHz über den I2C-Bus mit dem ATmega128 als Master. &lt;br /&gt;
&lt;br /&gt;
Außerdem wurde der Code für einen Mega32 mit dem AVR Studio getestet Beachte: im AVR-Studio ist default ein ATmega128 eingestellt, unter Projekt -&amp;gt; Configuration Options kann das Device geändert werden, außerdem ist die Frequency einzustellen. In meinem Fall waren es 7372800Hz da ich in der Schaltung einen entsprechenden Quarz eingebaut habe. Die Verbindung zwischen Master und Slave erfolgt über die Pins 22 (SCL) und 23 (SDA) und gemeinsamer GND. Abschlusswiderstände (4,7kOhm) nicht vergessen, am besten beim Master, siehe auch I2C-Definitionen.   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Schließlich kann ein entsprechend programmierter AVR auch als Ersatz für handelsübliche I2C-Bauteile dienen. Der kleinste AVR mit Hardware-I2C, der ATmega48, ist mit 1,30€ (Reichelt) billiger als viele normale I2C-ICs. Er kann bei entsprechender Programmierung z.B. die Aufgaben von zwei PCF8574 (8bit-Portexpander, 1,25€) und einem PCF8591 (4fach AD-Wandler, 2,35€) übernehmen und außerdem noch als I2C-EEPROM mit 256 Bytes dienen. &lt;br /&gt;
&lt;br /&gt;
Das folgende Programm (twislave.c) steuert das TWI (Hardware-I2C)-Interface eines AVRs als Slave an. Es müsste auf allen AVRs der Mega-Reihe funktionieren, die über eine TWI-Schnittstelle verfügen. &lt;br /&gt;
&lt;br /&gt;
Das System ist als eine Art Dualport-RAM konzipiert, Master und Slave teilen sich also einen Speicherbereich und können darüber Daten austauschen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Master ==&lt;br /&gt;
Ein Testprogramm für den Master. Es wird die [http://homepage.hispeed.ch/peterfleury/avr-software.html#libs I2C-Master-Bibliothek von Peter Fleury] verwendet.&lt;br /&gt;
Es wird geprüft, ob der Slave bereit ist, dann werden drei Bytes erst in den Slave geschrieben, und anschließend wieder ausgelesen.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// I2C-Master-Routinen von Peter Fleury verwenden &lt;br /&gt;
// siehe http://homepage.hispeed.ch/peterfleury/avr-software.html#libs&lt;br /&gt;
// Hier sind auch die Datein: i2cmaster.h und twimaster.c zu finden, die benötigt werden&lt;br /&gt;
// (wer mit AVR-Studio arbeitet braucht nur diese Datein)&lt;br /&gt;
// Letztes Update des Codes 5. April 2010 durch HannoHupmann&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;quot;i2cmaster.h&amp;quot;  &lt;br /&gt;
#define SLAVE_ADRESSE 0x50&lt;br /&gt;
&lt;br /&gt;
uint8_t byte1 = 42;&lt;br /&gt;
uint8_t byte2 = 43;&lt;br /&gt;
uint8_t byte3 = 44;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  i2c_init();         // init I2C interface&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if(!(i2c_start(SLAVE_ADRESSE+I2C_WRITE))) //Slave bereit zum schreiben?&lt;br /&gt;
{&lt;br /&gt;
  i2c_write(0x00);  // Buffer Startadresse setzen 	&lt;br /&gt;
  i2c_write(byte1); // Drei Bytes schreiben...&lt;br /&gt;
  i2c_write(byte2); &lt;br /&gt;
  i2c_write(byte3); &lt;br /&gt;
  i2c_stop();       // Zugriff beenden&lt;br /&gt;
}&lt;br /&gt;
else&lt;br /&gt;
{&lt;br /&gt;
  /* Hier könnte eine Fehlermeldung ausgegeben werden... */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if(!(i2c_start(SLAVE_ADRESSE+I2C_WRITE))) //Slave bereit zum lesen?&lt;br /&gt;
{&lt;br /&gt;
  i2c_write(0x00); //Buffer Startadresse zum Auslesen&lt;br /&gt;
  i2c_rep_start(SLAVE_ADRESSE+I2C_READ); //Lesen beginnen&lt;br /&gt;
&lt;br /&gt;
  byte1= i2c_readAck(); // Bytes lesen...&lt;br /&gt;
  byte2= i2c_readAck();&lt;br /&gt;
  byte3= i2c_readNak(); // letztes Byte lesen, darum kein ACK&lt;br /&gt;
  i2c_stop();           // Zugriff beenden&lt;br /&gt;
} &lt;br /&gt;
else&lt;br /&gt;
{&lt;br /&gt;
  /* Hier könnte eine Fehlermeldung ausgegeben werden... */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if ((byte1 != 42)||(byte2 != 43)||(byte3 != 44))&lt;br /&gt;
{&lt;br /&gt;
  /* Die Bytes wurden nicht korrekt übertragen und wieder gelesen! */ &lt;br /&gt;
}&lt;br /&gt;
    for(;;);	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Code wurde von mir getestet und funktioniert auf einem Mega32&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Code sollte ohne Probleme kompiliert werden, eventuell fehlen die oben genannten Datein wenn es nicht klappt.&lt;br /&gt;
&lt;br /&gt;
== Slave == &lt;br /&gt;
Hier soll nun der Code behandelt werden der für den Slave-Controller notwendig ist. Der vorgestellte Code schreibt die Register des Slaves an die Serielle Schnittstelle, mit einem Terminal Programm kann man sich die Ausgabe ansehen und überprüfen ob alles korrekt funktioniert. &lt;br /&gt;
Der Code ist wieder an den von Peter Fleury angelehnt.&lt;br /&gt;
&lt;br /&gt;
Für den Mega32 hab ich die twislave.c nicht gebraucht. Dafür aber die uart.c und uart.h welche sich auch bei Peter Fleury finden lassen. Diese müssen nicht angepasst werden. Wichtig ist die richtige Frquenz sonst ist die Ausgabe nicht korrekt. Der Slave sollte ohne Master folgende Ausgabe haben: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
i2cdata: &lt;br /&gt;
10&lt;br /&gt;
11&lt;br /&gt;
12&lt;br /&gt;
13&lt;br /&gt;
usw. &lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Die Register werden der Reihe nach mit ihrem Wert angezeigt. Wird der Master hinzugefügt sollte nun folgende Ausgabe im Terminal erscheinen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
i2cdata: &lt;br /&gt;
42&lt;br /&gt;
43&lt;br /&gt;
44&lt;br /&gt;
13&lt;br /&gt;
usw. &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Slave Testprogramm ==&lt;br /&gt;
Ein Testprogramm für den Slave. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
Testprogramm für den Slave &lt;br /&gt;
Der Buffer wird mit Werten gefüllt. Dann wird er fortlaufend über die serielle Schnittstelle ausgegeben.&lt;br /&gt;
*/&lt;br /&gt;
#include &amp;lt;util/twi.h&amp;gt; 		//enthält z.B. die Bezeichnungen für die Statuscodes in TWSR&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;  //dient zur Behandlung der Interrupts&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt; 		//definiert den Datentyp uint8_t&lt;br /&gt;
#include &amp;quot;twislave.h&amp;quot;&lt;br /&gt;
#include &amp;quot;uart.h&amp;quot;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#define BAUD 9600 //Baudrate&lt;br /&gt;
#define SLAVE_ADRESSE 0x50 //Die Slave-Adresse&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
volatile uint8_t i2cdata[i2c_buffer_size+1];&lt;br /&gt;
volatile uint8_t buffer_adr; 					//&amp;quot;Adressregister&amp;quot; für den Buffer&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*Initaliserung des TWI-Inteface. Muss zu Beginn aufgerufen werden, sowie bei einem Wechsel der Slave Adresse&lt;br /&gt;
Parameter adr: gewünschte Slave-Adresse&lt;br /&gt;
*/&lt;br /&gt;
void init_twi_slave(uint8_t adr)&lt;br /&gt;
{&lt;br /&gt;
	TWAR= adr; //Adresse setzen&lt;br /&gt;
	TWCR &amp;amp;= ~(1&amp;lt;&amp;lt;TWSTA)|(1&amp;lt;&amp;lt;TWSTO);&lt;br /&gt;
	TWCR|= (1&amp;lt;&amp;lt;TWEA) | (1&amp;lt;&amp;lt;TWEN)|(1&amp;lt;&amp;lt;TWIE); 	&lt;br /&gt;
	buffer_adr=0xFF;  &lt;br /&gt;
	sei();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Je nach Statuscode in TWSR müssen verschiedene Bitmuster in TWCR geschreiben werden(siehe Tabellen im Datenblatt!). &lt;br /&gt;
//Makros für die verwendeten Bitmuster:&lt;br /&gt;
&lt;br /&gt;
//ACK nach empfangenen Daten senden/ ACK nach gesendeten Daten erwarten&lt;br /&gt;
#define TWCR_ACK TWCR = (1&amp;lt;&amp;lt;TWEN)|(1&amp;lt;&amp;lt;TWIE)|(1&amp;lt;&amp;lt;TWINT)|(1&amp;lt;&amp;lt;TWEA)|(0&amp;lt;&amp;lt;TWSTA)|(0&amp;lt;&amp;lt;TWSTO)|(0&amp;lt;&amp;lt;TWWC);  &lt;br /&gt;
&lt;br /&gt;
//NACK nach empfangenen Daten senden/ NACK nach gesendeten Daten erwarten     &lt;br /&gt;
#define TWCR_NACK TWCR = (1&amp;lt;&amp;lt;TWEN)|(1&amp;lt;&amp;lt;TWIE)|(1&amp;lt;&amp;lt;TWINT)|(0&amp;lt;&amp;lt;TWEA)|(0&amp;lt;&amp;lt;TWSTA)|(0&amp;lt;&amp;lt;TWSTO)|(0&amp;lt;&amp;lt;TWWC);&lt;br /&gt;
&lt;br /&gt;
//switched to the non adressed slave mode...&lt;br /&gt;
#define TWCR_RESET TWCR = (1&amp;lt;&amp;lt;TWEN)|(1&amp;lt;&amp;lt;TWIE)|(1&amp;lt;&amp;lt;TWINT)|(1&amp;lt;&amp;lt;TWEA)|(0&amp;lt;&amp;lt;TWSTA)|(0&amp;lt;&amp;lt;TWSTO)|(0&amp;lt;&amp;lt;TWWC);  &lt;br /&gt;
//Die Bitmuster für TWCR_ACK und TWCR_RESET sind gleich. Dies ist kein Fehler und dient nur der Übersicht!&lt;br /&gt;
&lt;br /&gt;
/*ISR, die bei einem Ereignis auf dem Bus ausgelöst wird. Im Register TWSR befindet sich dann &lt;br /&gt;
ein Statuscode, anhand dessen die Situation festgestellt werden kann.&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ISR (TWI_vect)  &lt;br /&gt;
{&lt;br /&gt;
	uint8_t data=0;&lt;br /&gt;
	switch (TW_STATUS) //TWI-Statusregister prüfen und nötige Aktion bestimmen &lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
// Slave Receiver &lt;br /&gt;
&lt;br /&gt;
	case TW_SR_SLA_ACK: // 0x60 Slave Receiver, Slave wurde adressiert	&lt;br /&gt;
	     TWCR_ACK; // nächstes Datenbyte empfangen, ACK danach senden&lt;br /&gt;
		 buffer_adr=0xFF; //Bufferposition ist undefiniert&lt;br /&gt;
		 break;&lt;br /&gt;
	&lt;br /&gt;
	case TW_SR_DATA_ACK: // 0x80 Slave Receiver, ein Datenbyte wurde empfangen&lt;br /&gt;
	 	 data=TWDR; //Empfangene Daten auslesen&lt;br /&gt;
		 if (buffer_adr == 0xFF) //erster Zugriff, Bufferposition setzen&lt;br /&gt;
			{&lt;br /&gt;
			//Kontrolle ob gewünschte Adresse im erlaubten bereich&lt;br /&gt;
			if(data&amp;lt;i2c_buffer_size)&lt;br /&gt;
				{&lt;br /&gt;
					buffer_adr= data; //Bufferposition wie adressiert setzen&lt;br /&gt;
				}&lt;br /&gt;
			else&lt;br /&gt;
				{&lt;br /&gt;
					buffer_adr=0; //Adresse auf Null setzen. Ist das sinnvoll? TO DO!&lt;br /&gt;
				}				&lt;br /&gt;
			TWCR_ACK;	// nächstes Datenbyte empfangen, ACK danach, um nächstes Byte anzufordern&lt;br /&gt;
		 }&lt;br /&gt;
		 else //weiterer Zugriff, nachdem die Position im Buffer gesetzt wurde. NUn die Daten empfangen und speichern&lt;br /&gt;
		 {&lt;br /&gt;
		&lt;br /&gt;
			if(buffer_adr&amp;lt;i2c_buffer_size)&lt;br /&gt;
				{&lt;br /&gt;
					//if(!I2C_reg_Schreibschutz[buffer_adr]) //Wenn Position nicht schreibgeschützt...&lt;br /&gt;
						i2cdata[buffer_adr]=data; 			//...dann Daten in Buffer schreibe&lt;br /&gt;
						&lt;br /&gt;
						&lt;br /&gt;
				}&lt;br /&gt;
			buffer_adr++; //Buffer-Adresse weiterzählen für nächsten Schreibzugriff&lt;br /&gt;
			TWCR_ACK;	&lt;br /&gt;
		 }&lt;br /&gt;
		break;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Slave transmitter&lt;br /&gt;
&lt;br /&gt;
		case TW_ST_SLA_ACK: //0xA8 Slave wurde im Lesemodus adressiert und hat ein ACK zurückgegeben.&lt;br /&gt;
	//Hier steht kein break! Es wird also der folgende Code ebenfalls ausgeführt!&lt;br /&gt;
	&lt;br /&gt;
		case TW_ST_DATA_ACK: //0xB8 Slave Transmitter, Daten wurden angefordert&lt;br /&gt;
			if (buffer_adr == 0xFF) //zuvor keine Leseadresse angegeben! &lt;br /&gt;
			{&lt;br /&gt;
			buffer_adr=0;&lt;br /&gt;
			}	&lt;br /&gt;
		&lt;br /&gt;
			if(buffer_adr&amp;lt;i2c_buffer_size)	&lt;br /&gt;
			{&lt;br /&gt;
			TWDR = i2cdata[buffer_adr]; //Datenbyte senden&lt;br /&gt;
			buffer_adr++; //bufferadresse für nächstes Byte weiterzählen&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
			TWDR=0; //Kein Daten mehr im Buffer&lt;br /&gt;
			}&lt;br /&gt;
			TWCR_ACK;&lt;br /&gt;
		break;&lt;br /&gt;
&lt;br /&gt;
	case TW_ST_DATA_NACK: // 0xC0 Keine Daten mehr gefordert &lt;br /&gt;
	case TW_SR_DATA_NACK: // 0x88 &lt;br /&gt;
	case TW_ST_LAST_DATA: // 0xC8  Last data byte in TWDR has been transmitted (TWEA = “0”); ACK has been received&lt;br /&gt;
	case TW_SR_STOP:      // 0xA0 STOP empfangen&lt;br /&gt;
	default: 	&lt;br /&gt;
    TWCR_RESET;&lt;br /&gt;
	break;&lt;br /&gt;
	} //end.switch (TW_STATUS)&lt;br /&gt;
} //end.ISR(TWI_vect)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void warte (int loop)  //loop: wartezeit in ms &lt;br /&gt;
{&lt;br /&gt;
	int i;&lt;br /&gt;
	for(i=0;i&amp;lt;loop;i++) _delay_ms(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main (void)&lt;br /&gt;
{&lt;br /&gt;
//TWI als Slave mit Adresse slaveadr starten&lt;br /&gt;
init_twi_slave(SLAVE_ADRESSE);&lt;br /&gt;
&lt;br /&gt;
//i2cdatamit Werten füllen, die der Master auslesen und ändern kann&lt;br /&gt;
for(uint8_t i=0;i&amp;lt;i2c_buffer_size;i++)&lt;br /&gt;
	{&lt;br /&gt;
		i2cdata[i]=10+i;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
//Serielle Schnittstelle aktivieren&lt;br /&gt;
uart_init((UART_BAUD_SELECT((BAUD),F_CPU)));&lt;br /&gt;
uart_puts(&amp;quot;I2C-Test\r\n&amp;quot;);&lt;br /&gt;
uart_puts(&amp;quot;Teste I2C-Slave mit Adresse &amp;quot;); uart_puti(SLAVE_ADRESSE);&lt;br /&gt;
uart_puts(&amp;quot;\r\n&amp;quot;);&lt;br /&gt;
uart_puts(&amp;quot;\r\n&amp;quot;); //Leerzeile&lt;br /&gt;
&lt;br /&gt;
//in einer Endlosschleife den Inhalt der Buffer ausgeben&lt;br /&gt;
while(1) &lt;br /&gt;
{&lt;br /&gt;
	uart_puts(&amp;quot;i2cdata:\r\n&amp;quot;);&lt;br /&gt;
	for(uint8_t i=0;i&amp;lt;i2c_buffer_size;i++)&lt;br /&gt;
		{&lt;br /&gt;
			uart_puti(i2cdata[i]);&lt;br /&gt;
			uart_puts(&amp;quot;\r\n&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	uart_puts(&amp;quot;\r\n&amp;quot;);//leerzeile&lt;br /&gt;
warte(500);&lt;br /&gt;
} //end.while&lt;br /&gt;
} //end.main&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Slave sourcecode ==&lt;br /&gt;
Die twislave.c für den Slave. Stand: 5.4.2010 &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;util/twi.h&amp;gt; 		//enthält z.B. die Bezeichnungen für die Statuscodes in TWSR&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;  //dient zur Behandlung der Interrupts&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt; 		//definiert den Datentyp uint8_t&lt;br /&gt;
#include &amp;quot;twislave.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
//%%%%%%%% Globale Variablen, die vom Hauptprogramm genutzt werden %%%%%%%%&lt;br /&gt;
/*Der Buffer, in dem die Daten gespeichert werden. &lt;br /&gt;
Aus Sicht des Masters läuft der Zugrif auf den Buffer genau wie bei einem I2C-EEPROm ab.&lt;br /&gt;
Für den Slave ist es eine globale Variable&lt;br /&gt;
*/&lt;br /&gt;
volatile uint8_t i2cdata[i2c_buffer_size+1];&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
volatile uint8_t buffer_adr; //&amp;quot;Adressregister&amp;quot; für den Buffer&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*Initaliserung des TWI-Inteface. Muss zu Beginn aufgerufen werden, sowie bei einem Wechsel der Slave Adresse&lt;br /&gt;
Parameter adr: gewünschte Slave-Adresse&lt;br /&gt;
*/&lt;br /&gt;
void init_twi_slave(uint8_t adr)&lt;br /&gt;
{&lt;br /&gt;
	TWAR= adr; //Adresse setzen&lt;br /&gt;
	TWCR &amp;amp;= ~(1&amp;lt;&amp;lt;TWSTA)|(1&amp;lt;&amp;lt;TWSTO);&lt;br /&gt;
	TWCR|= (1&amp;lt;&amp;lt;TWEA) | (1&amp;lt;&amp;lt;TWEN)|(1&amp;lt;&amp;lt;TWIE); 	&lt;br /&gt;
	buffer_adr=0xFF;  &lt;br /&gt;
	sei();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Je nach Statuscode in TWSR müssen verschiedene Bitmuster in TWCR geschreiben werden(siehe Tabellen im Datenblatt!). &lt;br /&gt;
//Makros für die verwendeten Bitmuster:&lt;br /&gt;
&lt;br /&gt;
//ACK nach empfangenen Daten senden/ ACK nach gesendeten Daten erwarten&lt;br /&gt;
#define TWCR_ACK TWCR = (1&amp;lt;&amp;lt;TWEN)|(1&amp;lt;&amp;lt;TWIE)|(1&amp;lt;&amp;lt;TWINT)|(1&amp;lt;&amp;lt;TWEA)|(0&amp;lt;&amp;lt;TWSTA)|(0&amp;lt;&amp;lt;TWSTO)|(0&amp;lt;&amp;lt;TWWC);  &lt;br /&gt;
&lt;br /&gt;
//NACK nach empfangenen Daten senden/ NACK nach gesendeten Daten erwarten     &lt;br /&gt;
#define TWCR_NACK TWCR = (1&amp;lt;&amp;lt;TWEN)|(1&amp;lt;&amp;lt;TWIE)|(1&amp;lt;&amp;lt;TWINT)|(0&amp;lt;&amp;lt;TWEA)|(0&amp;lt;&amp;lt;TWSTA)|(0&amp;lt;&amp;lt;TWSTO)|(0&amp;lt;&amp;lt;TWWC);&lt;br /&gt;
&lt;br /&gt;
//switched to the non adressed slave mode...&lt;br /&gt;
#define TWCR_RESET TWCR = (1&amp;lt;&amp;lt;TWEN)|(1&amp;lt;&amp;lt;TWIE)|(1&amp;lt;&amp;lt;TWINT)|(1&amp;lt;&amp;lt;TWEA)|(0&amp;lt;&amp;lt;TWSTA)|(0&amp;lt;&amp;lt;TWSTO)|(0&amp;lt;&amp;lt;TWWC);  &lt;br /&gt;
//Die Bitmuster für TWCR_ACK und TWCR_RESET sind gleich. Dies ist kein Fehler und dient nur der Übersicht!&lt;br /&gt;
&lt;br /&gt;
/*ISR, die bei einem Ereignis auf dem Bus ausgelöst wird. Im Register TWSR befindet sich dann &lt;br /&gt;
ein Statuscode, anhand dessen die Situation festgestellt werden kann.&lt;br /&gt;
*/&lt;br /&gt;
ISR (TWI_vect)  &lt;br /&gt;
{&lt;br /&gt;
uint8_t data=0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
switch (TW_STATUS) //TWI-Statusregister prüfen und nötige Aktion bestimmen &lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
// Slave Receiver &lt;br /&gt;
&lt;br /&gt;
case TW_SR_SLA_ACK: // 0x60 Slave Receiver, Slave wurde adressiert	&lt;br /&gt;
	TWCR_ACK; // nächstes Datenbyte empfangen, ACK danach senden&lt;br /&gt;
	buffer_adr=0xFF; //Bufferposition ist undefiniert&lt;br /&gt;
break;&lt;br /&gt;
	&lt;br /&gt;
case TW_SR_DATA_ACK: // 0x80 Slave Receiver, ein Datenbyte wurde empfangen&lt;br /&gt;
	data=TWDR; //Empfangene Daten auslesen&lt;br /&gt;
	if (buffer_adr == 0xFF) //erster Zugriff, Bufferposition setzen&lt;br /&gt;
		{&lt;br /&gt;
			//Kontrolle ob gewünschte Adresse im erlaubten bereich&lt;br /&gt;
			if(data&amp;lt;i2c_buffer_size)&lt;br /&gt;
				{&lt;br /&gt;
					buffer_adr= data; //Bufferposition wie adressiert setzen&lt;br /&gt;
				}&lt;br /&gt;
			else&lt;br /&gt;
				{&lt;br /&gt;
					buffer_adr=0; //Adresse auf Null setzen. Ist das sinnvoll? TO DO!&lt;br /&gt;
				}				&lt;br /&gt;
			TWCR_ACK;	// nächstes Datenbyte empfangen, ACK danach, um nächstes Byte anzufordern&lt;br /&gt;
		}&lt;br /&gt;
	else //weiterer Zugriff, nachdem die Position im Buffer gesetzt wurde. NUn die Daten empfangen und speichern&lt;br /&gt;
		{&lt;br /&gt;
		&lt;br /&gt;
			if(buffer_adr&amp;lt;i2c_buffer_size)&lt;br /&gt;
				{&lt;br /&gt;
					if(!I2C_reg_Schreibschutz[buffer_adr]) //Wenn Position nicht schreibgeschützt...&lt;br /&gt;
						i2cdata[buffer_adr]=data; 			//...dann Daten in Buffer schreibe&lt;br /&gt;
						&lt;br /&gt;
						&lt;br /&gt;
				}&lt;br /&gt;
			buffer_adr++; //Buffer-Adresse weiterzählen für nächsten Schreibzugriff&lt;br /&gt;
			TWCR_ACK;	&lt;br /&gt;
		}&lt;br /&gt;
break;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Slave transmitter&lt;br /&gt;
&lt;br /&gt;
case TW_ST_SLA_ACK: //0xA8 Slave wurde im Lesemodus adressiert und hat ein ACK zurückgegeben.&lt;br /&gt;
	//Hier steht kein break! Es wird also der folgende Code ebenfalls ausgeführt!&lt;br /&gt;
	&lt;br /&gt;
case TW_ST_DATA_ACK: //0xB8 Slave Transmitter, Daten wurden angefordert&lt;br /&gt;
&lt;br /&gt;
	if (buffer_adr == 0xFF) //zuvor keine Leseadresse angegeben! &lt;br /&gt;
		{&lt;br /&gt;
			buffer_adr=0;&lt;br /&gt;
		}	&lt;br /&gt;
		&lt;br /&gt;
	if(buffer_adr&amp;lt;i2c_buffer_size)	&lt;br /&gt;
		{&lt;br /&gt;
			TWDR = i2cdata[buffer_adr]; //Datenbyte senden&lt;br /&gt;
			buffer_adr++; //bufferadresse für nächstes Byte weiterzählen&lt;br /&gt;
		}&lt;br /&gt;
	else&lt;br /&gt;
		{&lt;br /&gt;
			TWDR=0; //Kein Daten mehr im Buffer&lt;br /&gt;
		}&lt;br /&gt;
	TWCR_ACK;&lt;br /&gt;
break;&lt;br /&gt;
&lt;br /&gt;
case TW_ST_DATA_NACK: // 0xC0 Keine Daten mehr gefordert &lt;br /&gt;
case TW_SR_DATA_NACK: // 0x88 &lt;br /&gt;
case TW_ST_LAST_DATA: // 0xC8  Last data byte in TWDR has been transmitted (TWEA = “0”); ACK has been received&lt;br /&gt;
case TW_SR_STOP:      // 0xA0 STOP empfangen&lt;br /&gt;
default: 	&lt;br /&gt;
    TWCR_RESET;&lt;br /&gt;
break;&lt;br /&gt;
	&lt;br /&gt;
} //end.switch (TW_STATUS)&lt;br /&gt;
} //end.ISR(TWI_vect)&lt;br /&gt;
&lt;br /&gt;
////Ende von twislave.c////&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Slave header ==&lt;br /&gt;
Die zugehörige Headerdatei twislave.h für den Slave. Stand: 19.2.2010&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#ifndef _TWISLAVE_H&lt;br /&gt;
#define _TWISLAVE_H&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;util/twi.h&amp;gt; 		  //enthaelt z.B. die Bezeichnungen fuer die Statuscodes in TWSR&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;  //dient zur behandlung der Interrupts&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt; 		    //definiert den Datentyp uint8_t&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 *  @defgroup twislave TWI-Slave&lt;br /&gt;
 *  @code #include &amp;quot;twislave.h&amp;quot; @endcode&lt;br /&gt;
 * &lt;br /&gt;
 *  @brief Betrieb eines AVRs mit Hardware-TWI-Schnittstelle als Slave.&lt;br /&gt;
 *  Zu Beginn muss init_twi_slave mit der gewuenschten Slave-Adresse als&lt;br /&gt;
 *  Parameter aufgerufen werden.&lt;br /&gt;
 *&lt;br /&gt;
 * Der Datenaustausch mit dem Master erfolgt ueber den Buffer i2cdata, &lt;br /&gt;
 * auf den von Master und Slave zugegriffen werden kann. &lt;br /&gt;
 * Dies ist fuer den Slave eine globale Variable (Array aus uint8_t). &lt;br /&gt;
&lt;br /&gt;
 * Der Zugriff durch den Master erfolgt aehnlich wie bei einem&lt;br /&gt;
 * normalen I2C-EEPROM.&lt;br /&gt;
 * Man sendet zunaechst die Bufferposition, an die man schreiben will,&lt;br /&gt;
 * und dann die Daten. &lt;br /&gt;
 * Die Bufferposition wird automatisch hochgezaehlt, sodass man mehrere&lt;br /&gt;
 * Datenbytes hintereinander schreiben kann, ohne jedesmal die &lt;br /&gt;
 * Bufferadresse zu schreiben.&lt;br /&gt;
 *&lt;br /&gt;
 * Um vom Master aus zu lesen, uebertraegt man zunaechst in einem &lt;br /&gt;
 * Schreibzugriff die gewuenschte Bufferposition und liest dann nach&lt;br /&gt;
 * einem repeated start die Daten aus. Die Bufferposition wird &lt;br /&gt;
 * automatisch hochgezaehlt, sodass man mehrere Datenbytes&lt;br /&gt;
 * hintereinander lesen kann, ohne jedesmal die Bufferposition zu&lt;br /&gt;
 * schreiben.&lt;br /&gt;
 *&lt;br /&gt;
 * Abgefangene Fehlbedienung durch den Master:&lt;br /&gt;
 * - Lesen ueber die Grenze des txbuffers hinaus&lt;br /&gt;
 * - Schreiben ueber die Grenzen des rxbuffers hinaus&lt;br /&gt;
 * - Angabe einer ungueltigen Schreib/Lese-Adresse&lt;br /&gt;
 * - Lesezugriff, ohne vorher Leseadresse geschrieben zu haben&lt;br /&gt;
 * &lt;br /&gt;
 *  @author uwegw&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*@{*/&lt;br /&gt;
&lt;br /&gt;
//%%%%%%%% von Benutzer konfigurierbare Einstellungen %%%%%%%%&lt;br /&gt;
/**@brief Groesse des Buffers in Byte (2..254) */&lt;br /&gt;
#define i2c_buffer_size 10// I2C_REG_ANZAHL 254 Hier kann eingestellt werden wieviele Register ausgegeben werden&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//%%%%%%%% Globale Variablen, die vom Hauptprogramm genutzt werden %%%%%%%%&lt;br /&gt;
/**@brief Der Buffer, in dem die Daten gespeichert werden.&lt;br /&gt;
 * Aus Sicht des Masters laeuft der Zugrif auf den Buffer genau wie&lt;br /&gt;
 *  bei einem I2C-EEPROm ab.&lt;br /&gt;
 * Fuer den Slave ist es eine globale Variable&lt;br /&gt;
*/&lt;br /&gt;
volatile uint8_t i2cdata[i2c_buffer_size+1];&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**@brief Initaliserung des TWI-Inteface. Muss zu Beginn aufgerufen werden, sowie bei einem Wechsel der Slave Adresse&lt;br /&gt;
 * @param adr gewuenschte Slave-Adresse */&lt;br /&gt;
void init_twi_slave(uint8_t adr);&lt;br /&gt;
&lt;br /&gt;
//%%%%%%%% ab hier sind normalerweise keine weiteren Aenderungen erforderlich! %%%%%%%%//&lt;br /&gt;
//____________________________________________________________________________________//&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Bei zu alten AVR-GCC-Versionen werden die Interrupts anders genutzt, daher in diesem Fall mit Fehlermeldung abbrechen&lt;br /&gt;
#if (__GNUC__ * 100 + __GNUC_MINOR__) &amp;lt; 304&lt;br /&gt;
	#error &amp;quot;This library requires AVR-GCC 3.4.5 or later, update to newer AVR-GCC compiler !&amp;quot;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
//Schutz vor unsinnigen Buffergroessen&lt;br /&gt;
#if (i2c_buffer_size &amp;gt; 254)&lt;br /&gt;
	#error Buffer zu gross gewaehlt! Maximal 254 Bytes erlaubt.&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#if (i2c_buffer_size &amp;lt; 2)&lt;br /&gt;
	#error Buffer muss mindestens zwei Byte gross sein!&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#endif //#ifdef _TWISLAVE_H&lt;br /&gt;
////Ende von twislave.h////&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Microcontroller]]&lt;br /&gt;
[[Kategorie:Quellcode C]]&lt;/div&gt;</summary>
		<author><name>HannoHupmann</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=TWI_Slave_mit_avr-gcc&amp;diff=16181</id>
		<title>TWI Slave mit avr-gcc</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=TWI_Slave_mit_avr-gcc&amp;diff=16181"/>
				<updated>2010-04-05T17:16:18Z</updated>
		
		<summary type="html">&lt;p&gt;HannoHupmann: /* Master */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Programm für einen AVR mit [[TWI]] (Hardware-[[I2C]])-Schnittstelle als Slave.&lt;br /&gt;
Manchmal stellt sich die Aufgabe, mehrere AVRs per [[I2C]] zu vernetzen. Ein Beispiel ist die Erweiterung eines bestehenden Systems um einen leistungsstärkeren Controller. Dies ist etwa beim [[Asuro]] oder [[Yeti]] denkbar, um z.B. mehr Ein/Ausgänge oder Speicherplatz zu bekommen.&lt;br /&gt;
&lt;br /&gt;
Man kann aber beim Bau eines Roboters auch von Anfang an auf ein System von mehreren vernetzten Controllern setzen. So kann man verschiedene Aufgabe, die weitgehend unabhängig voneinader gleichzeitg erledigt werden müssen, besser verteilen. Denkbar ist z.B. ein Controller für die Motorsteuerung, einer für die Sensorik, einer für Ein-und Ausgabe (wie LCD und Bedientaster),... , und ein zentraler Controller, der die Richtung vorgibt und alle anderen Controller mit Befehlen versorgt. Ein konkretes Beispiel ist der Roboterbausatz Nibo (siehe: [http://www.nicai-systems.de/nibo.html]) von nicai-systems, der einen Atmel ATmega128 als Hauptcontroller und zwei Atmel ATtiny44 als Controller für die Motorsteuerung und die IR-Sensorik einsetzt. Die Kommunikation läuft mit 400 kHz über den I2C-Bus mit dem ATmega128 als Master. &lt;br /&gt;
&lt;br /&gt;
Außerdem wurde der Code für einen Mega32 mit dem AVR Studio getestet Beachte: im AVR-Studio ist default ein ATmega128 eingestellt, unter Projekt -&amp;gt; Configuration Options kann das Device geändert werden, außerdem ist die Frequency einzustellen. In meinem Fall waren es 7372800Hz da ich in der Schaltung einen entsprechenden Quarz eingebaut habe. Die Verbindung zwischen Master und Slave erfolgt über die Pins 22 (SCL) und 23 (SDA) und gemeinsamer GND. Abschlusswiderstände (4,7kOhm nicht vergessen, am besten beim Master, siehe auch I2C-Definitionen).   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Schließlich kann ein entsprechend programmierter AVR auch als Ersatz für handelsübliche I2C-Bauteile dienen. Der kleinste AVR mit Hardware-I2C, der ATmega48, ist mit 1,30€ (Reichelt) billiger als viele normale I2C-ICs. Er kann bei entsprechender Programmierung z.B. die Aufgaben von zwei PCF8574 (8bit-Portexpander, 1,25€) und einem PCF8591 (4fach AD-Wandler, 2,35€) übernehmen und außerdem noch als I2C-EEPROM mit 256 Bytes dienen. &lt;br /&gt;
&lt;br /&gt;
Das folgende Programm (twislave.c) steuert das TWI (Hardware-I2C)-Interface eines AVRs als Slave an. Es müsste auf allen AVRs der Mega-Reihe funktionieren, die über eine TWI-Schnittstelle verfügen. &lt;br /&gt;
&lt;br /&gt;
Das System ist als eine Art Dualport-RAM konzipiert, Master und Slave teilen sich also einen Speicherbereich und können darüber Daten austauschen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Master ==&lt;br /&gt;
Ein Testprogramm für den Master. Es wird die [http://homepage.hispeed.ch/peterfleury/avr-software.html#libs I2C-Master-Bibliothek von Peter Fleury] verwendet.&lt;br /&gt;
Es wird geprüft, ob der Slave bereit ist, dann werden drei Bytes erst in den Slave geschrieben, und anschließend wieder ausgelesen.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// I2C-Master-Routinen von Peter Fleury verwenden &lt;br /&gt;
// siehe http://homepage.hispeed.ch/peterfleury/avr-software.html#libs&lt;br /&gt;
// Hier sind auch die Datein: i2cmaster.h und twimaster.c zu finden, die benötigt werden&lt;br /&gt;
// (wer mit AVR-Studio arbeitet braucht nur diese Datein)&lt;br /&gt;
// Letztes Update des Codes 5. April 2010 durch HannoHupmann&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;quot;i2cmaster.h&amp;quot;  &lt;br /&gt;
#define SLAVE_ADRESSE 0x50&lt;br /&gt;
&lt;br /&gt;
uint8_t byte1 = 42;&lt;br /&gt;
uint8_t byte2 = 43;&lt;br /&gt;
uint8_t byte3 = 44;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  i2c_init();         // init I2C interface&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if(!(i2c_start(SLAVE_ADRESSE+I2C_WRITE))) //Slave bereit zum schreiben?&lt;br /&gt;
{&lt;br /&gt;
  i2c_write(0x00);  // Buffer Startadresse setzen 	&lt;br /&gt;
  i2c_write(byte1); // Drei Bytes schreiben...&lt;br /&gt;
  i2c_write(byte2); &lt;br /&gt;
  i2c_write(byte3); &lt;br /&gt;
  i2c_stop();       // Zugriff beenden&lt;br /&gt;
}&lt;br /&gt;
else&lt;br /&gt;
{&lt;br /&gt;
  /* Hier könnte eine Fehlermeldung ausgegeben werden... */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if(!(i2c_start(SLAVE_ADRESSE+I2C_WRITE))) //Slave bereit zum lesen?&lt;br /&gt;
{&lt;br /&gt;
  i2c_write(0x00); //Buffer Startadresse zum Auslesen&lt;br /&gt;
  i2c_rep_start(SLAVE_ADRESSE+I2C_READ); //Lesen beginnen&lt;br /&gt;
&lt;br /&gt;
  byte1= i2c_readAck(); // Bytes lesen...&lt;br /&gt;
  byte2= i2c_readAck();&lt;br /&gt;
  byte3= i2c_readNak(); // letztes Byte lesen, darum kein ACK&lt;br /&gt;
  i2c_stop();           // Zugriff beenden&lt;br /&gt;
} &lt;br /&gt;
else&lt;br /&gt;
{&lt;br /&gt;
  /* Hier könnte eine Fehlermeldung ausgegeben werden... */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if ((byte1 != 42)||(byte2 != 43)||(byte3 != 44))&lt;br /&gt;
{&lt;br /&gt;
  /* Die Bytes wurden nicht korrekt übertragen und wieder gelesen! */ &lt;br /&gt;
}&lt;br /&gt;
    for(;;);	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Code wurde von mir getestet und funktioniert auf einem Mega32&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Code sollte ohne Probleme kompiliert werden, eventuell fehlen die oben genannten Datein wenn es nicht klappt.&lt;br /&gt;
&lt;br /&gt;
== Slave == &lt;br /&gt;
Hier soll nun der Code behandelt werden der für den Slave-Controller notwendig ist. Der vorgestellte Code schreibt die Register des Slaves an die Serielle Schnittstelle, mit einem Terminal Programm kann man sich die Ausgabe ansehen und überprüfen ob alles korrekt funktioniert. &lt;br /&gt;
Der Code ist wieder an den von Peter Fleury angelehnt.&lt;br /&gt;
&lt;br /&gt;
Für den Mega32 hab ich die twislave.c nicht gebraucht. Dafür aber die uart.c und uart.h welche sich auch bei Peter Fleury finden lassen. Diese müssen nicht angepasst werden. Wichtig ist die richtige Frquenz sonst ist die Ausgabe nicht korrekt. Der Slave sollte ohne Master folgende Ausgabe haben: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
i2cdata: &lt;br /&gt;
10&lt;br /&gt;
11&lt;br /&gt;
12&lt;br /&gt;
13&lt;br /&gt;
usw. &lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Die Register werden der Reihe nach mit ihrem Wert angezeigt. Wird der Master hinzugefügt sollte nun folgende Ausgabe im Terminal erscheinen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
i2cdata: &lt;br /&gt;
42&lt;br /&gt;
43&lt;br /&gt;
44&lt;br /&gt;
13&lt;br /&gt;
usw. &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Slave Testprogramm ==&lt;br /&gt;
Ein Testprogramm für den Slave. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
Testprogramm für den Slave &lt;br /&gt;
Der Buffer wird mit Werten gefüllt. Dann wird er fortlaufend über die serielle Schnittstelle ausgegeben.&lt;br /&gt;
*/&lt;br /&gt;
#include &amp;lt;util/twi.h&amp;gt; 		//enthält z.B. die Bezeichnungen für die Statuscodes in TWSR&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;  //dient zur Behandlung der Interrupts&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt; 		//definiert den Datentyp uint8_t&lt;br /&gt;
#include &amp;quot;twislave.h&amp;quot;&lt;br /&gt;
#include &amp;quot;uart.h&amp;quot;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#define BAUD 9600 //Baudrate&lt;br /&gt;
#define SLAVE_ADRESSE 0x50 //Die Slave-Adresse&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
volatile uint8_t i2cdata[i2c_buffer_size+1];&lt;br /&gt;
volatile uint8_t buffer_adr; 					//&amp;quot;Adressregister&amp;quot; für den Buffer&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*Initaliserung des TWI-Inteface. Muss zu Beginn aufgerufen werden, sowie bei einem Wechsel der Slave Adresse&lt;br /&gt;
Parameter adr: gewünschte Slave-Adresse&lt;br /&gt;
*/&lt;br /&gt;
void init_twi_slave(uint8_t adr)&lt;br /&gt;
{&lt;br /&gt;
	TWAR= adr; //Adresse setzen&lt;br /&gt;
	TWCR &amp;amp;= ~(1&amp;lt;&amp;lt;TWSTA)|(1&amp;lt;&amp;lt;TWSTO);&lt;br /&gt;
	TWCR|= (1&amp;lt;&amp;lt;TWEA) | (1&amp;lt;&amp;lt;TWEN)|(1&amp;lt;&amp;lt;TWIE); 	&lt;br /&gt;
	buffer_adr=0xFF;  &lt;br /&gt;
	sei();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Je nach Statuscode in TWSR müssen verschiedene Bitmuster in TWCR geschreiben werden(siehe Tabellen im Datenblatt!). &lt;br /&gt;
//Makros für die verwendeten Bitmuster:&lt;br /&gt;
&lt;br /&gt;
//ACK nach empfangenen Daten senden/ ACK nach gesendeten Daten erwarten&lt;br /&gt;
#define TWCR_ACK TWCR = (1&amp;lt;&amp;lt;TWEN)|(1&amp;lt;&amp;lt;TWIE)|(1&amp;lt;&amp;lt;TWINT)|(1&amp;lt;&amp;lt;TWEA)|(0&amp;lt;&amp;lt;TWSTA)|(0&amp;lt;&amp;lt;TWSTO)|(0&amp;lt;&amp;lt;TWWC);  &lt;br /&gt;
&lt;br /&gt;
//NACK nach empfangenen Daten senden/ NACK nach gesendeten Daten erwarten     &lt;br /&gt;
#define TWCR_NACK TWCR = (1&amp;lt;&amp;lt;TWEN)|(1&amp;lt;&amp;lt;TWIE)|(1&amp;lt;&amp;lt;TWINT)|(0&amp;lt;&amp;lt;TWEA)|(0&amp;lt;&amp;lt;TWSTA)|(0&amp;lt;&amp;lt;TWSTO)|(0&amp;lt;&amp;lt;TWWC);&lt;br /&gt;
&lt;br /&gt;
//switched to the non adressed slave mode...&lt;br /&gt;
#define TWCR_RESET TWCR = (1&amp;lt;&amp;lt;TWEN)|(1&amp;lt;&amp;lt;TWIE)|(1&amp;lt;&amp;lt;TWINT)|(1&amp;lt;&amp;lt;TWEA)|(0&amp;lt;&amp;lt;TWSTA)|(0&amp;lt;&amp;lt;TWSTO)|(0&amp;lt;&amp;lt;TWWC);  &lt;br /&gt;
//Die Bitmuster für TWCR_ACK und TWCR_RESET sind gleich. Dies ist kein Fehler und dient nur der Übersicht!&lt;br /&gt;
&lt;br /&gt;
/*ISR, die bei einem Ereignis auf dem Bus ausgelöst wird. Im Register TWSR befindet sich dann &lt;br /&gt;
ein Statuscode, anhand dessen die Situation festgestellt werden kann.&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ISR (TWI_vect)  &lt;br /&gt;
{&lt;br /&gt;
	uint8_t data=0;&lt;br /&gt;
	switch (TW_STATUS) //TWI-Statusregister prüfen und nötige Aktion bestimmen &lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
// Slave Receiver &lt;br /&gt;
&lt;br /&gt;
	case TW_SR_SLA_ACK: // 0x60 Slave Receiver, Slave wurde adressiert	&lt;br /&gt;
	     TWCR_ACK; // nächstes Datenbyte empfangen, ACK danach senden&lt;br /&gt;
		 buffer_adr=0xFF; //Bufferposition ist undefiniert&lt;br /&gt;
		 break;&lt;br /&gt;
	&lt;br /&gt;
	case TW_SR_DATA_ACK: // 0x80 Slave Receiver, ein Datenbyte wurde empfangen&lt;br /&gt;
	 	 data=TWDR; //Empfangene Daten auslesen&lt;br /&gt;
		 if (buffer_adr == 0xFF) //erster Zugriff, Bufferposition setzen&lt;br /&gt;
			{&lt;br /&gt;
			//Kontrolle ob gewünschte Adresse im erlaubten bereich&lt;br /&gt;
			if(data&amp;lt;i2c_buffer_size)&lt;br /&gt;
				{&lt;br /&gt;
					buffer_adr= data; //Bufferposition wie adressiert setzen&lt;br /&gt;
				}&lt;br /&gt;
			else&lt;br /&gt;
				{&lt;br /&gt;
					buffer_adr=0; //Adresse auf Null setzen. Ist das sinnvoll? TO DO!&lt;br /&gt;
				}				&lt;br /&gt;
			TWCR_ACK;	// nächstes Datenbyte empfangen, ACK danach, um nächstes Byte anzufordern&lt;br /&gt;
		 }&lt;br /&gt;
		 else //weiterer Zugriff, nachdem die Position im Buffer gesetzt wurde. NUn die Daten empfangen und speichern&lt;br /&gt;
		 {&lt;br /&gt;
		&lt;br /&gt;
			if(buffer_adr&amp;lt;i2c_buffer_size)&lt;br /&gt;
				{&lt;br /&gt;
					//if(!I2C_reg_Schreibschutz[buffer_adr]) //Wenn Position nicht schreibgeschützt...&lt;br /&gt;
						i2cdata[buffer_adr]=data; 			//...dann Daten in Buffer schreibe&lt;br /&gt;
						&lt;br /&gt;
						&lt;br /&gt;
				}&lt;br /&gt;
			buffer_adr++; //Buffer-Adresse weiterzählen für nächsten Schreibzugriff&lt;br /&gt;
			TWCR_ACK;	&lt;br /&gt;
		 }&lt;br /&gt;
		break;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Slave transmitter&lt;br /&gt;
&lt;br /&gt;
		case TW_ST_SLA_ACK: //0xA8 Slave wurde im Lesemodus adressiert und hat ein ACK zurückgegeben.&lt;br /&gt;
	//Hier steht kein break! Es wird also der folgende Code ebenfalls ausgeführt!&lt;br /&gt;
	&lt;br /&gt;
		case TW_ST_DATA_ACK: //0xB8 Slave Transmitter, Daten wurden angefordert&lt;br /&gt;
			if (buffer_adr == 0xFF) //zuvor keine Leseadresse angegeben! &lt;br /&gt;
			{&lt;br /&gt;
			buffer_adr=0;&lt;br /&gt;
			}	&lt;br /&gt;
		&lt;br /&gt;
			if(buffer_adr&amp;lt;i2c_buffer_size)	&lt;br /&gt;
			{&lt;br /&gt;
			TWDR = i2cdata[buffer_adr]; //Datenbyte senden&lt;br /&gt;
			buffer_adr++; //bufferadresse für nächstes Byte weiterzählen&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
			TWDR=0; //Kein Daten mehr im Buffer&lt;br /&gt;
			}&lt;br /&gt;
			TWCR_ACK;&lt;br /&gt;
		break;&lt;br /&gt;
&lt;br /&gt;
	case TW_ST_DATA_NACK: // 0xC0 Keine Daten mehr gefordert &lt;br /&gt;
	case TW_SR_DATA_NACK: // 0x88 &lt;br /&gt;
	case TW_ST_LAST_DATA: // 0xC8  Last data byte in TWDR has been transmitted (TWEA = “0”); ACK has been received&lt;br /&gt;
	case TW_SR_STOP:      // 0xA0 STOP empfangen&lt;br /&gt;
	default: 	&lt;br /&gt;
    TWCR_RESET;&lt;br /&gt;
	break;&lt;br /&gt;
	} //end.switch (TW_STATUS)&lt;br /&gt;
} //end.ISR(TWI_vect)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void warte (int loop)  //loop: wartezeit in ms &lt;br /&gt;
{&lt;br /&gt;
	int i;&lt;br /&gt;
	for(i=0;i&amp;lt;loop;i++) _delay_ms(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main (void)&lt;br /&gt;
{&lt;br /&gt;
//TWI als Slave mit Adresse slaveadr starten&lt;br /&gt;
init_twi_slave(SLAVE_ADRESSE);&lt;br /&gt;
&lt;br /&gt;
//i2cdatamit Werten füllen, die der Master auslesen und ändern kann&lt;br /&gt;
for(uint8_t i=0;i&amp;lt;i2c_buffer_size;i++)&lt;br /&gt;
	{&lt;br /&gt;
		i2cdata[i]=10+i;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
//Serielle Schnittstelle aktivieren&lt;br /&gt;
uart_init((UART_BAUD_SELECT((BAUD),F_CPU)));&lt;br /&gt;
uart_puts(&amp;quot;I2C-Test\r\n&amp;quot;);&lt;br /&gt;
uart_puts(&amp;quot;Teste I2C-Slave mit Adresse &amp;quot;); uart_puti(SLAVE_ADRESSE);&lt;br /&gt;
uart_puts(&amp;quot;\r\n&amp;quot;);&lt;br /&gt;
uart_puts(&amp;quot;\r\n&amp;quot;); //Leerzeile&lt;br /&gt;
&lt;br /&gt;
//in einer Endlosschleife den Inhalt der Buffer ausgeben&lt;br /&gt;
while(1) &lt;br /&gt;
{&lt;br /&gt;
	uart_puts(&amp;quot;i2cdata:\r\n&amp;quot;);&lt;br /&gt;
	for(uint8_t i=0;i&amp;lt;i2c_buffer_size;i++)&lt;br /&gt;
		{&lt;br /&gt;
			uart_puti(i2cdata[i]);&lt;br /&gt;
			uart_puts(&amp;quot;\r\n&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	uart_puts(&amp;quot;\r\n&amp;quot;);//leerzeile&lt;br /&gt;
warte(500);&lt;br /&gt;
} //end.while&lt;br /&gt;
} //end.main&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Slave sourcecode ==&lt;br /&gt;
Die twislave.c für den Slave. Stand: 5.4.2010 &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;util/twi.h&amp;gt; 		//enthält z.B. die Bezeichnungen für die Statuscodes in TWSR&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;  //dient zur Behandlung der Interrupts&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt; 		//definiert den Datentyp uint8_t&lt;br /&gt;
#include &amp;quot;twislave.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
//%%%%%%%% Globale Variablen, die vom Hauptprogramm genutzt werden %%%%%%%%&lt;br /&gt;
/*Der Buffer, in dem die Daten gespeichert werden. &lt;br /&gt;
Aus Sicht des Masters läuft der Zugrif auf den Buffer genau wie bei einem I2C-EEPROm ab.&lt;br /&gt;
Für den Slave ist es eine globale Variable&lt;br /&gt;
*/&lt;br /&gt;
volatile uint8_t i2cdata[i2c_buffer_size+1];&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
volatile uint8_t buffer_adr; //&amp;quot;Adressregister&amp;quot; für den Buffer&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*Initaliserung des TWI-Inteface. Muss zu Beginn aufgerufen werden, sowie bei einem Wechsel der Slave Adresse&lt;br /&gt;
Parameter adr: gewünschte Slave-Adresse&lt;br /&gt;
*/&lt;br /&gt;
void init_twi_slave(uint8_t adr)&lt;br /&gt;
{&lt;br /&gt;
	TWAR= adr; //Adresse setzen&lt;br /&gt;
	TWCR &amp;amp;= ~(1&amp;lt;&amp;lt;TWSTA)|(1&amp;lt;&amp;lt;TWSTO);&lt;br /&gt;
	TWCR|= (1&amp;lt;&amp;lt;TWEA) | (1&amp;lt;&amp;lt;TWEN)|(1&amp;lt;&amp;lt;TWIE); 	&lt;br /&gt;
	buffer_adr=0xFF;  &lt;br /&gt;
	sei();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Je nach Statuscode in TWSR müssen verschiedene Bitmuster in TWCR geschreiben werden(siehe Tabellen im Datenblatt!). &lt;br /&gt;
//Makros für die verwendeten Bitmuster:&lt;br /&gt;
&lt;br /&gt;
//ACK nach empfangenen Daten senden/ ACK nach gesendeten Daten erwarten&lt;br /&gt;
#define TWCR_ACK TWCR = (1&amp;lt;&amp;lt;TWEN)|(1&amp;lt;&amp;lt;TWIE)|(1&amp;lt;&amp;lt;TWINT)|(1&amp;lt;&amp;lt;TWEA)|(0&amp;lt;&amp;lt;TWSTA)|(0&amp;lt;&amp;lt;TWSTO)|(0&amp;lt;&amp;lt;TWWC);  &lt;br /&gt;
&lt;br /&gt;
//NACK nach empfangenen Daten senden/ NACK nach gesendeten Daten erwarten     &lt;br /&gt;
#define TWCR_NACK TWCR = (1&amp;lt;&amp;lt;TWEN)|(1&amp;lt;&amp;lt;TWIE)|(1&amp;lt;&amp;lt;TWINT)|(0&amp;lt;&amp;lt;TWEA)|(0&amp;lt;&amp;lt;TWSTA)|(0&amp;lt;&amp;lt;TWSTO)|(0&amp;lt;&amp;lt;TWWC);&lt;br /&gt;
&lt;br /&gt;
//switched to the non adressed slave mode...&lt;br /&gt;
#define TWCR_RESET TWCR = (1&amp;lt;&amp;lt;TWEN)|(1&amp;lt;&amp;lt;TWIE)|(1&amp;lt;&amp;lt;TWINT)|(1&amp;lt;&amp;lt;TWEA)|(0&amp;lt;&amp;lt;TWSTA)|(0&amp;lt;&amp;lt;TWSTO)|(0&amp;lt;&amp;lt;TWWC);  &lt;br /&gt;
//Die Bitmuster für TWCR_ACK und TWCR_RESET sind gleich. Dies ist kein Fehler und dient nur der Übersicht!&lt;br /&gt;
&lt;br /&gt;
/*ISR, die bei einem Ereignis auf dem Bus ausgelöst wird. Im Register TWSR befindet sich dann &lt;br /&gt;
ein Statuscode, anhand dessen die Situation festgestellt werden kann.&lt;br /&gt;
*/&lt;br /&gt;
ISR (TWI_vect)  &lt;br /&gt;
{&lt;br /&gt;
uint8_t data=0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
switch (TW_STATUS) //TWI-Statusregister prüfen und nötige Aktion bestimmen &lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
// Slave Receiver &lt;br /&gt;
&lt;br /&gt;
case TW_SR_SLA_ACK: // 0x60 Slave Receiver, Slave wurde adressiert	&lt;br /&gt;
	TWCR_ACK; // nächstes Datenbyte empfangen, ACK danach senden&lt;br /&gt;
	buffer_adr=0xFF; //Bufferposition ist undefiniert&lt;br /&gt;
break;&lt;br /&gt;
	&lt;br /&gt;
case TW_SR_DATA_ACK: // 0x80 Slave Receiver, ein Datenbyte wurde empfangen&lt;br /&gt;
	data=TWDR; //Empfangene Daten auslesen&lt;br /&gt;
	if (buffer_adr == 0xFF) //erster Zugriff, Bufferposition setzen&lt;br /&gt;
		{&lt;br /&gt;
			//Kontrolle ob gewünschte Adresse im erlaubten bereich&lt;br /&gt;
			if(data&amp;lt;i2c_buffer_size)&lt;br /&gt;
				{&lt;br /&gt;
					buffer_adr= data; //Bufferposition wie adressiert setzen&lt;br /&gt;
				}&lt;br /&gt;
			else&lt;br /&gt;
				{&lt;br /&gt;
					buffer_adr=0; //Adresse auf Null setzen. Ist das sinnvoll? TO DO!&lt;br /&gt;
				}				&lt;br /&gt;
			TWCR_ACK;	// nächstes Datenbyte empfangen, ACK danach, um nächstes Byte anzufordern&lt;br /&gt;
		}&lt;br /&gt;
	else //weiterer Zugriff, nachdem die Position im Buffer gesetzt wurde. NUn die Daten empfangen und speichern&lt;br /&gt;
		{&lt;br /&gt;
		&lt;br /&gt;
			if(buffer_adr&amp;lt;i2c_buffer_size)&lt;br /&gt;
				{&lt;br /&gt;
					if(!I2C_reg_Schreibschutz[buffer_adr]) //Wenn Position nicht schreibgeschützt...&lt;br /&gt;
						i2cdata[buffer_adr]=data; 			//...dann Daten in Buffer schreibe&lt;br /&gt;
						&lt;br /&gt;
						&lt;br /&gt;
				}&lt;br /&gt;
			buffer_adr++; //Buffer-Adresse weiterzählen für nächsten Schreibzugriff&lt;br /&gt;
			TWCR_ACK;	&lt;br /&gt;
		}&lt;br /&gt;
break;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Slave transmitter&lt;br /&gt;
&lt;br /&gt;
case TW_ST_SLA_ACK: //0xA8 Slave wurde im Lesemodus adressiert und hat ein ACK zurückgegeben.&lt;br /&gt;
	//Hier steht kein break! Es wird also der folgende Code ebenfalls ausgeführt!&lt;br /&gt;
	&lt;br /&gt;
case TW_ST_DATA_ACK: //0xB8 Slave Transmitter, Daten wurden angefordert&lt;br /&gt;
&lt;br /&gt;
	if (buffer_adr == 0xFF) //zuvor keine Leseadresse angegeben! &lt;br /&gt;
		{&lt;br /&gt;
			buffer_adr=0;&lt;br /&gt;
		}	&lt;br /&gt;
		&lt;br /&gt;
	if(buffer_adr&amp;lt;i2c_buffer_size)	&lt;br /&gt;
		{&lt;br /&gt;
			TWDR = i2cdata[buffer_adr]; //Datenbyte senden&lt;br /&gt;
			buffer_adr++; //bufferadresse für nächstes Byte weiterzählen&lt;br /&gt;
		}&lt;br /&gt;
	else&lt;br /&gt;
		{&lt;br /&gt;
			TWDR=0; //Kein Daten mehr im Buffer&lt;br /&gt;
		}&lt;br /&gt;
	TWCR_ACK;&lt;br /&gt;
break;&lt;br /&gt;
&lt;br /&gt;
case TW_ST_DATA_NACK: // 0xC0 Keine Daten mehr gefordert &lt;br /&gt;
case TW_SR_DATA_NACK: // 0x88 &lt;br /&gt;
case TW_ST_LAST_DATA: // 0xC8  Last data byte in TWDR has been transmitted (TWEA = “0”); ACK has been received&lt;br /&gt;
case TW_SR_STOP:      // 0xA0 STOP empfangen&lt;br /&gt;
default: 	&lt;br /&gt;
    TWCR_RESET;&lt;br /&gt;
break;&lt;br /&gt;
	&lt;br /&gt;
} //end.switch (TW_STATUS)&lt;br /&gt;
} //end.ISR(TWI_vect)&lt;br /&gt;
&lt;br /&gt;
////Ende von twislave.c////&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Slave header ==&lt;br /&gt;
Die zugehörige Headerdatei twislave.h für den Slave. Stand: 19.2.2010&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#ifndef _TWISLAVE_H&lt;br /&gt;
#define _TWISLAVE_H&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;util/twi.h&amp;gt; 		  //enthaelt z.B. die Bezeichnungen fuer die Statuscodes in TWSR&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;  //dient zur behandlung der Interrupts&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt; 		    //definiert den Datentyp uint8_t&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 *  @defgroup twislave TWI-Slave&lt;br /&gt;
 *  @code #include &amp;quot;twislave.h&amp;quot; @endcode&lt;br /&gt;
 * &lt;br /&gt;
 *  @brief Betrieb eines AVRs mit Hardware-TWI-Schnittstelle als Slave.&lt;br /&gt;
 *  Zu Beginn muss init_twi_slave mit der gewuenschten Slave-Adresse als&lt;br /&gt;
 *  Parameter aufgerufen werden.&lt;br /&gt;
 *&lt;br /&gt;
 * Der Datenaustausch mit dem Master erfolgt ueber den Buffer i2cdata, &lt;br /&gt;
 * auf den von Master und Slave zugegriffen werden kann. &lt;br /&gt;
 * Dies ist fuer den Slave eine globale Variable (Array aus uint8_t). &lt;br /&gt;
&lt;br /&gt;
 * Der Zugriff durch den Master erfolgt aehnlich wie bei einem&lt;br /&gt;
 * normalen I2C-EEPROM.&lt;br /&gt;
 * Man sendet zunaechst die Bufferposition, an die man schreiben will,&lt;br /&gt;
 * und dann die Daten. &lt;br /&gt;
 * Die Bufferposition wird automatisch hochgezaehlt, sodass man mehrere&lt;br /&gt;
 * Datenbytes hintereinander schreiben kann, ohne jedesmal die &lt;br /&gt;
 * Bufferadresse zu schreiben.&lt;br /&gt;
 *&lt;br /&gt;
 * Um vom Master aus zu lesen, uebertraegt man zunaechst in einem &lt;br /&gt;
 * Schreibzugriff die gewuenschte Bufferposition und liest dann nach&lt;br /&gt;
 * einem repeated start die Daten aus. Die Bufferposition wird &lt;br /&gt;
 * automatisch hochgezaehlt, sodass man mehrere Datenbytes&lt;br /&gt;
 * hintereinander lesen kann, ohne jedesmal die Bufferposition zu&lt;br /&gt;
 * schreiben.&lt;br /&gt;
 *&lt;br /&gt;
 * Abgefangene Fehlbedienung durch den Master:&lt;br /&gt;
 * - Lesen ueber die Grenze des txbuffers hinaus&lt;br /&gt;
 * - Schreiben ueber die Grenzen des rxbuffers hinaus&lt;br /&gt;
 * - Angabe einer ungueltigen Schreib/Lese-Adresse&lt;br /&gt;
 * - Lesezugriff, ohne vorher Leseadresse geschrieben zu haben&lt;br /&gt;
 * &lt;br /&gt;
 *  @author uwegw&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*@{*/&lt;br /&gt;
&lt;br /&gt;
//%%%%%%%% von Benutzer konfigurierbare Einstellungen %%%%%%%%&lt;br /&gt;
/**@brief Groesse des Buffers in Byte (2..254) */&lt;br /&gt;
#define i2c_buffer_size 10// I2C_REG_ANZAHL 254 Hier kann eingestellt werden wieviele Register ausgegeben werden&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//%%%%%%%% Globale Variablen, die vom Hauptprogramm genutzt werden %%%%%%%%&lt;br /&gt;
/**@brief Der Buffer, in dem die Daten gespeichert werden.&lt;br /&gt;
 * Aus Sicht des Masters laeuft der Zugrif auf den Buffer genau wie&lt;br /&gt;
 *  bei einem I2C-EEPROm ab.&lt;br /&gt;
 * Fuer den Slave ist es eine globale Variable&lt;br /&gt;
*/&lt;br /&gt;
volatile uint8_t i2cdata[i2c_buffer_size+1];&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**@brief Initaliserung des TWI-Inteface. Muss zu Beginn aufgerufen werden, sowie bei einem Wechsel der Slave Adresse&lt;br /&gt;
 * @param adr gewuenschte Slave-Adresse */&lt;br /&gt;
void init_twi_slave(uint8_t adr);&lt;br /&gt;
&lt;br /&gt;
//%%%%%%%% ab hier sind normalerweise keine weiteren Aenderungen erforderlich! %%%%%%%%//&lt;br /&gt;
//____________________________________________________________________________________//&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Bei zu alten AVR-GCC-Versionen werden die Interrupts anders genutzt, daher in diesem Fall mit Fehlermeldung abbrechen&lt;br /&gt;
#if (__GNUC__ * 100 + __GNUC_MINOR__) &amp;lt; 304&lt;br /&gt;
	#error &amp;quot;This library requires AVR-GCC 3.4.5 or later, update to newer AVR-GCC compiler !&amp;quot;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
//Schutz vor unsinnigen Buffergroessen&lt;br /&gt;
#if (i2c_buffer_size &amp;gt; 254)&lt;br /&gt;
	#error Buffer zu gross gewaehlt! Maximal 254 Bytes erlaubt.&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#if (i2c_buffer_size &amp;lt; 2)&lt;br /&gt;
	#error Buffer muss mindestens zwei Byte gross sein!&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#endif //#ifdef _TWISLAVE_H&lt;br /&gt;
////Ende von twislave.h////&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Microcontroller]]&lt;br /&gt;
[[Kategorie:Quellcode C]]&lt;/div&gt;</summary>
		<author><name>HannoHupmann</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=TWI_Slave_mit_avr-gcc&amp;diff=16180</id>
		<title>TWI Slave mit avr-gcc</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=TWI_Slave_mit_avr-gcc&amp;diff=16180"/>
				<updated>2010-04-05T17:14:35Z</updated>
		
		<summary type="html">&lt;p&gt;HannoHupmann: /* Slave */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Programm für einen AVR mit [[TWI]] (Hardware-[[I2C]])-Schnittstelle als Slave.&lt;br /&gt;
Manchmal stellt sich die Aufgabe, mehrere AVRs per [[I2C]] zu vernetzen. Ein Beispiel ist die Erweiterung eines bestehenden Systems um einen leistungsstärkeren Controller. Dies ist etwa beim [[Asuro]] oder [[Yeti]] denkbar, um z.B. mehr Ein/Ausgänge oder Speicherplatz zu bekommen.&lt;br /&gt;
&lt;br /&gt;
Man kann aber beim Bau eines Roboters auch von Anfang an auf ein System von mehreren vernetzten Controllern setzen. So kann man verschiedene Aufgabe, die weitgehend unabhängig voneinader gleichzeitg erledigt werden müssen, besser verteilen. Denkbar ist z.B. ein Controller für die Motorsteuerung, einer für die Sensorik, einer für Ein-und Ausgabe (wie LCD und Bedientaster),... , und ein zentraler Controller, der die Richtung vorgibt und alle anderen Controller mit Befehlen versorgt. Ein konkretes Beispiel ist der Roboterbausatz Nibo (siehe: [http://www.nicai-systems.de/nibo.html]) von nicai-systems, der einen Atmel ATmega128 als Hauptcontroller und zwei Atmel ATtiny44 als Controller für die Motorsteuerung und die IR-Sensorik einsetzt. Die Kommunikation läuft mit 400 kHz über den I2C-Bus mit dem ATmega128 als Master. &lt;br /&gt;
&lt;br /&gt;
Außerdem wurde der Code für einen Mega32 mit dem AVR Studio getestet Beachte: im AVR-Studio ist default ein ATmega128 eingestellt, unter Projekt -&amp;gt; Configuration Options kann das Device geändert werden, außerdem ist die Frequency einzustellen. In meinem Fall waren es 7372800Hz da ich in der Schaltung einen entsprechenden Quarz eingebaut habe. Die Verbindung zwischen Master und Slave erfolgt über die Pins 22 (SCL) und 23 (SDA) und gemeinsamer GND. Abschlusswiderstände (4,7kOhm nicht vergessen, am besten beim Master, siehe auch I2C-Definitionen).   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Schließlich kann ein entsprechend programmierter AVR auch als Ersatz für handelsübliche I2C-Bauteile dienen. Der kleinste AVR mit Hardware-I2C, der ATmega48, ist mit 1,30€ (Reichelt) billiger als viele normale I2C-ICs. Er kann bei entsprechender Programmierung z.B. die Aufgaben von zwei PCF8574 (8bit-Portexpander, 1,25€) und einem PCF8591 (4fach AD-Wandler, 2,35€) übernehmen und außerdem noch als I2C-EEPROM mit 256 Bytes dienen. &lt;br /&gt;
&lt;br /&gt;
Das folgende Programm (twislave.c) steuert das TWI (Hardware-I2C)-Interface eines AVRs als Slave an. Es müsste auf allen AVRs der Mega-Reihe funktionieren, die über eine TWI-Schnittstelle verfügen. &lt;br /&gt;
&lt;br /&gt;
Das System ist als eine Art Dualport-RAM konzipiert, Master und Slave teilen sich also einen Speicherbereich und können darüber Daten austauschen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Master ==&lt;br /&gt;
Ein Testprogramm für den Master. Es wird die [http://homepage.hispeed.ch/peterfleury/avr-software.html#libs I2C-Master-Bibliothek von Peter Fleury] verwendet.&lt;br /&gt;
Es wird geprüft, ob der Slave bereit ist, dann werden drei Bytes erst in den Slave geschrieben, und anschließend wieder ausgelesen.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// I2C-Master-Routinen von Peter Fleury verwenden &lt;br /&gt;
// siehe http://homepage.hispeed.ch/peterfleury/avr-software.html#libs&lt;br /&gt;
// Hier sind auch die Datein: i2cmaster.h und twimaster.c zu finden, die benötigt werden&lt;br /&gt;
// (wer mit AVR-Studio arbeitet braucht nur diese Datein)&lt;br /&gt;
// Letztes Update des Codes 5. April 2010 durch HannoHupmann&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;quot;i2cmaster.h&amp;quot;  &lt;br /&gt;
#define SLAVE_ADRESSE 0x50&lt;br /&gt;
&lt;br /&gt;
uint8_t byte1 = 42;&lt;br /&gt;
uint8_t byte2 = 43;&lt;br /&gt;
uint8_t byte3 = 44;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  i2c_init();         // init I2C interface&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if(!(i2c_start(SLAVE_ADRESSE+I2C_WRITE))) //Slave bereit zum schreiben?&lt;br /&gt;
{&lt;br /&gt;
  i2c_write(0x00);  // Buffer Startadresse setzen 	&lt;br /&gt;
  i2c_write(byte1); // Drei Bytes schreiben...&lt;br /&gt;
  i2c_write(byte2); &lt;br /&gt;
  i2c_write(byte3); &lt;br /&gt;
  i2c_stop();       // Zugriff beenden&lt;br /&gt;
}&lt;br /&gt;
else&lt;br /&gt;
{&lt;br /&gt;
  /* Hier könnte eine Fehlermeldung ausgegeben werden... */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if(!(i2c_start(SLAVE_ADRESSE+I2C_WRITE))) //Slave bereit zum lesen?&lt;br /&gt;
{&lt;br /&gt;
  i2c_write(0x00); //Buffer Startadresse zum Auslesen&lt;br /&gt;
  i2c_rep_start(SLAVE_ADRESSE+I2C_READ); //Lesen beginnen&lt;br /&gt;
&lt;br /&gt;
  byte1= i2c_readAck(); // Bytes lesen...&lt;br /&gt;
  byte2= i2c_readAck();&lt;br /&gt;
  byte3= i2c_readNak(); // letztes Byte lesen, darum kein ACK&lt;br /&gt;
  i2c_stop();           // Zugriff beenden&lt;br /&gt;
} &lt;br /&gt;
else&lt;br /&gt;
{&lt;br /&gt;
  /* Hier könnte eine Fehlermeldung ausgegeben werden... */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if ((byte1 != 42)||(byte2 != 43)||(byte3 != 44))&lt;br /&gt;
{&lt;br /&gt;
  /* Die Bytes wurden nicht korrekt übertragen und wieder gelesen! */ &lt;br /&gt;
}&lt;br /&gt;
    for(;;);	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Code wurde von mir getestet und funktioniert auf einem Mega32&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Code sollte ohne Probleme kompiliert werden, eventuell fehlen die oben genannten Datein wenn es nicht klappt. &lt;br /&gt;
&lt;br /&gt;
== Slave == &lt;br /&gt;
Hier soll nun der Code behandelt werden der für den Slave-Controller notwendig ist. Der vorgestellte Code schreibt die Register des Slaves an die Serielle Schnittstelle, mit einem Terminal Programm kann man sich die Ausgabe ansehen und überprüfen ob alles korrekt funktioniert. &lt;br /&gt;
Der Code ist wieder an den von Peter Fleury angelehnt.&lt;br /&gt;
&lt;br /&gt;
Für den Mega32 hab ich die twislave.c nicht gebraucht. Dafür aber die uart.c und uart.h welche sich auch bei Peter Fleury finden lassen. Diese müssen nicht angepasst werden. Wichtig ist die richtige Frquenz sonst ist die Ausgabe nicht korrekt. Der Slave sollte ohne Master folgende Ausgabe haben: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
i2cdata: &lt;br /&gt;
10&lt;br /&gt;
11&lt;br /&gt;
12&lt;br /&gt;
13&lt;br /&gt;
usw. &lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Die Register werden der Reihe nach mit ihrem Wert angezeigt. Wird der Master hinzugefügt sollte nun folgende Ausgabe im Terminal erscheinen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
i2cdata: &lt;br /&gt;
42&lt;br /&gt;
43&lt;br /&gt;
44&lt;br /&gt;
13&lt;br /&gt;
usw. &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Slave Testprogramm ==&lt;br /&gt;
Ein Testprogramm für den Slave. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
Testprogramm für den Slave &lt;br /&gt;
Der Buffer wird mit Werten gefüllt. Dann wird er fortlaufend über die serielle Schnittstelle ausgegeben.&lt;br /&gt;
*/&lt;br /&gt;
#include &amp;lt;util/twi.h&amp;gt; 		//enthält z.B. die Bezeichnungen für die Statuscodes in TWSR&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;  //dient zur Behandlung der Interrupts&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt; 		//definiert den Datentyp uint8_t&lt;br /&gt;
#include &amp;quot;twislave.h&amp;quot;&lt;br /&gt;
#include &amp;quot;uart.h&amp;quot;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#define BAUD 9600 //Baudrate&lt;br /&gt;
#define SLAVE_ADRESSE 0x50 //Die Slave-Adresse&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
volatile uint8_t i2cdata[i2c_buffer_size+1];&lt;br /&gt;
volatile uint8_t buffer_adr; 					//&amp;quot;Adressregister&amp;quot; für den Buffer&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*Initaliserung des TWI-Inteface. Muss zu Beginn aufgerufen werden, sowie bei einem Wechsel der Slave Adresse&lt;br /&gt;
Parameter adr: gewünschte Slave-Adresse&lt;br /&gt;
*/&lt;br /&gt;
void init_twi_slave(uint8_t adr)&lt;br /&gt;
{&lt;br /&gt;
	TWAR= adr; //Adresse setzen&lt;br /&gt;
	TWCR &amp;amp;= ~(1&amp;lt;&amp;lt;TWSTA)|(1&amp;lt;&amp;lt;TWSTO);&lt;br /&gt;
	TWCR|= (1&amp;lt;&amp;lt;TWEA) | (1&amp;lt;&amp;lt;TWEN)|(1&amp;lt;&amp;lt;TWIE); 	&lt;br /&gt;
	buffer_adr=0xFF;  &lt;br /&gt;
	sei();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Je nach Statuscode in TWSR müssen verschiedene Bitmuster in TWCR geschreiben werden(siehe Tabellen im Datenblatt!). &lt;br /&gt;
//Makros für die verwendeten Bitmuster:&lt;br /&gt;
&lt;br /&gt;
//ACK nach empfangenen Daten senden/ ACK nach gesendeten Daten erwarten&lt;br /&gt;
#define TWCR_ACK TWCR = (1&amp;lt;&amp;lt;TWEN)|(1&amp;lt;&amp;lt;TWIE)|(1&amp;lt;&amp;lt;TWINT)|(1&amp;lt;&amp;lt;TWEA)|(0&amp;lt;&amp;lt;TWSTA)|(0&amp;lt;&amp;lt;TWSTO)|(0&amp;lt;&amp;lt;TWWC);  &lt;br /&gt;
&lt;br /&gt;
//NACK nach empfangenen Daten senden/ NACK nach gesendeten Daten erwarten     &lt;br /&gt;
#define TWCR_NACK TWCR = (1&amp;lt;&amp;lt;TWEN)|(1&amp;lt;&amp;lt;TWIE)|(1&amp;lt;&amp;lt;TWINT)|(0&amp;lt;&amp;lt;TWEA)|(0&amp;lt;&amp;lt;TWSTA)|(0&amp;lt;&amp;lt;TWSTO)|(0&amp;lt;&amp;lt;TWWC);&lt;br /&gt;
&lt;br /&gt;
//switched to the non adressed slave mode...&lt;br /&gt;
#define TWCR_RESET TWCR = (1&amp;lt;&amp;lt;TWEN)|(1&amp;lt;&amp;lt;TWIE)|(1&amp;lt;&amp;lt;TWINT)|(1&amp;lt;&amp;lt;TWEA)|(0&amp;lt;&amp;lt;TWSTA)|(0&amp;lt;&amp;lt;TWSTO)|(0&amp;lt;&amp;lt;TWWC);  &lt;br /&gt;
//Die Bitmuster für TWCR_ACK und TWCR_RESET sind gleich. Dies ist kein Fehler und dient nur der Übersicht!&lt;br /&gt;
&lt;br /&gt;
/*ISR, die bei einem Ereignis auf dem Bus ausgelöst wird. Im Register TWSR befindet sich dann &lt;br /&gt;
ein Statuscode, anhand dessen die Situation festgestellt werden kann.&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ISR (TWI_vect)  &lt;br /&gt;
{&lt;br /&gt;
	uint8_t data=0;&lt;br /&gt;
	switch (TW_STATUS) //TWI-Statusregister prüfen und nötige Aktion bestimmen &lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
// Slave Receiver &lt;br /&gt;
&lt;br /&gt;
	case TW_SR_SLA_ACK: // 0x60 Slave Receiver, Slave wurde adressiert	&lt;br /&gt;
	     TWCR_ACK; // nächstes Datenbyte empfangen, ACK danach senden&lt;br /&gt;
		 buffer_adr=0xFF; //Bufferposition ist undefiniert&lt;br /&gt;
		 break;&lt;br /&gt;
	&lt;br /&gt;
	case TW_SR_DATA_ACK: // 0x80 Slave Receiver, ein Datenbyte wurde empfangen&lt;br /&gt;
	 	 data=TWDR; //Empfangene Daten auslesen&lt;br /&gt;
		 if (buffer_adr == 0xFF) //erster Zugriff, Bufferposition setzen&lt;br /&gt;
			{&lt;br /&gt;
			//Kontrolle ob gewünschte Adresse im erlaubten bereich&lt;br /&gt;
			if(data&amp;lt;i2c_buffer_size)&lt;br /&gt;
				{&lt;br /&gt;
					buffer_adr= data; //Bufferposition wie adressiert setzen&lt;br /&gt;
				}&lt;br /&gt;
			else&lt;br /&gt;
				{&lt;br /&gt;
					buffer_adr=0; //Adresse auf Null setzen. Ist das sinnvoll? TO DO!&lt;br /&gt;
				}				&lt;br /&gt;
			TWCR_ACK;	// nächstes Datenbyte empfangen, ACK danach, um nächstes Byte anzufordern&lt;br /&gt;
		 }&lt;br /&gt;
		 else //weiterer Zugriff, nachdem die Position im Buffer gesetzt wurde. NUn die Daten empfangen und speichern&lt;br /&gt;
		 {&lt;br /&gt;
		&lt;br /&gt;
			if(buffer_adr&amp;lt;i2c_buffer_size)&lt;br /&gt;
				{&lt;br /&gt;
					//if(!I2C_reg_Schreibschutz[buffer_adr]) //Wenn Position nicht schreibgeschützt...&lt;br /&gt;
						i2cdata[buffer_adr]=data; 			//...dann Daten in Buffer schreibe&lt;br /&gt;
						&lt;br /&gt;
						&lt;br /&gt;
				}&lt;br /&gt;
			buffer_adr++; //Buffer-Adresse weiterzählen für nächsten Schreibzugriff&lt;br /&gt;
			TWCR_ACK;	&lt;br /&gt;
		 }&lt;br /&gt;
		break;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Slave transmitter&lt;br /&gt;
&lt;br /&gt;
		case TW_ST_SLA_ACK: //0xA8 Slave wurde im Lesemodus adressiert und hat ein ACK zurückgegeben.&lt;br /&gt;
	//Hier steht kein break! Es wird also der folgende Code ebenfalls ausgeführt!&lt;br /&gt;
	&lt;br /&gt;
		case TW_ST_DATA_ACK: //0xB8 Slave Transmitter, Daten wurden angefordert&lt;br /&gt;
			if (buffer_adr == 0xFF) //zuvor keine Leseadresse angegeben! &lt;br /&gt;
			{&lt;br /&gt;
			buffer_adr=0;&lt;br /&gt;
			}	&lt;br /&gt;
		&lt;br /&gt;
			if(buffer_adr&amp;lt;i2c_buffer_size)	&lt;br /&gt;
			{&lt;br /&gt;
			TWDR = i2cdata[buffer_adr]; //Datenbyte senden&lt;br /&gt;
			buffer_adr++; //bufferadresse für nächstes Byte weiterzählen&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
			TWDR=0; //Kein Daten mehr im Buffer&lt;br /&gt;
			}&lt;br /&gt;
			TWCR_ACK;&lt;br /&gt;
		break;&lt;br /&gt;
&lt;br /&gt;
	case TW_ST_DATA_NACK: // 0xC0 Keine Daten mehr gefordert &lt;br /&gt;
	case TW_SR_DATA_NACK: // 0x88 &lt;br /&gt;
	case TW_ST_LAST_DATA: // 0xC8  Last data byte in TWDR has been transmitted (TWEA = “0”); ACK has been received&lt;br /&gt;
	case TW_SR_STOP:      // 0xA0 STOP empfangen&lt;br /&gt;
	default: 	&lt;br /&gt;
    TWCR_RESET;&lt;br /&gt;
	break;&lt;br /&gt;
	} //end.switch (TW_STATUS)&lt;br /&gt;
} //end.ISR(TWI_vect)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void warte (int loop)  //loop: wartezeit in ms &lt;br /&gt;
{&lt;br /&gt;
	int i;&lt;br /&gt;
	for(i=0;i&amp;lt;loop;i++) _delay_ms(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main (void)&lt;br /&gt;
{&lt;br /&gt;
//TWI als Slave mit Adresse slaveadr starten&lt;br /&gt;
init_twi_slave(SLAVE_ADRESSE);&lt;br /&gt;
&lt;br /&gt;
//i2cdatamit Werten füllen, die der Master auslesen und ändern kann&lt;br /&gt;
for(uint8_t i=0;i&amp;lt;i2c_buffer_size;i++)&lt;br /&gt;
	{&lt;br /&gt;
		i2cdata[i]=10+i;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
//Serielle Schnittstelle aktivieren&lt;br /&gt;
uart_init((UART_BAUD_SELECT((BAUD),F_CPU)));&lt;br /&gt;
uart_puts(&amp;quot;I2C-Test\r\n&amp;quot;);&lt;br /&gt;
uart_puts(&amp;quot;Teste I2C-Slave mit Adresse &amp;quot;); uart_puti(SLAVE_ADRESSE);&lt;br /&gt;
uart_puts(&amp;quot;\r\n&amp;quot;);&lt;br /&gt;
uart_puts(&amp;quot;\r\n&amp;quot;); //Leerzeile&lt;br /&gt;
&lt;br /&gt;
//in einer Endlosschleife den Inhalt der Buffer ausgeben&lt;br /&gt;
while(1) &lt;br /&gt;
{&lt;br /&gt;
	uart_puts(&amp;quot;i2cdata:\r\n&amp;quot;);&lt;br /&gt;
	for(uint8_t i=0;i&amp;lt;i2c_buffer_size;i++)&lt;br /&gt;
		{&lt;br /&gt;
			uart_puti(i2cdata[i]);&lt;br /&gt;
			uart_puts(&amp;quot;\r\n&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	uart_puts(&amp;quot;\r\n&amp;quot;);//leerzeile&lt;br /&gt;
warte(500);&lt;br /&gt;
} //end.while&lt;br /&gt;
} //end.main&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Slave sourcecode ==&lt;br /&gt;
Die twislave.c für den Slave. Stand: 5.4.2010 &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;util/twi.h&amp;gt; 		//enthält z.B. die Bezeichnungen für die Statuscodes in TWSR&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;  //dient zur Behandlung der Interrupts&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt; 		//definiert den Datentyp uint8_t&lt;br /&gt;
#include &amp;quot;twislave.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
//%%%%%%%% Globale Variablen, die vom Hauptprogramm genutzt werden %%%%%%%%&lt;br /&gt;
/*Der Buffer, in dem die Daten gespeichert werden. &lt;br /&gt;
Aus Sicht des Masters läuft der Zugrif auf den Buffer genau wie bei einem I2C-EEPROm ab.&lt;br /&gt;
Für den Slave ist es eine globale Variable&lt;br /&gt;
*/&lt;br /&gt;
volatile uint8_t i2cdata[i2c_buffer_size+1];&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
volatile uint8_t buffer_adr; //&amp;quot;Adressregister&amp;quot; für den Buffer&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*Initaliserung des TWI-Inteface. Muss zu Beginn aufgerufen werden, sowie bei einem Wechsel der Slave Adresse&lt;br /&gt;
Parameter adr: gewünschte Slave-Adresse&lt;br /&gt;
*/&lt;br /&gt;
void init_twi_slave(uint8_t adr)&lt;br /&gt;
{&lt;br /&gt;
	TWAR= adr; //Adresse setzen&lt;br /&gt;
	TWCR &amp;amp;= ~(1&amp;lt;&amp;lt;TWSTA)|(1&amp;lt;&amp;lt;TWSTO);&lt;br /&gt;
	TWCR|= (1&amp;lt;&amp;lt;TWEA) | (1&amp;lt;&amp;lt;TWEN)|(1&amp;lt;&amp;lt;TWIE); 	&lt;br /&gt;
	buffer_adr=0xFF;  &lt;br /&gt;
	sei();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Je nach Statuscode in TWSR müssen verschiedene Bitmuster in TWCR geschreiben werden(siehe Tabellen im Datenblatt!). &lt;br /&gt;
//Makros für die verwendeten Bitmuster:&lt;br /&gt;
&lt;br /&gt;
//ACK nach empfangenen Daten senden/ ACK nach gesendeten Daten erwarten&lt;br /&gt;
#define TWCR_ACK TWCR = (1&amp;lt;&amp;lt;TWEN)|(1&amp;lt;&amp;lt;TWIE)|(1&amp;lt;&amp;lt;TWINT)|(1&amp;lt;&amp;lt;TWEA)|(0&amp;lt;&amp;lt;TWSTA)|(0&amp;lt;&amp;lt;TWSTO)|(0&amp;lt;&amp;lt;TWWC);  &lt;br /&gt;
&lt;br /&gt;
//NACK nach empfangenen Daten senden/ NACK nach gesendeten Daten erwarten     &lt;br /&gt;
#define TWCR_NACK TWCR = (1&amp;lt;&amp;lt;TWEN)|(1&amp;lt;&amp;lt;TWIE)|(1&amp;lt;&amp;lt;TWINT)|(0&amp;lt;&amp;lt;TWEA)|(0&amp;lt;&amp;lt;TWSTA)|(0&amp;lt;&amp;lt;TWSTO)|(0&amp;lt;&amp;lt;TWWC);&lt;br /&gt;
&lt;br /&gt;
//switched to the non adressed slave mode...&lt;br /&gt;
#define TWCR_RESET TWCR = (1&amp;lt;&amp;lt;TWEN)|(1&amp;lt;&amp;lt;TWIE)|(1&amp;lt;&amp;lt;TWINT)|(1&amp;lt;&amp;lt;TWEA)|(0&amp;lt;&amp;lt;TWSTA)|(0&amp;lt;&amp;lt;TWSTO)|(0&amp;lt;&amp;lt;TWWC);  &lt;br /&gt;
//Die Bitmuster für TWCR_ACK und TWCR_RESET sind gleich. Dies ist kein Fehler und dient nur der Übersicht!&lt;br /&gt;
&lt;br /&gt;
/*ISR, die bei einem Ereignis auf dem Bus ausgelöst wird. Im Register TWSR befindet sich dann &lt;br /&gt;
ein Statuscode, anhand dessen die Situation festgestellt werden kann.&lt;br /&gt;
*/&lt;br /&gt;
ISR (TWI_vect)  &lt;br /&gt;
{&lt;br /&gt;
uint8_t data=0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
switch (TW_STATUS) //TWI-Statusregister prüfen und nötige Aktion bestimmen &lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
// Slave Receiver &lt;br /&gt;
&lt;br /&gt;
case TW_SR_SLA_ACK: // 0x60 Slave Receiver, Slave wurde adressiert	&lt;br /&gt;
	TWCR_ACK; // nächstes Datenbyte empfangen, ACK danach senden&lt;br /&gt;
	buffer_adr=0xFF; //Bufferposition ist undefiniert&lt;br /&gt;
break;&lt;br /&gt;
	&lt;br /&gt;
case TW_SR_DATA_ACK: // 0x80 Slave Receiver, ein Datenbyte wurde empfangen&lt;br /&gt;
	data=TWDR; //Empfangene Daten auslesen&lt;br /&gt;
	if (buffer_adr == 0xFF) //erster Zugriff, Bufferposition setzen&lt;br /&gt;
		{&lt;br /&gt;
			//Kontrolle ob gewünschte Adresse im erlaubten bereich&lt;br /&gt;
			if(data&amp;lt;i2c_buffer_size)&lt;br /&gt;
				{&lt;br /&gt;
					buffer_adr= data; //Bufferposition wie adressiert setzen&lt;br /&gt;
				}&lt;br /&gt;
			else&lt;br /&gt;
				{&lt;br /&gt;
					buffer_adr=0; //Adresse auf Null setzen. Ist das sinnvoll? TO DO!&lt;br /&gt;
				}				&lt;br /&gt;
			TWCR_ACK;	// nächstes Datenbyte empfangen, ACK danach, um nächstes Byte anzufordern&lt;br /&gt;
		}&lt;br /&gt;
	else //weiterer Zugriff, nachdem die Position im Buffer gesetzt wurde. NUn die Daten empfangen und speichern&lt;br /&gt;
		{&lt;br /&gt;
		&lt;br /&gt;
			if(buffer_adr&amp;lt;i2c_buffer_size)&lt;br /&gt;
				{&lt;br /&gt;
					if(!I2C_reg_Schreibschutz[buffer_adr]) //Wenn Position nicht schreibgeschützt...&lt;br /&gt;
						i2cdata[buffer_adr]=data; 			//...dann Daten in Buffer schreibe&lt;br /&gt;
						&lt;br /&gt;
						&lt;br /&gt;
				}&lt;br /&gt;
			buffer_adr++; //Buffer-Adresse weiterzählen für nächsten Schreibzugriff&lt;br /&gt;
			TWCR_ACK;	&lt;br /&gt;
		}&lt;br /&gt;
break;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Slave transmitter&lt;br /&gt;
&lt;br /&gt;
case TW_ST_SLA_ACK: //0xA8 Slave wurde im Lesemodus adressiert und hat ein ACK zurückgegeben.&lt;br /&gt;
	//Hier steht kein break! Es wird also der folgende Code ebenfalls ausgeführt!&lt;br /&gt;
	&lt;br /&gt;
case TW_ST_DATA_ACK: //0xB8 Slave Transmitter, Daten wurden angefordert&lt;br /&gt;
&lt;br /&gt;
	if (buffer_adr == 0xFF) //zuvor keine Leseadresse angegeben! &lt;br /&gt;
		{&lt;br /&gt;
			buffer_adr=0;&lt;br /&gt;
		}	&lt;br /&gt;
		&lt;br /&gt;
	if(buffer_adr&amp;lt;i2c_buffer_size)	&lt;br /&gt;
		{&lt;br /&gt;
			TWDR = i2cdata[buffer_adr]; //Datenbyte senden&lt;br /&gt;
			buffer_adr++; //bufferadresse für nächstes Byte weiterzählen&lt;br /&gt;
		}&lt;br /&gt;
	else&lt;br /&gt;
		{&lt;br /&gt;
			TWDR=0; //Kein Daten mehr im Buffer&lt;br /&gt;
		}&lt;br /&gt;
	TWCR_ACK;&lt;br /&gt;
break;&lt;br /&gt;
&lt;br /&gt;
case TW_ST_DATA_NACK: // 0xC0 Keine Daten mehr gefordert &lt;br /&gt;
case TW_SR_DATA_NACK: // 0x88 &lt;br /&gt;
case TW_ST_LAST_DATA: // 0xC8  Last data byte in TWDR has been transmitted (TWEA = “0”); ACK has been received&lt;br /&gt;
case TW_SR_STOP:      // 0xA0 STOP empfangen&lt;br /&gt;
default: 	&lt;br /&gt;
    TWCR_RESET;&lt;br /&gt;
break;&lt;br /&gt;
	&lt;br /&gt;
} //end.switch (TW_STATUS)&lt;br /&gt;
} //end.ISR(TWI_vect)&lt;br /&gt;
&lt;br /&gt;
////Ende von twislave.c////&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Slave header ==&lt;br /&gt;
Die zugehörige Headerdatei twislave.h für den Slave. Stand: 19.2.2010&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#ifndef _TWISLAVE_H&lt;br /&gt;
#define _TWISLAVE_H&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;util/twi.h&amp;gt; 		  //enthaelt z.B. die Bezeichnungen fuer die Statuscodes in TWSR&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;  //dient zur behandlung der Interrupts&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt; 		    //definiert den Datentyp uint8_t&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 *  @defgroup twislave TWI-Slave&lt;br /&gt;
 *  @code #include &amp;quot;twislave.h&amp;quot; @endcode&lt;br /&gt;
 * &lt;br /&gt;
 *  @brief Betrieb eines AVRs mit Hardware-TWI-Schnittstelle als Slave.&lt;br /&gt;
 *  Zu Beginn muss init_twi_slave mit der gewuenschten Slave-Adresse als&lt;br /&gt;
 *  Parameter aufgerufen werden.&lt;br /&gt;
 *&lt;br /&gt;
 * Der Datenaustausch mit dem Master erfolgt ueber den Buffer i2cdata, &lt;br /&gt;
 * auf den von Master und Slave zugegriffen werden kann. &lt;br /&gt;
 * Dies ist fuer den Slave eine globale Variable (Array aus uint8_t). &lt;br /&gt;
&lt;br /&gt;
 * Der Zugriff durch den Master erfolgt aehnlich wie bei einem&lt;br /&gt;
 * normalen I2C-EEPROM.&lt;br /&gt;
 * Man sendet zunaechst die Bufferposition, an die man schreiben will,&lt;br /&gt;
 * und dann die Daten. &lt;br /&gt;
 * Die Bufferposition wird automatisch hochgezaehlt, sodass man mehrere&lt;br /&gt;
 * Datenbytes hintereinander schreiben kann, ohne jedesmal die &lt;br /&gt;
 * Bufferadresse zu schreiben.&lt;br /&gt;
 *&lt;br /&gt;
 * Um vom Master aus zu lesen, uebertraegt man zunaechst in einem &lt;br /&gt;
 * Schreibzugriff die gewuenschte Bufferposition und liest dann nach&lt;br /&gt;
 * einem repeated start die Daten aus. Die Bufferposition wird &lt;br /&gt;
 * automatisch hochgezaehlt, sodass man mehrere Datenbytes&lt;br /&gt;
 * hintereinander lesen kann, ohne jedesmal die Bufferposition zu&lt;br /&gt;
 * schreiben.&lt;br /&gt;
 *&lt;br /&gt;
 * Abgefangene Fehlbedienung durch den Master:&lt;br /&gt;
 * - Lesen ueber die Grenze des txbuffers hinaus&lt;br /&gt;
 * - Schreiben ueber die Grenzen des rxbuffers hinaus&lt;br /&gt;
 * - Angabe einer ungueltigen Schreib/Lese-Adresse&lt;br /&gt;
 * - Lesezugriff, ohne vorher Leseadresse geschrieben zu haben&lt;br /&gt;
 * &lt;br /&gt;
 *  @author uwegw&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*@{*/&lt;br /&gt;
&lt;br /&gt;
//%%%%%%%% von Benutzer konfigurierbare Einstellungen %%%%%%%%&lt;br /&gt;
/**@brief Groesse des Buffers in Byte (2..254) */&lt;br /&gt;
#define i2c_buffer_size 10// I2C_REG_ANZAHL 254 Hier kann eingestellt werden wieviele Register ausgegeben werden&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//%%%%%%%% Globale Variablen, die vom Hauptprogramm genutzt werden %%%%%%%%&lt;br /&gt;
/**@brief Der Buffer, in dem die Daten gespeichert werden.&lt;br /&gt;
 * Aus Sicht des Masters laeuft der Zugrif auf den Buffer genau wie&lt;br /&gt;
 *  bei einem I2C-EEPROm ab.&lt;br /&gt;
 * Fuer den Slave ist es eine globale Variable&lt;br /&gt;
*/&lt;br /&gt;
volatile uint8_t i2cdata[i2c_buffer_size+1];&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**@brief Initaliserung des TWI-Inteface. Muss zu Beginn aufgerufen werden, sowie bei einem Wechsel der Slave Adresse&lt;br /&gt;
 * @param adr gewuenschte Slave-Adresse */&lt;br /&gt;
void init_twi_slave(uint8_t adr);&lt;br /&gt;
&lt;br /&gt;
//%%%%%%%% ab hier sind normalerweise keine weiteren Aenderungen erforderlich! %%%%%%%%//&lt;br /&gt;
//____________________________________________________________________________________//&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Bei zu alten AVR-GCC-Versionen werden die Interrupts anders genutzt, daher in diesem Fall mit Fehlermeldung abbrechen&lt;br /&gt;
#if (__GNUC__ * 100 + __GNUC_MINOR__) &amp;lt; 304&lt;br /&gt;
	#error &amp;quot;This library requires AVR-GCC 3.4.5 or later, update to newer AVR-GCC compiler !&amp;quot;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
//Schutz vor unsinnigen Buffergroessen&lt;br /&gt;
#if (i2c_buffer_size &amp;gt; 254)&lt;br /&gt;
	#error Buffer zu gross gewaehlt! Maximal 254 Bytes erlaubt.&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#if (i2c_buffer_size &amp;lt; 2)&lt;br /&gt;
	#error Buffer muss mindestens zwei Byte gross sein!&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#endif //#ifdef _TWISLAVE_H&lt;br /&gt;
////Ende von twislave.h////&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Microcontroller]]&lt;br /&gt;
[[Kategorie:Quellcode C]]&lt;/div&gt;</summary>
		<author><name>HannoHupmann</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=TWI_Slave_mit_avr-gcc&amp;diff=16179</id>
		<title>TWI Slave mit avr-gcc</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=TWI_Slave_mit_avr-gcc&amp;diff=16179"/>
				<updated>2010-04-05T17:14:09Z</updated>
		
		<summary type="html">&lt;p&gt;HannoHupmann: /* Slave */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Programm für einen AVR mit [[TWI]] (Hardware-[[I2C]])-Schnittstelle als Slave.&lt;br /&gt;
Manchmal stellt sich die Aufgabe, mehrere AVRs per [[I2C]] zu vernetzen. Ein Beispiel ist die Erweiterung eines bestehenden Systems um einen leistungsstärkeren Controller. Dies ist etwa beim [[Asuro]] oder [[Yeti]] denkbar, um z.B. mehr Ein/Ausgänge oder Speicherplatz zu bekommen.&lt;br /&gt;
&lt;br /&gt;
Man kann aber beim Bau eines Roboters auch von Anfang an auf ein System von mehreren vernetzten Controllern setzen. So kann man verschiedene Aufgabe, die weitgehend unabhängig voneinader gleichzeitg erledigt werden müssen, besser verteilen. Denkbar ist z.B. ein Controller für die Motorsteuerung, einer für die Sensorik, einer für Ein-und Ausgabe (wie LCD und Bedientaster),... , und ein zentraler Controller, der die Richtung vorgibt und alle anderen Controller mit Befehlen versorgt. Ein konkretes Beispiel ist der Roboterbausatz Nibo (siehe: [http://www.nicai-systems.de/nibo.html]) von nicai-systems, der einen Atmel ATmega128 als Hauptcontroller und zwei Atmel ATtiny44 als Controller für die Motorsteuerung und die IR-Sensorik einsetzt. Die Kommunikation läuft mit 400 kHz über den I2C-Bus mit dem ATmega128 als Master. &lt;br /&gt;
&lt;br /&gt;
Außerdem wurde der Code für einen Mega32 mit dem AVR Studio getestet Beachte: im AVR-Studio ist default ein ATmega128 eingestellt, unter Projekt -&amp;gt; Configuration Options kann das Device geändert werden, außerdem ist die Frequency einzustellen. In meinem Fall waren es 7372800Hz da ich in der Schaltung einen entsprechenden Quarz eingebaut habe. Die Verbindung zwischen Master und Slave erfolgt über die Pins 22 (SCL) und 23 (SDA) und gemeinsamer GND. Abschlusswiderstände (4,7kOhm nicht vergessen, am besten beim Master, siehe auch I2C-Definitionen).   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Schließlich kann ein entsprechend programmierter AVR auch als Ersatz für handelsübliche I2C-Bauteile dienen. Der kleinste AVR mit Hardware-I2C, der ATmega48, ist mit 1,30€ (Reichelt) billiger als viele normale I2C-ICs. Er kann bei entsprechender Programmierung z.B. die Aufgaben von zwei PCF8574 (8bit-Portexpander, 1,25€) und einem PCF8591 (4fach AD-Wandler, 2,35€) übernehmen und außerdem noch als I2C-EEPROM mit 256 Bytes dienen. &lt;br /&gt;
&lt;br /&gt;
Das folgende Programm (twislave.c) steuert das TWI (Hardware-I2C)-Interface eines AVRs als Slave an. Es müsste auf allen AVRs der Mega-Reihe funktionieren, die über eine TWI-Schnittstelle verfügen. &lt;br /&gt;
&lt;br /&gt;
Das System ist als eine Art Dualport-RAM konzipiert, Master und Slave teilen sich also einen Speicherbereich und können darüber Daten austauschen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Master ==&lt;br /&gt;
Ein Testprogramm für den Master. Es wird die [http://homepage.hispeed.ch/peterfleury/avr-software.html#libs I2C-Master-Bibliothek von Peter Fleury] verwendet.&lt;br /&gt;
Es wird geprüft, ob der Slave bereit ist, dann werden drei Bytes erst in den Slave geschrieben, und anschließend wieder ausgelesen.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// I2C-Master-Routinen von Peter Fleury verwenden &lt;br /&gt;
// siehe http://homepage.hispeed.ch/peterfleury/avr-software.html#libs&lt;br /&gt;
// Hier sind auch die Datein: i2cmaster.h und twimaster.c zu finden, die benötigt werden&lt;br /&gt;
// (wer mit AVR-Studio arbeitet braucht nur diese Datein)&lt;br /&gt;
// Letztes Update des Codes 5. April 2010 durch HannoHupmann&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;quot;i2cmaster.h&amp;quot;  &lt;br /&gt;
#define SLAVE_ADRESSE 0x50&lt;br /&gt;
&lt;br /&gt;
uint8_t byte1 = 42;&lt;br /&gt;
uint8_t byte2 = 43;&lt;br /&gt;
uint8_t byte3 = 44;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  i2c_init();         // init I2C interface&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if(!(i2c_start(SLAVE_ADRESSE+I2C_WRITE))) //Slave bereit zum schreiben?&lt;br /&gt;
{&lt;br /&gt;
  i2c_write(0x00);  // Buffer Startadresse setzen 	&lt;br /&gt;
  i2c_write(byte1); // Drei Bytes schreiben...&lt;br /&gt;
  i2c_write(byte2); &lt;br /&gt;
  i2c_write(byte3); &lt;br /&gt;
  i2c_stop();       // Zugriff beenden&lt;br /&gt;
}&lt;br /&gt;
else&lt;br /&gt;
{&lt;br /&gt;
  /* Hier könnte eine Fehlermeldung ausgegeben werden... */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if(!(i2c_start(SLAVE_ADRESSE+I2C_WRITE))) //Slave bereit zum lesen?&lt;br /&gt;
{&lt;br /&gt;
  i2c_write(0x00); //Buffer Startadresse zum Auslesen&lt;br /&gt;
  i2c_rep_start(SLAVE_ADRESSE+I2C_READ); //Lesen beginnen&lt;br /&gt;
&lt;br /&gt;
  byte1= i2c_readAck(); // Bytes lesen...&lt;br /&gt;
  byte2= i2c_readAck();&lt;br /&gt;
  byte3= i2c_readNak(); // letztes Byte lesen, darum kein ACK&lt;br /&gt;
  i2c_stop();           // Zugriff beenden&lt;br /&gt;
} &lt;br /&gt;
else&lt;br /&gt;
{&lt;br /&gt;
  /* Hier könnte eine Fehlermeldung ausgegeben werden... */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if ((byte1 != 42)||(byte2 != 43)||(byte3 != 44))&lt;br /&gt;
{&lt;br /&gt;
  /* Die Bytes wurden nicht korrekt übertragen und wieder gelesen! */ &lt;br /&gt;
}&lt;br /&gt;
    for(;;);	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Code wurde von mir getestet und funktioniert auf einem Mega32&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Code sollte ohne Probleme kompiliert werden, eventuell fehlen die oben genannten Datein wenn es nicht klappt. &lt;br /&gt;
&lt;br /&gt;
== Slave == &lt;br /&gt;
Hier soll nun der Code behandelt werden der für den Slave-Controller notwendig ist. Der vorgestellte Code schreibt die Register des Slaves an die Serielle Schnittstelle, mit einem Terminal Programm kann man sich die Ausgabe ansehen und überprüfen ob alles korrekt funktioniert. &lt;br /&gt;
Der Code ist wieder an den von Peter Fleury angelehnt.&lt;br /&gt;
&lt;br /&gt;
Für den Mega32 hab ich die twislave.c nicht gebraucht. Dafür aber die uart.c und uart.h welche sich auch bei Peter Fleury finden lassen. Diese müssen nicht angepasst werden. Wichtig ist die richtige Frquenz sonst ist die Ausgabe nicht korrekt. Der Slave sollte ohne Master folgende Ausgabe haben: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
i2cdata: &lt;br /&gt;
10&lt;br /&gt;
11&lt;br /&gt;
12&lt;br /&gt;
13&lt;br /&gt;
usw. &lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Die Register werden der Reihe nach mit ihrem Wert angezeigt. Wird der Master hinzugefügt sollte nun folgende Ausgabe im Terminal erscheinen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
i2cdata: &lt;br /&gt;
41&lt;br /&gt;
42&lt;br /&gt;
43&lt;br /&gt;
13&lt;br /&gt;
usw. &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Slave Testprogramm ==&lt;br /&gt;
Ein Testprogramm für den Slave. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
Testprogramm für den Slave &lt;br /&gt;
Der Buffer wird mit Werten gefüllt. Dann wird er fortlaufend über die serielle Schnittstelle ausgegeben.&lt;br /&gt;
*/&lt;br /&gt;
#include &amp;lt;util/twi.h&amp;gt; 		//enthält z.B. die Bezeichnungen für die Statuscodes in TWSR&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;  //dient zur Behandlung der Interrupts&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt; 		//definiert den Datentyp uint8_t&lt;br /&gt;
#include &amp;quot;twislave.h&amp;quot;&lt;br /&gt;
#include &amp;quot;uart.h&amp;quot;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#define BAUD 9600 //Baudrate&lt;br /&gt;
#define SLAVE_ADRESSE 0x50 //Die Slave-Adresse&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
volatile uint8_t i2cdata[i2c_buffer_size+1];&lt;br /&gt;
volatile uint8_t buffer_adr; 					//&amp;quot;Adressregister&amp;quot; für den Buffer&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*Initaliserung des TWI-Inteface. Muss zu Beginn aufgerufen werden, sowie bei einem Wechsel der Slave Adresse&lt;br /&gt;
Parameter adr: gewünschte Slave-Adresse&lt;br /&gt;
*/&lt;br /&gt;
void init_twi_slave(uint8_t adr)&lt;br /&gt;
{&lt;br /&gt;
	TWAR= adr; //Adresse setzen&lt;br /&gt;
	TWCR &amp;amp;= ~(1&amp;lt;&amp;lt;TWSTA)|(1&amp;lt;&amp;lt;TWSTO);&lt;br /&gt;
	TWCR|= (1&amp;lt;&amp;lt;TWEA) | (1&amp;lt;&amp;lt;TWEN)|(1&amp;lt;&amp;lt;TWIE); 	&lt;br /&gt;
	buffer_adr=0xFF;  &lt;br /&gt;
	sei();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Je nach Statuscode in TWSR müssen verschiedene Bitmuster in TWCR geschreiben werden(siehe Tabellen im Datenblatt!). &lt;br /&gt;
//Makros für die verwendeten Bitmuster:&lt;br /&gt;
&lt;br /&gt;
//ACK nach empfangenen Daten senden/ ACK nach gesendeten Daten erwarten&lt;br /&gt;
#define TWCR_ACK TWCR = (1&amp;lt;&amp;lt;TWEN)|(1&amp;lt;&amp;lt;TWIE)|(1&amp;lt;&amp;lt;TWINT)|(1&amp;lt;&amp;lt;TWEA)|(0&amp;lt;&amp;lt;TWSTA)|(0&amp;lt;&amp;lt;TWSTO)|(0&amp;lt;&amp;lt;TWWC);  &lt;br /&gt;
&lt;br /&gt;
//NACK nach empfangenen Daten senden/ NACK nach gesendeten Daten erwarten     &lt;br /&gt;
#define TWCR_NACK TWCR = (1&amp;lt;&amp;lt;TWEN)|(1&amp;lt;&amp;lt;TWIE)|(1&amp;lt;&amp;lt;TWINT)|(0&amp;lt;&amp;lt;TWEA)|(0&amp;lt;&amp;lt;TWSTA)|(0&amp;lt;&amp;lt;TWSTO)|(0&amp;lt;&amp;lt;TWWC);&lt;br /&gt;
&lt;br /&gt;
//switched to the non adressed slave mode...&lt;br /&gt;
#define TWCR_RESET TWCR = (1&amp;lt;&amp;lt;TWEN)|(1&amp;lt;&amp;lt;TWIE)|(1&amp;lt;&amp;lt;TWINT)|(1&amp;lt;&amp;lt;TWEA)|(0&amp;lt;&amp;lt;TWSTA)|(0&amp;lt;&amp;lt;TWSTO)|(0&amp;lt;&amp;lt;TWWC);  &lt;br /&gt;
//Die Bitmuster für TWCR_ACK und TWCR_RESET sind gleich. Dies ist kein Fehler und dient nur der Übersicht!&lt;br /&gt;
&lt;br /&gt;
/*ISR, die bei einem Ereignis auf dem Bus ausgelöst wird. Im Register TWSR befindet sich dann &lt;br /&gt;
ein Statuscode, anhand dessen die Situation festgestellt werden kann.&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ISR (TWI_vect)  &lt;br /&gt;
{&lt;br /&gt;
	uint8_t data=0;&lt;br /&gt;
	switch (TW_STATUS) //TWI-Statusregister prüfen und nötige Aktion bestimmen &lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
// Slave Receiver &lt;br /&gt;
&lt;br /&gt;
	case TW_SR_SLA_ACK: // 0x60 Slave Receiver, Slave wurde adressiert	&lt;br /&gt;
	     TWCR_ACK; // nächstes Datenbyte empfangen, ACK danach senden&lt;br /&gt;
		 buffer_adr=0xFF; //Bufferposition ist undefiniert&lt;br /&gt;
		 break;&lt;br /&gt;
	&lt;br /&gt;
	case TW_SR_DATA_ACK: // 0x80 Slave Receiver, ein Datenbyte wurde empfangen&lt;br /&gt;
	 	 data=TWDR; //Empfangene Daten auslesen&lt;br /&gt;
		 if (buffer_adr == 0xFF) //erster Zugriff, Bufferposition setzen&lt;br /&gt;
			{&lt;br /&gt;
			//Kontrolle ob gewünschte Adresse im erlaubten bereich&lt;br /&gt;
			if(data&amp;lt;i2c_buffer_size)&lt;br /&gt;
				{&lt;br /&gt;
					buffer_adr= data; //Bufferposition wie adressiert setzen&lt;br /&gt;
				}&lt;br /&gt;
			else&lt;br /&gt;
				{&lt;br /&gt;
					buffer_adr=0; //Adresse auf Null setzen. Ist das sinnvoll? TO DO!&lt;br /&gt;
				}				&lt;br /&gt;
			TWCR_ACK;	// nächstes Datenbyte empfangen, ACK danach, um nächstes Byte anzufordern&lt;br /&gt;
		 }&lt;br /&gt;
		 else //weiterer Zugriff, nachdem die Position im Buffer gesetzt wurde. NUn die Daten empfangen und speichern&lt;br /&gt;
		 {&lt;br /&gt;
		&lt;br /&gt;
			if(buffer_adr&amp;lt;i2c_buffer_size)&lt;br /&gt;
				{&lt;br /&gt;
					//if(!I2C_reg_Schreibschutz[buffer_adr]) //Wenn Position nicht schreibgeschützt...&lt;br /&gt;
						i2cdata[buffer_adr]=data; 			//...dann Daten in Buffer schreibe&lt;br /&gt;
						&lt;br /&gt;
						&lt;br /&gt;
				}&lt;br /&gt;
			buffer_adr++; //Buffer-Adresse weiterzählen für nächsten Schreibzugriff&lt;br /&gt;
			TWCR_ACK;	&lt;br /&gt;
		 }&lt;br /&gt;
		break;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Slave transmitter&lt;br /&gt;
&lt;br /&gt;
		case TW_ST_SLA_ACK: //0xA8 Slave wurde im Lesemodus adressiert und hat ein ACK zurückgegeben.&lt;br /&gt;
	//Hier steht kein break! Es wird also der folgende Code ebenfalls ausgeführt!&lt;br /&gt;
	&lt;br /&gt;
		case TW_ST_DATA_ACK: //0xB8 Slave Transmitter, Daten wurden angefordert&lt;br /&gt;
			if (buffer_adr == 0xFF) //zuvor keine Leseadresse angegeben! &lt;br /&gt;
			{&lt;br /&gt;
			buffer_adr=0;&lt;br /&gt;
			}	&lt;br /&gt;
		&lt;br /&gt;
			if(buffer_adr&amp;lt;i2c_buffer_size)	&lt;br /&gt;
			{&lt;br /&gt;
			TWDR = i2cdata[buffer_adr]; //Datenbyte senden&lt;br /&gt;
			buffer_adr++; //bufferadresse für nächstes Byte weiterzählen&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
			TWDR=0; //Kein Daten mehr im Buffer&lt;br /&gt;
			}&lt;br /&gt;
			TWCR_ACK;&lt;br /&gt;
		break;&lt;br /&gt;
&lt;br /&gt;
	case TW_ST_DATA_NACK: // 0xC0 Keine Daten mehr gefordert &lt;br /&gt;
	case TW_SR_DATA_NACK: // 0x88 &lt;br /&gt;
	case TW_ST_LAST_DATA: // 0xC8  Last data byte in TWDR has been transmitted (TWEA = “0”); ACK has been received&lt;br /&gt;
	case TW_SR_STOP:      // 0xA0 STOP empfangen&lt;br /&gt;
	default: 	&lt;br /&gt;
    TWCR_RESET;&lt;br /&gt;
	break;&lt;br /&gt;
	} //end.switch (TW_STATUS)&lt;br /&gt;
} //end.ISR(TWI_vect)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void warte (int loop)  //loop: wartezeit in ms &lt;br /&gt;
{&lt;br /&gt;
	int i;&lt;br /&gt;
	for(i=0;i&amp;lt;loop;i++) _delay_ms(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main (void)&lt;br /&gt;
{&lt;br /&gt;
//TWI als Slave mit Adresse slaveadr starten&lt;br /&gt;
init_twi_slave(SLAVE_ADRESSE);&lt;br /&gt;
&lt;br /&gt;
//i2cdatamit Werten füllen, die der Master auslesen und ändern kann&lt;br /&gt;
for(uint8_t i=0;i&amp;lt;i2c_buffer_size;i++)&lt;br /&gt;
	{&lt;br /&gt;
		i2cdata[i]=10+i;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
//Serielle Schnittstelle aktivieren&lt;br /&gt;
uart_init((UART_BAUD_SELECT((BAUD),F_CPU)));&lt;br /&gt;
uart_puts(&amp;quot;I2C-Test\r\n&amp;quot;);&lt;br /&gt;
uart_puts(&amp;quot;Teste I2C-Slave mit Adresse &amp;quot;); uart_puti(SLAVE_ADRESSE);&lt;br /&gt;
uart_puts(&amp;quot;\r\n&amp;quot;);&lt;br /&gt;
uart_puts(&amp;quot;\r\n&amp;quot;); //Leerzeile&lt;br /&gt;
&lt;br /&gt;
//in einer Endlosschleife den Inhalt der Buffer ausgeben&lt;br /&gt;
while(1) &lt;br /&gt;
{&lt;br /&gt;
	uart_puts(&amp;quot;i2cdata:\r\n&amp;quot;);&lt;br /&gt;
	for(uint8_t i=0;i&amp;lt;i2c_buffer_size;i++)&lt;br /&gt;
		{&lt;br /&gt;
			uart_puti(i2cdata[i]);&lt;br /&gt;
			uart_puts(&amp;quot;\r\n&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	uart_puts(&amp;quot;\r\n&amp;quot;);//leerzeile&lt;br /&gt;
warte(500);&lt;br /&gt;
} //end.while&lt;br /&gt;
} //end.main&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Slave sourcecode ==&lt;br /&gt;
Die twislave.c für den Slave. Stand: 5.4.2010 &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;util/twi.h&amp;gt; 		//enthält z.B. die Bezeichnungen für die Statuscodes in TWSR&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;  //dient zur Behandlung der Interrupts&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt; 		//definiert den Datentyp uint8_t&lt;br /&gt;
#include &amp;quot;twislave.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
//%%%%%%%% Globale Variablen, die vom Hauptprogramm genutzt werden %%%%%%%%&lt;br /&gt;
/*Der Buffer, in dem die Daten gespeichert werden. &lt;br /&gt;
Aus Sicht des Masters läuft der Zugrif auf den Buffer genau wie bei einem I2C-EEPROm ab.&lt;br /&gt;
Für den Slave ist es eine globale Variable&lt;br /&gt;
*/&lt;br /&gt;
volatile uint8_t i2cdata[i2c_buffer_size+1];&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
volatile uint8_t buffer_adr; //&amp;quot;Adressregister&amp;quot; für den Buffer&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*Initaliserung des TWI-Inteface. Muss zu Beginn aufgerufen werden, sowie bei einem Wechsel der Slave Adresse&lt;br /&gt;
Parameter adr: gewünschte Slave-Adresse&lt;br /&gt;
*/&lt;br /&gt;
void init_twi_slave(uint8_t adr)&lt;br /&gt;
{&lt;br /&gt;
	TWAR= adr; //Adresse setzen&lt;br /&gt;
	TWCR &amp;amp;= ~(1&amp;lt;&amp;lt;TWSTA)|(1&amp;lt;&amp;lt;TWSTO);&lt;br /&gt;
	TWCR|= (1&amp;lt;&amp;lt;TWEA) | (1&amp;lt;&amp;lt;TWEN)|(1&amp;lt;&amp;lt;TWIE); 	&lt;br /&gt;
	buffer_adr=0xFF;  &lt;br /&gt;
	sei();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Je nach Statuscode in TWSR müssen verschiedene Bitmuster in TWCR geschreiben werden(siehe Tabellen im Datenblatt!). &lt;br /&gt;
//Makros für die verwendeten Bitmuster:&lt;br /&gt;
&lt;br /&gt;
//ACK nach empfangenen Daten senden/ ACK nach gesendeten Daten erwarten&lt;br /&gt;
#define TWCR_ACK TWCR = (1&amp;lt;&amp;lt;TWEN)|(1&amp;lt;&amp;lt;TWIE)|(1&amp;lt;&amp;lt;TWINT)|(1&amp;lt;&amp;lt;TWEA)|(0&amp;lt;&amp;lt;TWSTA)|(0&amp;lt;&amp;lt;TWSTO)|(0&amp;lt;&amp;lt;TWWC);  &lt;br /&gt;
&lt;br /&gt;
//NACK nach empfangenen Daten senden/ NACK nach gesendeten Daten erwarten     &lt;br /&gt;
#define TWCR_NACK TWCR = (1&amp;lt;&amp;lt;TWEN)|(1&amp;lt;&amp;lt;TWIE)|(1&amp;lt;&amp;lt;TWINT)|(0&amp;lt;&amp;lt;TWEA)|(0&amp;lt;&amp;lt;TWSTA)|(0&amp;lt;&amp;lt;TWSTO)|(0&amp;lt;&amp;lt;TWWC);&lt;br /&gt;
&lt;br /&gt;
//switched to the non adressed slave mode...&lt;br /&gt;
#define TWCR_RESET TWCR = (1&amp;lt;&amp;lt;TWEN)|(1&amp;lt;&amp;lt;TWIE)|(1&amp;lt;&amp;lt;TWINT)|(1&amp;lt;&amp;lt;TWEA)|(0&amp;lt;&amp;lt;TWSTA)|(0&amp;lt;&amp;lt;TWSTO)|(0&amp;lt;&amp;lt;TWWC);  &lt;br /&gt;
//Die Bitmuster für TWCR_ACK und TWCR_RESET sind gleich. Dies ist kein Fehler und dient nur der Übersicht!&lt;br /&gt;
&lt;br /&gt;
/*ISR, die bei einem Ereignis auf dem Bus ausgelöst wird. Im Register TWSR befindet sich dann &lt;br /&gt;
ein Statuscode, anhand dessen die Situation festgestellt werden kann.&lt;br /&gt;
*/&lt;br /&gt;
ISR (TWI_vect)  &lt;br /&gt;
{&lt;br /&gt;
uint8_t data=0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
switch (TW_STATUS) //TWI-Statusregister prüfen und nötige Aktion bestimmen &lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
// Slave Receiver &lt;br /&gt;
&lt;br /&gt;
case TW_SR_SLA_ACK: // 0x60 Slave Receiver, Slave wurde adressiert	&lt;br /&gt;
	TWCR_ACK; // nächstes Datenbyte empfangen, ACK danach senden&lt;br /&gt;
	buffer_adr=0xFF; //Bufferposition ist undefiniert&lt;br /&gt;
break;&lt;br /&gt;
	&lt;br /&gt;
case TW_SR_DATA_ACK: // 0x80 Slave Receiver, ein Datenbyte wurde empfangen&lt;br /&gt;
	data=TWDR; //Empfangene Daten auslesen&lt;br /&gt;
	if (buffer_adr == 0xFF) //erster Zugriff, Bufferposition setzen&lt;br /&gt;
		{&lt;br /&gt;
			//Kontrolle ob gewünschte Adresse im erlaubten bereich&lt;br /&gt;
			if(data&amp;lt;i2c_buffer_size)&lt;br /&gt;
				{&lt;br /&gt;
					buffer_adr= data; //Bufferposition wie adressiert setzen&lt;br /&gt;
				}&lt;br /&gt;
			else&lt;br /&gt;
				{&lt;br /&gt;
					buffer_adr=0; //Adresse auf Null setzen. Ist das sinnvoll? TO DO!&lt;br /&gt;
				}				&lt;br /&gt;
			TWCR_ACK;	// nächstes Datenbyte empfangen, ACK danach, um nächstes Byte anzufordern&lt;br /&gt;
		}&lt;br /&gt;
	else //weiterer Zugriff, nachdem die Position im Buffer gesetzt wurde. NUn die Daten empfangen und speichern&lt;br /&gt;
		{&lt;br /&gt;
		&lt;br /&gt;
			if(buffer_adr&amp;lt;i2c_buffer_size)&lt;br /&gt;
				{&lt;br /&gt;
					if(!I2C_reg_Schreibschutz[buffer_adr]) //Wenn Position nicht schreibgeschützt...&lt;br /&gt;
						i2cdata[buffer_adr]=data; 			//...dann Daten in Buffer schreibe&lt;br /&gt;
						&lt;br /&gt;
						&lt;br /&gt;
				}&lt;br /&gt;
			buffer_adr++; //Buffer-Adresse weiterzählen für nächsten Schreibzugriff&lt;br /&gt;
			TWCR_ACK;	&lt;br /&gt;
		}&lt;br /&gt;
break;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Slave transmitter&lt;br /&gt;
&lt;br /&gt;
case TW_ST_SLA_ACK: //0xA8 Slave wurde im Lesemodus adressiert und hat ein ACK zurückgegeben.&lt;br /&gt;
	//Hier steht kein break! Es wird also der folgende Code ebenfalls ausgeführt!&lt;br /&gt;
	&lt;br /&gt;
case TW_ST_DATA_ACK: //0xB8 Slave Transmitter, Daten wurden angefordert&lt;br /&gt;
&lt;br /&gt;
	if (buffer_adr == 0xFF) //zuvor keine Leseadresse angegeben! &lt;br /&gt;
		{&lt;br /&gt;
			buffer_adr=0;&lt;br /&gt;
		}	&lt;br /&gt;
		&lt;br /&gt;
	if(buffer_adr&amp;lt;i2c_buffer_size)	&lt;br /&gt;
		{&lt;br /&gt;
			TWDR = i2cdata[buffer_adr]; //Datenbyte senden&lt;br /&gt;
			buffer_adr++; //bufferadresse für nächstes Byte weiterzählen&lt;br /&gt;
		}&lt;br /&gt;
	else&lt;br /&gt;
		{&lt;br /&gt;
			TWDR=0; //Kein Daten mehr im Buffer&lt;br /&gt;
		}&lt;br /&gt;
	TWCR_ACK;&lt;br /&gt;
break;&lt;br /&gt;
&lt;br /&gt;
case TW_ST_DATA_NACK: // 0xC0 Keine Daten mehr gefordert &lt;br /&gt;
case TW_SR_DATA_NACK: // 0x88 &lt;br /&gt;
case TW_ST_LAST_DATA: // 0xC8  Last data byte in TWDR has been transmitted (TWEA = “0”); ACK has been received&lt;br /&gt;
case TW_SR_STOP:      // 0xA0 STOP empfangen&lt;br /&gt;
default: 	&lt;br /&gt;
    TWCR_RESET;&lt;br /&gt;
break;&lt;br /&gt;
	&lt;br /&gt;
} //end.switch (TW_STATUS)&lt;br /&gt;
} //end.ISR(TWI_vect)&lt;br /&gt;
&lt;br /&gt;
////Ende von twislave.c////&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Slave header ==&lt;br /&gt;
Die zugehörige Headerdatei twislave.h für den Slave. Stand: 19.2.2010&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#ifndef _TWISLAVE_H&lt;br /&gt;
#define _TWISLAVE_H&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;util/twi.h&amp;gt; 		  //enthaelt z.B. die Bezeichnungen fuer die Statuscodes in TWSR&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;  //dient zur behandlung der Interrupts&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt; 		    //definiert den Datentyp uint8_t&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 *  @defgroup twislave TWI-Slave&lt;br /&gt;
 *  @code #include &amp;quot;twislave.h&amp;quot; @endcode&lt;br /&gt;
 * &lt;br /&gt;
 *  @brief Betrieb eines AVRs mit Hardware-TWI-Schnittstelle als Slave.&lt;br /&gt;
 *  Zu Beginn muss init_twi_slave mit der gewuenschten Slave-Adresse als&lt;br /&gt;
 *  Parameter aufgerufen werden.&lt;br /&gt;
 *&lt;br /&gt;
 * Der Datenaustausch mit dem Master erfolgt ueber den Buffer i2cdata, &lt;br /&gt;
 * auf den von Master und Slave zugegriffen werden kann. &lt;br /&gt;
 * Dies ist fuer den Slave eine globale Variable (Array aus uint8_t). &lt;br /&gt;
&lt;br /&gt;
 * Der Zugriff durch den Master erfolgt aehnlich wie bei einem&lt;br /&gt;
 * normalen I2C-EEPROM.&lt;br /&gt;
 * Man sendet zunaechst die Bufferposition, an die man schreiben will,&lt;br /&gt;
 * und dann die Daten. &lt;br /&gt;
 * Die Bufferposition wird automatisch hochgezaehlt, sodass man mehrere&lt;br /&gt;
 * Datenbytes hintereinander schreiben kann, ohne jedesmal die &lt;br /&gt;
 * Bufferadresse zu schreiben.&lt;br /&gt;
 *&lt;br /&gt;
 * Um vom Master aus zu lesen, uebertraegt man zunaechst in einem &lt;br /&gt;
 * Schreibzugriff die gewuenschte Bufferposition und liest dann nach&lt;br /&gt;
 * einem repeated start die Daten aus. Die Bufferposition wird &lt;br /&gt;
 * automatisch hochgezaehlt, sodass man mehrere Datenbytes&lt;br /&gt;
 * hintereinander lesen kann, ohne jedesmal die Bufferposition zu&lt;br /&gt;
 * schreiben.&lt;br /&gt;
 *&lt;br /&gt;
 * Abgefangene Fehlbedienung durch den Master:&lt;br /&gt;
 * - Lesen ueber die Grenze des txbuffers hinaus&lt;br /&gt;
 * - Schreiben ueber die Grenzen des rxbuffers hinaus&lt;br /&gt;
 * - Angabe einer ungueltigen Schreib/Lese-Adresse&lt;br /&gt;
 * - Lesezugriff, ohne vorher Leseadresse geschrieben zu haben&lt;br /&gt;
 * &lt;br /&gt;
 *  @author uwegw&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*@{*/&lt;br /&gt;
&lt;br /&gt;
//%%%%%%%% von Benutzer konfigurierbare Einstellungen %%%%%%%%&lt;br /&gt;
/**@brief Groesse des Buffers in Byte (2..254) */&lt;br /&gt;
#define i2c_buffer_size 10// I2C_REG_ANZAHL 254 Hier kann eingestellt werden wieviele Register ausgegeben werden&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//%%%%%%%% Globale Variablen, die vom Hauptprogramm genutzt werden %%%%%%%%&lt;br /&gt;
/**@brief Der Buffer, in dem die Daten gespeichert werden.&lt;br /&gt;
 * Aus Sicht des Masters laeuft der Zugrif auf den Buffer genau wie&lt;br /&gt;
 *  bei einem I2C-EEPROm ab.&lt;br /&gt;
 * Fuer den Slave ist es eine globale Variable&lt;br /&gt;
*/&lt;br /&gt;
volatile uint8_t i2cdata[i2c_buffer_size+1];&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**@brief Initaliserung des TWI-Inteface. Muss zu Beginn aufgerufen werden, sowie bei einem Wechsel der Slave Adresse&lt;br /&gt;
 * @param adr gewuenschte Slave-Adresse */&lt;br /&gt;
void init_twi_slave(uint8_t adr);&lt;br /&gt;
&lt;br /&gt;
//%%%%%%%% ab hier sind normalerweise keine weiteren Aenderungen erforderlich! %%%%%%%%//&lt;br /&gt;
//____________________________________________________________________________________//&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Bei zu alten AVR-GCC-Versionen werden die Interrupts anders genutzt, daher in diesem Fall mit Fehlermeldung abbrechen&lt;br /&gt;
#if (__GNUC__ * 100 + __GNUC_MINOR__) &amp;lt; 304&lt;br /&gt;
	#error &amp;quot;This library requires AVR-GCC 3.4.5 or later, update to newer AVR-GCC compiler !&amp;quot;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
//Schutz vor unsinnigen Buffergroessen&lt;br /&gt;
#if (i2c_buffer_size &amp;gt; 254)&lt;br /&gt;
	#error Buffer zu gross gewaehlt! Maximal 254 Bytes erlaubt.&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#if (i2c_buffer_size &amp;lt; 2)&lt;br /&gt;
	#error Buffer muss mindestens zwei Byte gross sein!&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#endif //#ifdef _TWISLAVE_H&lt;br /&gt;
////Ende von twislave.h////&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Microcontroller]]&lt;br /&gt;
[[Kategorie:Quellcode C]]&lt;/div&gt;</summary>
		<author><name>HannoHupmann</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=TWI_Slave_mit_avr-gcc&amp;diff=16177</id>
		<title>TWI Slave mit avr-gcc</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=TWI_Slave_mit_avr-gcc&amp;diff=16177"/>
				<updated>2010-04-05T17:09:46Z</updated>
		
		<summary type="html">&lt;p&gt;HannoHupmann: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Programm für einen AVR mit [[TWI]] (Hardware-[[I2C]])-Schnittstelle als Slave.&lt;br /&gt;
Manchmal stellt sich die Aufgabe, mehrere AVRs per [[I2C]] zu vernetzen. Ein Beispiel ist die Erweiterung eines bestehenden Systems um einen leistungsstärkeren Controller. Dies ist etwa beim [[Asuro]] oder [[Yeti]] denkbar, um z.B. mehr Ein/Ausgänge oder Speicherplatz zu bekommen.&lt;br /&gt;
&lt;br /&gt;
Man kann aber beim Bau eines Roboters auch von Anfang an auf ein System von mehreren vernetzten Controllern setzen. So kann man verschiedene Aufgabe, die weitgehend unabhängig voneinader gleichzeitg erledigt werden müssen, besser verteilen. Denkbar ist z.B. ein Controller für die Motorsteuerung, einer für die Sensorik, einer für Ein-und Ausgabe (wie LCD und Bedientaster),... , und ein zentraler Controller, der die Richtung vorgibt und alle anderen Controller mit Befehlen versorgt. Ein konkretes Beispiel ist der Roboterbausatz Nibo (siehe: [http://www.nicai-systems.de/nibo.html]) von nicai-systems, der einen Atmel ATmega128 als Hauptcontroller und zwei Atmel ATtiny44 als Controller für die Motorsteuerung und die IR-Sensorik einsetzt. Die Kommunikation läuft mit 400 kHz über den I2C-Bus mit dem ATmega128 als Master. &lt;br /&gt;
&lt;br /&gt;
Außerdem wurde der Code für einen Mega32 mit dem AVR Studio getestet Beachte: im AVR-Studio ist default ein ATmega128 eingestellt, unter Projekt -&amp;gt; Configuration Options kann das Device geändert werden, außerdem ist die Frequency einzustellen. In meinem Fall waren es 7372800Hz da ich in der Schaltung einen entsprechenden Quarz eingebaut habe. Die Verbindung zwischen Master und Slave erfolgt über die Pins 22 (SCL) und 23 (SDA) und gemeinsamer GND. Abschlusswiderstände (4,7kOhm nicht vergessen, am besten beim Master, siehe auch I2C-Definitionen).   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Schließlich kann ein entsprechend programmierter AVR auch als Ersatz für handelsübliche I2C-Bauteile dienen. Der kleinste AVR mit Hardware-I2C, der ATmega48, ist mit 1,30€ (Reichelt) billiger als viele normale I2C-ICs. Er kann bei entsprechender Programmierung z.B. die Aufgaben von zwei PCF8574 (8bit-Portexpander, 1,25€) und einem PCF8591 (4fach AD-Wandler, 2,35€) übernehmen und außerdem noch als I2C-EEPROM mit 256 Bytes dienen. &lt;br /&gt;
&lt;br /&gt;
Das folgende Programm (twislave.c) steuert das TWI (Hardware-I2C)-Interface eines AVRs als Slave an. Es müsste auf allen AVRs der Mega-Reihe funktionieren, die über eine TWI-Schnittstelle verfügen. &lt;br /&gt;
&lt;br /&gt;
Das System ist als eine Art Dualport-RAM konzipiert, Master und Slave teilen sich also einen Speicherbereich und können darüber Daten austauschen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Master ==&lt;br /&gt;
Ein Testprogramm für den Master. Es wird die [http://homepage.hispeed.ch/peterfleury/avr-software.html#libs I2C-Master-Bibliothek von Peter Fleury] verwendet.&lt;br /&gt;
Es wird geprüft, ob der Slave bereit ist, dann werden drei Bytes erst in den Slave geschrieben, und anschließend wieder ausgelesen.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// I2C-Master-Routinen von Peter Fleury verwenden &lt;br /&gt;
// siehe http://homepage.hispeed.ch/peterfleury/avr-software.html#libs&lt;br /&gt;
// Hier sind auch die Datein: i2cmaster.h und twimaster.c zu finden, die benötigt werden&lt;br /&gt;
// (wer mit AVR-Studio arbeitet braucht nur diese Datein)&lt;br /&gt;
// Letztes Update des Codes 5. April 2010 durch HannoHupmann&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;quot;i2cmaster.h&amp;quot;  &lt;br /&gt;
#define SLAVE_ADRESSE 0x50&lt;br /&gt;
&lt;br /&gt;
uint8_t byte1 = 42;&lt;br /&gt;
uint8_t byte2 = 43;&lt;br /&gt;
uint8_t byte3 = 44;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  i2c_init();         // init I2C interface&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if(!(i2c_start(SLAVE_ADRESSE+I2C_WRITE))) //Slave bereit zum schreiben?&lt;br /&gt;
{&lt;br /&gt;
  i2c_write(0x00);  // Buffer Startadresse setzen 	&lt;br /&gt;
  i2c_write(byte1); // Drei Bytes schreiben...&lt;br /&gt;
  i2c_write(byte2); &lt;br /&gt;
  i2c_write(byte3); &lt;br /&gt;
  i2c_stop();       // Zugriff beenden&lt;br /&gt;
}&lt;br /&gt;
else&lt;br /&gt;
{&lt;br /&gt;
  /* Hier könnte eine Fehlermeldung ausgegeben werden... */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if(!(i2c_start(SLAVE_ADRESSE+I2C_WRITE))) //Slave bereit zum lesen?&lt;br /&gt;
{&lt;br /&gt;
  i2c_write(0x00); //Buffer Startadresse zum Auslesen&lt;br /&gt;
  i2c_rep_start(SLAVE_ADRESSE+I2C_READ); //Lesen beginnen&lt;br /&gt;
&lt;br /&gt;
  byte1= i2c_readAck(); // Bytes lesen...&lt;br /&gt;
  byte2= i2c_readAck();&lt;br /&gt;
  byte3= i2c_readNak(); // letztes Byte lesen, darum kein ACK&lt;br /&gt;
  i2c_stop();           // Zugriff beenden&lt;br /&gt;
} &lt;br /&gt;
else&lt;br /&gt;
{&lt;br /&gt;
  /* Hier könnte eine Fehlermeldung ausgegeben werden... */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if ((byte1 != 42)||(byte2 != 43)||(byte3 != 44))&lt;br /&gt;
{&lt;br /&gt;
  /* Die Bytes wurden nicht korrekt übertragen und wieder gelesen! */ &lt;br /&gt;
}&lt;br /&gt;
    for(;;);	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Code wurde von mir getestet und funktioniert auf einem Mega32&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Code sollte ohne Probleme kompiliert werden, eventuell fehlen die oben genannten Datein wenn es nicht klappt. &lt;br /&gt;
&lt;br /&gt;
== Slave == &lt;br /&gt;
Hier soll nun der Code behandelt werden der für den Slave-Controller notwendig ist. Der vorgestellte Code schreibt die Register des Slaves an die Serielle Schnittstelle, mit einem Terminal Programm kann man sich die Ausgabe ansehen und überprüfen ob alles korrekt funktioniert. &lt;br /&gt;
Der Code ist wieder an den von Peter Fleury angelehnt.&lt;br /&gt;
&lt;br /&gt;
== Slave Testprogramm ==&lt;br /&gt;
Ein Testprogramm für den Slave. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
Testprogramm für den Slave &lt;br /&gt;
Der Buffer wird mit Werten gefüllt. Dann wird er fortlaufend über die serielle Schnittstelle ausgegeben.&lt;br /&gt;
*/&lt;br /&gt;
#include &amp;lt;util/twi.h&amp;gt; 		//enthält z.B. die Bezeichnungen für die Statuscodes in TWSR&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;  //dient zur Behandlung der Interrupts&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt; 		//definiert den Datentyp uint8_t&lt;br /&gt;
#include &amp;quot;twislave.h&amp;quot;&lt;br /&gt;
#include &amp;quot;uart.h&amp;quot;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#define BAUD 9600 //Baudrate&lt;br /&gt;
#define SLAVE_ADRESSE 0x50 //Die Slave-Adresse&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
volatile uint8_t i2cdata[i2c_buffer_size+1];&lt;br /&gt;
volatile uint8_t buffer_adr; 					//&amp;quot;Adressregister&amp;quot; für den Buffer&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*Initaliserung des TWI-Inteface. Muss zu Beginn aufgerufen werden, sowie bei einem Wechsel der Slave Adresse&lt;br /&gt;
Parameter adr: gewünschte Slave-Adresse&lt;br /&gt;
*/&lt;br /&gt;
void init_twi_slave(uint8_t adr)&lt;br /&gt;
{&lt;br /&gt;
	TWAR= adr; //Adresse setzen&lt;br /&gt;
	TWCR &amp;amp;= ~(1&amp;lt;&amp;lt;TWSTA)|(1&amp;lt;&amp;lt;TWSTO);&lt;br /&gt;
	TWCR|= (1&amp;lt;&amp;lt;TWEA) | (1&amp;lt;&amp;lt;TWEN)|(1&amp;lt;&amp;lt;TWIE); 	&lt;br /&gt;
	buffer_adr=0xFF;  &lt;br /&gt;
	sei();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Je nach Statuscode in TWSR müssen verschiedene Bitmuster in TWCR geschreiben werden(siehe Tabellen im Datenblatt!). &lt;br /&gt;
//Makros für die verwendeten Bitmuster:&lt;br /&gt;
&lt;br /&gt;
//ACK nach empfangenen Daten senden/ ACK nach gesendeten Daten erwarten&lt;br /&gt;
#define TWCR_ACK TWCR = (1&amp;lt;&amp;lt;TWEN)|(1&amp;lt;&amp;lt;TWIE)|(1&amp;lt;&amp;lt;TWINT)|(1&amp;lt;&amp;lt;TWEA)|(0&amp;lt;&amp;lt;TWSTA)|(0&amp;lt;&amp;lt;TWSTO)|(0&amp;lt;&amp;lt;TWWC);  &lt;br /&gt;
&lt;br /&gt;
//NACK nach empfangenen Daten senden/ NACK nach gesendeten Daten erwarten     &lt;br /&gt;
#define TWCR_NACK TWCR = (1&amp;lt;&amp;lt;TWEN)|(1&amp;lt;&amp;lt;TWIE)|(1&amp;lt;&amp;lt;TWINT)|(0&amp;lt;&amp;lt;TWEA)|(0&amp;lt;&amp;lt;TWSTA)|(0&amp;lt;&amp;lt;TWSTO)|(0&amp;lt;&amp;lt;TWWC);&lt;br /&gt;
&lt;br /&gt;
//switched to the non adressed slave mode...&lt;br /&gt;
#define TWCR_RESET TWCR = (1&amp;lt;&amp;lt;TWEN)|(1&amp;lt;&amp;lt;TWIE)|(1&amp;lt;&amp;lt;TWINT)|(1&amp;lt;&amp;lt;TWEA)|(0&amp;lt;&amp;lt;TWSTA)|(0&amp;lt;&amp;lt;TWSTO)|(0&amp;lt;&amp;lt;TWWC);  &lt;br /&gt;
//Die Bitmuster für TWCR_ACK und TWCR_RESET sind gleich. Dies ist kein Fehler und dient nur der Übersicht!&lt;br /&gt;
&lt;br /&gt;
/*ISR, die bei einem Ereignis auf dem Bus ausgelöst wird. Im Register TWSR befindet sich dann &lt;br /&gt;
ein Statuscode, anhand dessen die Situation festgestellt werden kann.&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ISR (TWI_vect)  &lt;br /&gt;
{&lt;br /&gt;
	uint8_t data=0;&lt;br /&gt;
	switch (TW_STATUS) //TWI-Statusregister prüfen und nötige Aktion bestimmen &lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
// Slave Receiver &lt;br /&gt;
&lt;br /&gt;
	case TW_SR_SLA_ACK: // 0x60 Slave Receiver, Slave wurde adressiert	&lt;br /&gt;
	     TWCR_ACK; // nächstes Datenbyte empfangen, ACK danach senden&lt;br /&gt;
		 buffer_adr=0xFF; //Bufferposition ist undefiniert&lt;br /&gt;
		 break;&lt;br /&gt;
	&lt;br /&gt;
	case TW_SR_DATA_ACK: // 0x80 Slave Receiver, ein Datenbyte wurde empfangen&lt;br /&gt;
	 	 data=TWDR; //Empfangene Daten auslesen&lt;br /&gt;
		 if (buffer_adr == 0xFF) //erster Zugriff, Bufferposition setzen&lt;br /&gt;
			{&lt;br /&gt;
			//Kontrolle ob gewünschte Adresse im erlaubten bereich&lt;br /&gt;
			if(data&amp;lt;i2c_buffer_size)&lt;br /&gt;
				{&lt;br /&gt;
					buffer_adr= data; //Bufferposition wie adressiert setzen&lt;br /&gt;
				}&lt;br /&gt;
			else&lt;br /&gt;
				{&lt;br /&gt;
					buffer_adr=0; //Adresse auf Null setzen. Ist das sinnvoll? TO DO!&lt;br /&gt;
				}				&lt;br /&gt;
			TWCR_ACK;	// nächstes Datenbyte empfangen, ACK danach, um nächstes Byte anzufordern&lt;br /&gt;
		 }&lt;br /&gt;
		 else //weiterer Zugriff, nachdem die Position im Buffer gesetzt wurde. NUn die Daten empfangen und speichern&lt;br /&gt;
		 {&lt;br /&gt;
		&lt;br /&gt;
			if(buffer_adr&amp;lt;i2c_buffer_size)&lt;br /&gt;
				{&lt;br /&gt;
					//if(!I2C_reg_Schreibschutz[buffer_adr]) //Wenn Position nicht schreibgeschützt...&lt;br /&gt;
						i2cdata[buffer_adr]=data; 			//...dann Daten in Buffer schreibe&lt;br /&gt;
						&lt;br /&gt;
						&lt;br /&gt;
				}&lt;br /&gt;
			buffer_adr++; //Buffer-Adresse weiterzählen für nächsten Schreibzugriff&lt;br /&gt;
			TWCR_ACK;	&lt;br /&gt;
		 }&lt;br /&gt;
		break;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Slave transmitter&lt;br /&gt;
&lt;br /&gt;
		case TW_ST_SLA_ACK: //0xA8 Slave wurde im Lesemodus adressiert und hat ein ACK zurückgegeben.&lt;br /&gt;
	//Hier steht kein break! Es wird also der folgende Code ebenfalls ausgeführt!&lt;br /&gt;
	&lt;br /&gt;
		case TW_ST_DATA_ACK: //0xB8 Slave Transmitter, Daten wurden angefordert&lt;br /&gt;
			if (buffer_adr == 0xFF) //zuvor keine Leseadresse angegeben! &lt;br /&gt;
			{&lt;br /&gt;
			buffer_adr=0;&lt;br /&gt;
			}	&lt;br /&gt;
		&lt;br /&gt;
			if(buffer_adr&amp;lt;i2c_buffer_size)	&lt;br /&gt;
			{&lt;br /&gt;
			TWDR = i2cdata[buffer_adr]; //Datenbyte senden&lt;br /&gt;
			buffer_adr++; //bufferadresse für nächstes Byte weiterzählen&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
			TWDR=0; //Kein Daten mehr im Buffer&lt;br /&gt;
			}&lt;br /&gt;
			TWCR_ACK;&lt;br /&gt;
		break;&lt;br /&gt;
&lt;br /&gt;
	case TW_ST_DATA_NACK: // 0xC0 Keine Daten mehr gefordert &lt;br /&gt;
	case TW_SR_DATA_NACK: // 0x88 &lt;br /&gt;
	case TW_ST_LAST_DATA: // 0xC8  Last data byte in TWDR has been transmitted (TWEA = “0”); ACK has been received&lt;br /&gt;
	case TW_SR_STOP:      // 0xA0 STOP empfangen&lt;br /&gt;
	default: 	&lt;br /&gt;
    TWCR_RESET;&lt;br /&gt;
	break;&lt;br /&gt;
	} //end.switch (TW_STATUS)&lt;br /&gt;
} //end.ISR(TWI_vect)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void warte (int loop)  //loop: wartezeit in ms &lt;br /&gt;
{&lt;br /&gt;
	int i;&lt;br /&gt;
	for(i=0;i&amp;lt;loop;i++) _delay_ms(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main (void)&lt;br /&gt;
{&lt;br /&gt;
//TWI als Slave mit Adresse slaveadr starten&lt;br /&gt;
init_twi_slave(SLAVE_ADRESSE);&lt;br /&gt;
&lt;br /&gt;
//i2cdatamit Werten füllen, die der Master auslesen und ändern kann&lt;br /&gt;
for(uint8_t i=0;i&amp;lt;i2c_buffer_size;i++)&lt;br /&gt;
	{&lt;br /&gt;
		i2cdata[i]=10+i;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
//Serielle Schnittstelle aktivieren&lt;br /&gt;
uart_init((UART_BAUD_SELECT((BAUD),F_CPU)));&lt;br /&gt;
uart_puts(&amp;quot;I2C-Test\r\n&amp;quot;);&lt;br /&gt;
uart_puts(&amp;quot;Teste I2C-Slave mit Adresse &amp;quot;); uart_puti(SLAVE_ADRESSE);&lt;br /&gt;
uart_puts(&amp;quot;\r\n&amp;quot;);&lt;br /&gt;
uart_puts(&amp;quot;\r\n&amp;quot;); //Leerzeile&lt;br /&gt;
&lt;br /&gt;
//in einer Endlosschleife den Inhalt der Buffer ausgeben&lt;br /&gt;
while(1) &lt;br /&gt;
{&lt;br /&gt;
	uart_puts(&amp;quot;i2cdata:\r\n&amp;quot;);&lt;br /&gt;
	for(uint8_t i=0;i&amp;lt;i2c_buffer_size;i++)&lt;br /&gt;
		{&lt;br /&gt;
			uart_puti(i2cdata[i]);&lt;br /&gt;
			uart_puts(&amp;quot;\r\n&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	uart_puts(&amp;quot;\r\n&amp;quot;);//leerzeile&lt;br /&gt;
warte(500);&lt;br /&gt;
} //end.while&lt;br /&gt;
} //end.main&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Slave sourcecode ==&lt;br /&gt;
Die twislave.c für den Slave. Stand: 5.4.2010 &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;util/twi.h&amp;gt; 		//enthält z.B. die Bezeichnungen für die Statuscodes in TWSR&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;  //dient zur Behandlung der Interrupts&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt; 		//definiert den Datentyp uint8_t&lt;br /&gt;
#include &amp;quot;twislave.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
//%%%%%%%% Globale Variablen, die vom Hauptprogramm genutzt werden %%%%%%%%&lt;br /&gt;
/*Der Buffer, in dem die Daten gespeichert werden. &lt;br /&gt;
Aus Sicht des Masters läuft der Zugrif auf den Buffer genau wie bei einem I2C-EEPROm ab.&lt;br /&gt;
Für den Slave ist es eine globale Variable&lt;br /&gt;
*/&lt;br /&gt;
volatile uint8_t i2cdata[i2c_buffer_size+1];&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
volatile uint8_t buffer_adr; //&amp;quot;Adressregister&amp;quot; für den Buffer&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*Initaliserung des TWI-Inteface. Muss zu Beginn aufgerufen werden, sowie bei einem Wechsel der Slave Adresse&lt;br /&gt;
Parameter adr: gewünschte Slave-Adresse&lt;br /&gt;
*/&lt;br /&gt;
void init_twi_slave(uint8_t adr)&lt;br /&gt;
{&lt;br /&gt;
	TWAR= adr; //Adresse setzen&lt;br /&gt;
	TWCR &amp;amp;= ~(1&amp;lt;&amp;lt;TWSTA)|(1&amp;lt;&amp;lt;TWSTO);&lt;br /&gt;
	TWCR|= (1&amp;lt;&amp;lt;TWEA) | (1&amp;lt;&amp;lt;TWEN)|(1&amp;lt;&amp;lt;TWIE); 	&lt;br /&gt;
	buffer_adr=0xFF;  &lt;br /&gt;
	sei();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Je nach Statuscode in TWSR müssen verschiedene Bitmuster in TWCR geschreiben werden(siehe Tabellen im Datenblatt!). &lt;br /&gt;
//Makros für die verwendeten Bitmuster:&lt;br /&gt;
&lt;br /&gt;
//ACK nach empfangenen Daten senden/ ACK nach gesendeten Daten erwarten&lt;br /&gt;
#define TWCR_ACK TWCR = (1&amp;lt;&amp;lt;TWEN)|(1&amp;lt;&amp;lt;TWIE)|(1&amp;lt;&amp;lt;TWINT)|(1&amp;lt;&amp;lt;TWEA)|(0&amp;lt;&amp;lt;TWSTA)|(0&amp;lt;&amp;lt;TWSTO)|(0&amp;lt;&amp;lt;TWWC);  &lt;br /&gt;
&lt;br /&gt;
//NACK nach empfangenen Daten senden/ NACK nach gesendeten Daten erwarten     &lt;br /&gt;
#define TWCR_NACK TWCR = (1&amp;lt;&amp;lt;TWEN)|(1&amp;lt;&amp;lt;TWIE)|(1&amp;lt;&amp;lt;TWINT)|(0&amp;lt;&amp;lt;TWEA)|(0&amp;lt;&amp;lt;TWSTA)|(0&amp;lt;&amp;lt;TWSTO)|(0&amp;lt;&amp;lt;TWWC);&lt;br /&gt;
&lt;br /&gt;
//switched to the non adressed slave mode...&lt;br /&gt;
#define TWCR_RESET TWCR = (1&amp;lt;&amp;lt;TWEN)|(1&amp;lt;&amp;lt;TWIE)|(1&amp;lt;&amp;lt;TWINT)|(1&amp;lt;&amp;lt;TWEA)|(0&amp;lt;&amp;lt;TWSTA)|(0&amp;lt;&amp;lt;TWSTO)|(0&amp;lt;&amp;lt;TWWC);  &lt;br /&gt;
//Die Bitmuster für TWCR_ACK und TWCR_RESET sind gleich. Dies ist kein Fehler und dient nur der Übersicht!&lt;br /&gt;
&lt;br /&gt;
/*ISR, die bei einem Ereignis auf dem Bus ausgelöst wird. Im Register TWSR befindet sich dann &lt;br /&gt;
ein Statuscode, anhand dessen die Situation festgestellt werden kann.&lt;br /&gt;
*/&lt;br /&gt;
ISR (TWI_vect)  &lt;br /&gt;
{&lt;br /&gt;
uint8_t data=0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
switch (TW_STATUS) //TWI-Statusregister prüfen und nötige Aktion bestimmen &lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
// Slave Receiver &lt;br /&gt;
&lt;br /&gt;
case TW_SR_SLA_ACK: // 0x60 Slave Receiver, Slave wurde adressiert	&lt;br /&gt;
	TWCR_ACK; // nächstes Datenbyte empfangen, ACK danach senden&lt;br /&gt;
	buffer_adr=0xFF; //Bufferposition ist undefiniert&lt;br /&gt;
break;&lt;br /&gt;
	&lt;br /&gt;
case TW_SR_DATA_ACK: // 0x80 Slave Receiver, ein Datenbyte wurde empfangen&lt;br /&gt;
	data=TWDR; //Empfangene Daten auslesen&lt;br /&gt;
	if (buffer_adr == 0xFF) //erster Zugriff, Bufferposition setzen&lt;br /&gt;
		{&lt;br /&gt;
			//Kontrolle ob gewünschte Adresse im erlaubten bereich&lt;br /&gt;
			if(data&amp;lt;i2c_buffer_size)&lt;br /&gt;
				{&lt;br /&gt;
					buffer_adr= data; //Bufferposition wie adressiert setzen&lt;br /&gt;
				}&lt;br /&gt;
			else&lt;br /&gt;
				{&lt;br /&gt;
					buffer_adr=0; //Adresse auf Null setzen. Ist das sinnvoll? TO DO!&lt;br /&gt;
				}				&lt;br /&gt;
			TWCR_ACK;	// nächstes Datenbyte empfangen, ACK danach, um nächstes Byte anzufordern&lt;br /&gt;
		}&lt;br /&gt;
	else //weiterer Zugriff, nachdem die Position im Buffer gesetzt wurde. NUn die Daten empfangen und speichern&lt;br /&gt;
		{&lt;br /&gt;
		&lt;br /&gt;
			if(buffer_adr&amp;lt;i2c_buffer_size)&lt;br /&gt;
				{&lt;br /&gt;
					if(!I2C_reg_Schreibschutz[buffer_adr]) //Wenn Position nicht schreibgeschützt...&lt;br /&gt;
						i2cdata[buffer_adr]=data; 			//...dann Daten in Buffer schreibe&lt;br /&gt;
						&lt;br /&gt;
						&lt;br /&gt;
				}&lt;br /&gt;
			buffer_adr++; //Buffer-Adresse weiterzählen für nächsten Schreibzugriff&lt;br /&gt;
			TWCR_ACK;	&lt;br /&gt;
		}&lt;br /&gt;
break;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Slave transmitter&lt;br /&gt;
&lt;br /&gt;
case TW_ST_SLA_ACK: //0xA8 Slave wurde im Lesemodus adressiert und hat ein ACK zurückgegeben.&lt;br /&gt;
	//Hier steht kein break! Es wird also der folgende Code ebenfalls ausgeführt!&lt;br /&gt;
	&lt;br /&gt;
case TW_ST_DATA_ACK: //0xB8 Slave Transmitter, Daten wurden angefordert&lt;br /&gt;
&lt;br /&gt;
	if (buffer_adr == 0xFF) //zuvor keine Leseadresse angegeben! &lt;br /&gt;
		{&lt;br /&gt;
			buffer_adr=0;&lt;br /&gt;
		}	&lt;br /&gt;
		&lt;br /&gt;
	if(buffer_adr&amp;lt;i2c_buffer_size)	&lt;br /&gt;
		{&lt;br /&gt;
			TWDR = i2cdata[buffer_adr]; //Datenbyte senden&lt;br /&gt;
			buffer_adr++; //bufferadresse für nächstes Byte weiterzählen&lt;br /&gt;
		}&lt;br /&gt;
	else&lt;br /&gt;
		{&lt;br /&gt;
			TWDR=0; //Kein Daten mehr im Buffer&lt;br /&gt;
		}&lt;br /&gt;
	TWCR_ACK;&lt;br /&gt;
break;&lt;br /&gt;
&lt;br /&gt;
case TW_ST_DATA_NACK: // 0xC0 Keine Daten mehr gefordert &lt;br /&gt;
case TW_SR_DATA_NACK: // 0x88 &lt;br /&gt;
case TW_ST_LAST_DATA: // 0xC8  Last data byte in TWDR has been transmitted (TWEA = “0”); ACK has been received&lt;br /&gt;
case TW_SR_STOP:      // 0xA0 STOP empfangen&lt;br /&gt;
default: 	&lt;br /&gt;
    TWCR_RESET;&lt;br /&gt;
break;&lt;br /&gt;
	&lt;br /&gt;
} //end.switch (TW_STATUS)&lt;br /&gt;
} //end.ISR(TWI_vect)&lt;br /&gt;
&lt;br /&gt;
////Ende von twislave.c////&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Slave header ==&lt;br /&gt;
Die zugehörige Headerdatei twislave.h für den Slave. Stand: 19.2.2010&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#ifndef _TWISLAVE_H&lt;br /&gt;
#define _TWISLAVE_H&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;util/twi.h&amp;gt; 		  //enthaelt z.B. die Bezeichnungen fuer die Statuscodes in TWSR&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;  //dient zur behandlung der Interrupts&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt; 		    //definiert den Datentyp uint8_t&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 *  @defgroup twislave TWI-Slave&lt;br /&gt;
 *  @code #include &amp;quot;twislave.h&amp;quot; @endcode&lt;br /&gt;
 * &lt;br /&gt;
 *  @brief Betrieb eines AVRs mit Hardware-TWI-Schnittstelle als Slave.&lt;br /&gt;
 *  Zu Beginn muss init_twi_slave mit der gewuenschten Slave-Adresse als&lt;br /&gt;
 *  Parameter aufgerufen werden.&lt;br /&gt;
 *&lt;br /&gt;
 * Der Datenaustausch mit dem Master erfolgt ueber den Buffer i2cdata, &lt;br /&gt;
 * auf den von Master und Slave zugegriffen werden kann. &lt;br /&gt;
 * Dies ist fuer den Slave eine globale Variable (Array aus uint8_t). &lt;br /&gt;
&lt;br /&gt;
 * Der Zugriff durch den Master erfolgt aehnlich wie bei einem&lt;br /&gt;
 * normalen I2C-EEPROM.&lt;br /&gt;
 * Man sendet zunaechst die Bufferposition, an die man schreiben will,&lt;br /&gt;
 * und dann die Daten. &lt;br /&gt;
 * Die Bufferposition wird automatisch hochgezaehlt, sodass man mehrere&lt;br /&gt;
 * Datenbytes hintereinander schreiben kann, ohne jedesmal die &lt;br /&gt;
 * Bufferadresse zu schreiben.&lt;br /&gt;
 *&lt;br /&gt;
 * Um vom Master aus zu lesen, uebertraegt man zunaechst in einem &lt;br /&gt;
 * Schreibzugriff die gewuenschte Bufferposition und liest dann nach&lt;br /&gt;
 * einem repeated start die Daten aus. Die Bufferposition wird &lt;br /&gt;
 * automatisch hochgezaehlt, sodass man mehrere Datenbytes&lt;br /&gt;
 * hintereinander lesen kann, ohne jedesmal die Bufferposition zu&lt;br /&gt;
 * schreiben.&lt;br /&gt;
 *&lt;br /&gt;
 * Abgefangene Fehlbedienung durch den Master:&lt;br /&gt;
 * - Lesen ueber die Grenze des txbuffers hinaus&lt;br /&gt;
 * - Schreiben ueber die Grenzen des rxbuffers hinaus&lt;br /&gt;
 * - Angabe einer ungueltigen Schreib/Lese-Adresse&lt;br /&gt;
 * - Lesezugriff, ohne vorher Leseadresse geschrieben zu haben&lt;br /&gt;
 * &lt;br /&gt;
 *  @author uwegw&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*@{*/&lt;br /&gt;
&lt;br /&gt;
//%%%%%%%% von Benutzer konfigurierbare Einstellungen %%%%%%%%&lt;br /&gt;
/**@brief Groesse des Buffers in Byte (2..254) */&lt;br /&gt;
#define i2c_buffer_size 10// I2C_REG_ANZAHL 254 Hier kann eingestellt werden wieviele Register ausgegeben werden&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//%%%%%%%% Globale Variablen, die vom Hauptprogramm genutzt werden %%%%%%%%&lt;br /&gt;
/**@brief Der Buffer, in dem die Daten gespeichert werden.&lt;br /&gt;
 * Aus Sicht des Masters laeuft der Zugrif auf den Buffer genau wie&lt;br /&gt;
 *  bei einem I2C-EEPROm ab.&lt;br /&gt;
 * Fuer den Slave ist es eine globale Variable&lt;br /&gt;
*/&lt;br /&gt;
volatile uint8_t i2cdata[i2c_buffer_size+1];&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**@brief Initaliserung des TWI-Inteface. Muss zu Beginn aufgerufen werden, sowie bei einem Wechsel der Slave Adresse&lt;br /&gt;
 * @param adr gewuenschte Slave-Adresse */&lt;br /&gt;
void init_twi_slave(uint8_t adr);&lt;br /&gt;
&lt;br /&gt;
//%%%%%%%% ab hier sind normalerweise keine weiteren Aenderungen erforderlich! %%%%%%%%//&lt;br /&gt;
//____________________________________________________________________________________//&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Bei zu alten AVR-GCC-Versionen werden die Interrupts anders genutzt, daher in diesem Fall mit Fehlermeldung abbrechen&lt;br /&gt;
#if (__GNUC__ * 100 + __GNUC_MINOR__) &amp;lt; 304&lt;br /&gt;
	#error &amp;quot;This library requires AVR-GCC 3.4.5 or later, update to newer AVR-GCC compiler !&amp;quot;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
//Schutz vor unsinnigen Buffergroessen&lt;br /&gt;
#if (i2c_buffer_size &amp;gt; 254)&lt;br /&gt;
	#error Buffer zu gross gewaehlt! Maximal 254 Bytes erlaubt.&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#if (i2c_buffer_size &amp;lt; 2)&lt;br /&gt;
	#error Buffer muss mindestens zwei Byte gross sein!&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#endif //#ifdef _TWISLAVE_H&lt;br /&gt;
////Ende von twislave.h////&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Microcontroller]]&lt;br /&gt;
[[Kategorie:Quellcode C]]&lt;/div&gt;</summary>
		<author><name>HannoHupmann</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=TWI_Slave_mit_avr-gcc&amp;diff=16174</id>
		<title>TWI Slave mit avr-gcc</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=TWI_Slave_mit_avr-gcc&amp;diff=16174"/>
				<updated>2010-04-05T16:47:49Z</updated>
		
		<summary type="html">&lt;p&gt;HannoHupmann: /* Master */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Programm für einen AVR mit [[TWI]] (Hardware-[[I2C]])-Schnittstelle als Slave.&lt;br /&gt;
Manchmal stellt sich die Aufgabe, mehrere AVRs per [[I2C]] zu vernetzen. Ein Beispiel ist die Erweiterung eines bestehenden Systems um einen leistungsstärkeren Controller. Dies ist etwa beim [[Asuro]] oder [[Yeti]] denkbar, um z.B. mehr Ein/Ausgänge oder Speicherplatz zu bekommen.&lt;br /&gt;
&lt;br /&gt;
Man kann aber beim Bau eines Roboters auch von Anfang an auf ein System von mehreren vernetzten Controllern setzen. So kann man verschiedene Aufgabe, die weitgehend unabhängig voneinader gleichzeitg erledigt werden müssen, besser verteilen. Denkbar ist z.B. ein Controller für die Motorsteuerung, einer für die Sensorik, einer für Ein-und Ausgabe (wie LCD und Bedientaster),... , und ein zentraler Controller, der die Richtung vorgibt und alle anderen Controller mit Befehlen versorgt. Ein konkretes Beispiel ist der Roboterbausatz Nibo (siehe: [http://www.nicai-systems.de/nibo.html]) von nicai-systems, der einen Atmel ATmega128 als Hauptcontroller und zwei Atmel ATtiny44 als Controller für die Motorsteuerung und die IR-Sensorik einsetzt. Die Kommunikation läuft mit 400 kHz über den I2C-Bus mit dem ATmega128 als Master.&lt;br /&gt;
&lt;br /&gt;
Schließlich kann ein entsprechend programmierter AVR auch als Ersatz für handelsübliche I2C-Bauteile dienen. Der kleinste AVR mit Hardware-I2C, der ATmega48, ist mit 1,30€ (Reichelt) billiger als viele normale I2C-ICs. Er kann bei entsprechender Programmierung z.B. die Aufgaben von zwei PCF8574 (8bit-Portexpander, 1,25€) und einem PCF8591 (4fach AD-Wandler, 2,35€) übernehmen und außerdem noch als I2C-EEPROM mit 256 Bytes dienen. &lt;br /&gt;
&lt;br /&gt;
Das folgende Programm (twislave.c) steuert das TWI (Hardware-I2C)-Interface eines AVRs als Slave an. Es müsste auf allen AVRs der Mega-Reihe funktionieren, die über eine TWI-Schnittstelle verfügen. &lt;br /&gt;
&lt;br /&gt;
Das System ist als eine Art Dualport-RAM konzipiert, Master und Slave teilen sich also einen Speicherbereich und können darüber Daten austauschen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Master ==&lt;br /&gt;
Ein Testprogramm für den Master. Es wird die [http://homepage.hispeed.ch/peterfleury/avr-software.html#libs I2C-Master-Bibliothek von Peter Fleury] verwendet.&lt;br /&gt;
Es wird geprüft, ob der Slave bereit ist, dann werden drei Bytes erst in den Slave geschrieben, und anschließend wieder ausgelesen.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// I2C-Master-Routinen von Peter Fleury verwenden &lt;br /&gt;
// siehe http://homepage.hispeed.ch/peterfleury/avr-software.html#libs&lt;br /&gt;
// Hier sind auch die Datein: i2cmaster.h und twimaster.c zu finden, die benötigt werden&lt;br /&gt;
// (wer mit AVR-Studio arbeitet braucht nur diese Datein)&lt;br /&gt;
// Letztes Update des Codes 5. April 2010 durch HannoHupmann&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;quot;i2cmaster.h&amp;quot;  &lt;br /&gt;
#define SLAVE_ADRESSE 0x50&lt;br /&gt;
&lt;br /&gt;
uint8_t byte1 = 42;&lt;br /&gt;
uint8_t byte2 = 43;&lt;br /&gt;
uint8_t byte3 = 44;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  i2c_init();         // init I2C interface&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if(!(i2c_start(SLAVE_ADRESSE+I2C_WRITE))) //Slave bereit zum schreiben?&lt;br /&gt;
{&lt;br /&gt;
  i2c_write(0x00);  // Buffer Startadresse setzen 	&lt;br /&gt;
  i2c_write(byte1); // Drei Bytes schreiben...&lt;br /&gt;
  i2c_write(byte2); &lt;br /&gt;
  i2c_write(byte3); &lt;br /&gt;
  i2c_stop();       // Zugriff beenden&lt;br /&gt;
}&lt;br /&gt;
else&lt;br /&gt;
{&lt;br /&gt;
  /* Hier könnte eine Fehlermeldung ausgegeben werden... */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if(!(i2c_start(SLAVE_ADRESSE+I2C_WRITE))) //Slave bereit zum lesen?&lt;br /&gt;
{&lt;br /&gt;
  i2c_write(0x00); //Buffer Startadresse zum Auslesen&lt;br /&gt;
  i2c_rep_start(SLAVE_ADRESSE+I2C_READ); //Lesen beginnen&lt;br /&gt;
&lt;br /&gt;
  byte1= i2c_readAck(); // Bytes lesen...&lt;br /&gt;
  byte2= i2c_readAck();&lt;br /&gt;
  byte3= i2c_readNak(); // letztes Byte lesen, darum kein ACK&lt;br /&gt;
  i2c_stop();           // Zugriff beenden&lt;br /&gt;
} &lt;br /&gt;
else&lt;br /&gt;
{&lt;br /&gt;
  /* Hier könnte eine Fehlermeldung ausgegeben werden... */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if ((byte1 != 42)||(byte2 != 43)||(byte3 != 44))&lt;br /&gt;
{&lt;br /&gt;
  /* Die Bytes wurden nicht korrekt übertragen und wieder gelesen! */ &lt;br /&gt;
}&lt;br /&gt;
    for(;;);	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Code wurde von mir getestet und funktioniert auf einem Mega32&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Slave sourcecode ==&lt;br /&gt;
Die twislave.c für den Slave. Stand: 19.2.2010&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;util/twi.h&amp;gt; 		//enthält z.B. die Bezeichnungen für die Statuscodes in TWSR&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;  //dient zur Behandlung der Interrupts&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt; 		//definiert den Datentyp uint8_t&lt;br /&gt;
#include &amp;quot;twislave.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
//%%%%%%%% Globale Variablen, die vom Hauptprogramm genutzt werden %%%%%%%%&lt;br /&gt;
/*Der Buffer, in dem die Daten gespeichert werden. &lt;br /&gt;
Aus Sicht des Masters läuft der Zugrif auf den Buffer genau wie bei einem I2C-EEPROm ab.&lt;br /&gt;
Für den Slave ist es eine globale Variable&lt;br /&gt;
*/&lt;br /&gt;
volatile uint8_t i2cdata[i2c_buffer_size+1];&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
volatile uint8_t buffer_adr; //&amp;quot;Adressregister&amp;quot; für den Buffer&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*Initaliserung des TWI-Inteface. Muss zu Beginn aufgerufen werden, sowie bei einem Wechsel der Slave Adresse&lt;br /&gt;
Parameter adr: gewünschte Slave-Adresse&lt;br /&gt;
*/&lt;br /&gt;
void init_twi_slave(uint8_t adr)&lt;br /&gt;
{&lt;br /&gt;
	TWAR= adr; //Adresse setzen&lt;br /&gt;
	TWCR &amp;amp;= ~(1&amp;lt;&amp;lt;TWSTA)|(1&amp;lt;&amp;lt;TWSTO);&lt;br /&gt;
	TWCR|= (1&amp;lt;&amp;lt;TWEA) | (1&amp;lt;&amp;lt;TWEN)|(1&amp;lt;&amp;lt;TWIE); 	&lt;br /&gt;
	buffer_adr=0xFF;  &lt;br /&gt;
	sei();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Je nach Statuscode in TWSR müssen verschiedene Bitmuster in TWCR geschreiben werden(siehe Tabellen im Datenblatt!). &lt;br /&gt;
//Makros für die verwendeten Bitmuster:&lt;br /&gt;
&lt;br /&gt;
//ACK nach empfangenen Daten senden/ ACK nach gesendeten Daten erwarten&lt;br /&gt;
#define TWCR_ACK TWCR = (1&amp;lt;&amp;lt;TWEN)|(1&amp;lt;&amp;lt;TWIE)|(1&amp;lt;&amp;lt;TWINT)|(1&amp;lt;&amp;lt;TWEA)|(0&amp;lt;&amp;lt;TWSTA)|(0&amp;lt;&amp;lt;TWSTO)|(0&amp;lt;&amp;lt;TWWC);  &lt;br /&gt;
&lt;br /&gt;
//NACK nach empfangenen Daten senden/ NACK nach gesendeten Daten erwarten     &lt;br /&gt;
#define TWCR_NACK TWCR = (1&amp;lt;&amp;lt;TWEN)|(1&amp;lt;&amp;lt;TWIE)|(1&amp;lt;&amp;lt;TWINT)|(0&amp;lt;&amp;lt;TWEA)|(0&amp;lt;&amp;lt;TWSTA)|(0&amp;lt;&amp;lt;TWSTO)|(0&amp;lt;&amp;lt;TWWC);&lt;br /&gt;
&lt;br /&gt;
//switched to the non adressed slave mode...&lt;br /&gt;
#define TWCR_RESET TWCR = (1&amp;lt;&amp;lt;TWEN)|(1&amp;lt;&amp;lt;TWIE)|(1&amp;lt;&amp;lt;TWINT)|(1&amp;lt;&amp;lt;TWEA)|(0&amp;lt;&amp;lt;TWSTA)|(0&amp;lt;&amp;lt;TWSTO)|(0&amp;lt;&amp;lt;TWWC);  &lt;br /&gt;
//Die Bitmuster für TWCR_ACK und TWCR_RESET sind gleich. Dies ist kein Fehler und dient nur der Übersicht!&lt;br /&gt;
&lt;br /&gt;
/*ISR, die bei einem Ereignis auf dem Bus ausgelöst wird. Im Register TWSR befindet sich dann &lt;br /&gt;
ein Statuscode, anhand dessen die Situation festgestellt werden kann.&lt;br /&gt;
*/&lt;br /&gt;
ISR (TWI_vect)  &lt;br /&gt;
{&lt;br /&gt;
uint8_t data=0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
switch (TW_STATUS) //TWI-Statusregister prüfen und nötige Aktion bestimmen &lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
// Slave Receiver &lt;br /&gt;
&lt;br /&gt;
case TW_SR_SLA_ACK: // 0x60 Slave Receiver, Slave wurde adressiert	&lt;br /&gt;
	TWCR_ACK; // nächstes Datenbyte empfangen, ACK danach senden&lt;br /&gt;
	buffer_adr=0xFF; //Bufferposition ist undefiniert&lt;br /&gt;
break;&lt;br /&gt;
	&lt;br /&gt;
case TW_SR_DATA_ACK: // 0x80 Slave Receiver, ein Datenbyte wurde empfangen&lt;br /&gt;
	data=TWDR; //Empfangene Daten auslesen&lt;br /&gt;
	if (buffer_adr == 0xFF) //erster Zugriff, Bufferposition setzen&lt;br /&gt;
		{&lt;br /&gt;
			//Kontrolle ob gewünschte Adresse im erlaubten bereich&lt;br /&gt;
			if(data&amp;lt;i2c_buffer_size)&lt;br /&gt;
				{&lt;br /&gt;
					buffer_adr= data; //Bufferposition wie adressiert setzen&lt;br /&gt;
				}&lt;br /&gt;
			else&lt;br /&gt;
				{&lt;br /&gt;
					buffer_adr=0; //Adresse auf Null setzen. Ist das sinnvoll? TO DO!&lt;br /&gt;
				}				&lt;br /&gt;
			TWCR_ACK;	// nächstes Datenbyte empfangen, ACK danach, um nächstes Byte anzufordern&lt;br /&gt;
		}&lt;br /&gt;
	else //weiterer Zugriff, nachdem die Position im Buffer gesetzt wurde. NUn die Daten empfangen und speichern&lt;br /&gt;
		{&lt;br /&gt;
		&lt;br /&gt;
			if(buffer_adr&amp;lt;i2c_buffer_size)&lt;br /&gt;
				{&lt;br /&gt;
					if(!I2C_reg_Schreibschutz[buffer_adr]) //Wenn Position nicht schreibgeschützt...&lt;br /&gt;
						i2cdata[buffer_adr]=data; 			//...dann Daten in Buffer schreibe&lt;br /&gt;
						&lt;br /&gt;
						&lt;br /&gt;
				}&lt;br /&gt;
			buffer_adr++; //Buffer-Adresse weiterzählen für nächsten Schreibzugriff&lt;br /&gt;
			TWCR_ACK;	&lt;br /&gt;
		}&lt;br /&gt;
break;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Slave transmitter&lt;br /&gt;
&lt;br /&gt;
case TW_ST_SLA_ACK: //0xA8 Slave wurde im Lesemodus adressiert und hat ein ACK zurückgegeben.&lt;br /&gt;
	//Hier steht kein break! Es wird also der folgende Code ebenfalls ausgeführt!&lt;br /&gt;
	&lt;br /&gt;
case TW_ST_DATA_ACK: //0xB8 Slave Transmitter, Daten wurden angefordert&lt;br /&gt;
&lt;br /&gt;
	if (buffer_adr == 0xFF) //zuvor keine Leseadresse angegeben! &lt;br /&gt;
		{&lt;br /&gt;
			buffer_adr=0;&lt;br /&gt;
		}	&lt;br /&gt;
		&lt;br /&gt;
	if(buffer_adr&amp;lt;i2c_buffer_size)	&lt;br /&gt;
		{&lt;br /&gt;
			TWDR = i2cdata[buffer_adr]; //Datenbyte senden&lt;br /&gt;
			buffer_adr++; //bufferadresse für nächstes Byte weiterzählen&lt;br /&gt;
		}&lt;br /&gt;
	else&lt;br /&gt;
		{&lt;br /&gt;
			TWDR=0; //Kein Daten mehr im Buffer&lt;br /&gt;
		}&lt;br /&gt;
	TWCR_ACK;&lt;br /&gt;
break;&lt;br /&gt;
&lt;br /&gt;
case TW_ST_DATA_NACK: // 0xC0 Keine Daten mehr gefordert &lt;br /&gt;
case TW_SR_DATA_NACK: // 0x88 &lt;br /&gt;
case TW_ST_LAST_DATA: // 0xC8  Last data byte in TWDR has been transmitted (TWEA = “0”); ACK has been received&lt;br /&gt;
case TW_SR_STOP:      // 0xA0 STOP empfangen&lt;br /&gt;
default: 	&lt;br /&gt;
    TWCR_RESET;&lt;br /&gt;
break;&lt;br /&gt;
	&lt;br /&gt;
} //end.switch (TW_STATUS)&lt;br /&gt;
} //end.ISR(TWI_vect)&lt;br /&gt;
&lt;br /&gt;
////Ende von twislave.c////&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Slave header ==&lt;br /&gt;
Die zugehörige Headerdatei twislave.h für den Slave. Stand: 19.2.2010&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#ifndef _TWISLAVE_H&lt;br /&gt;
#define _TWISLAVE_H&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;util/twi.h&amp;gt; 		  //enthaelt z.B. die Bezeichnungen fuer die Statuscodes in TWSR&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;  //dient zur behandlung der Interrupts&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt; 		    //definiert den Datentyp uint8_t&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 *  @defgroup twislave TWI-Slave&lt;br /&gt;
 *  @code #include &amp;quot;twislave.h&amp;quot; @endcode&lt;br /&gt;
 * &lt;br /&gt;
 *  @brief Betrieb eines AVRs mit Hardware-TWI-Schnittstelle als Slave.&lt;br /&gt;
 *  Zu Beginn muss init_twi_slave mit der gewuenschten Slave-Adresse als&lt;br /&gt;
 *  Parameter aufgerufen werden.&lt;br /&gt;
 *&lt;br /&gt;
 * Der Datenaustausch mit dem Master erfolgt ueber den Buffer i2cdata, &lt;br /&gt;
 * auf den von Master und Slave zugegriffen werden kann. &lt;br /&gt;
 * Dies ist fuer den Slave eine globale Variable (Array aus uint8_t). &lt;br /&gt;
&lt;br /&gt;
 * Der Zugriff durch den Master erfolgt aehnlich wie bei einem&lt;br /&gt;
 * normalen I2C-EEPROM.&lt;br /&gt;
 * Man sendet zunaechst die Bufferposition, an die man schreiben will,&lt;br /&gt;
 * und dann die Daten. &lt;br /&gt;
 * Die Bufferposition wird automatisch hochgezaehlt, sodass man mehrere&lt;br /&gt;
 * Datenbytes hintereinander schreiben kann, ohne jedesmal die &lt;br /&gt;
 * Bufferadresse zu schreiben.&lt;br /&gt;
 *&lt;br /&gt;
 * Um vom Master aus zu lesen, uebertraegt man zunaechst in einem &lt;br /&gt;
 * Schreibzugriff die gewuenschte Bufferposition und liest dann nach&lt;br /&gt;
 * einem repeated start die Daten aus. Die Bufferposition wird &lt;br /&gt;
 * automatisch hochgezaehlt, sodass man mehrere Datenbytes&lt;br /&gt;
 * hintereinander lesen kann, ohne jedesmal die Bufferposition zu&lt;br /&gt;
 * schreiben.&lt;br /&gt;
 *&lt;br /&gt;
 * Abgefangene Fehlbedienung durch den Master:&lt;br /&gt;
 * - Lesen ueber die Grenze des txbuffers hinaus&lt;br /&gt;
 * - Schreiben ueber die Grenzen des rxbuffers hinaus&lt;br /&gt;
 * - Angabe einer ungueltigen Schreib/Lese-Adresse&lt;br /&gt;
 * - Lesezugriff, ohne vorher Leseadresse geschrieben zu haben&lt;br /&gt;
 * &lt;br /&gt;
 *  @author uwegw&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*@{*/&lt;br /&gt;
&lt;br /&gt;
//%%%%%%%% von Benutzer konfigurierbare Einstellungen %%%%%%%%&lt;br /&gt;
/**@brief Groesse des Buffers in Byte (2..254) */&lt;br /&gt;
#define i2c_buffer_size 8  //Beispiel: acht Register&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//%%%%%%%% Globale Variablen, die vom Hauptprogramm genutzt werden %%%%%%%%&lt;br /&gt;
/**@brief Der Buffer, in dem die Daten gespeichert werden.&lt;br /&gt;
 * Aus Sicht des Masters laeuft der Zugrif auf den Buffer genau wie&lt;br /&gt;
 *  bei einem I2C-EEPROm ab.&lt;br /&gt;
 * Fuer den Slave ist es eine globale Variable&lt;br /&gt;
*/&lt;br /&gt;
volatile uint8_t i2cdata[i2c_buffer_size+1];&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**@brief Initaliserung des TWI-Inteface. Muss zu Beginn aufgerufen werden, sowie bei einem Wechsel der Slave Adresse&lt;br /&gt;
 * @param adr gewuenschte Slave-Adresse */&lt;br /&gt;
void init_twi_slave(uint8_t adr);&lt;br /&gt;
&lt;br /&gt;
//%%%%%%%% ab hier sind normalerweise keine weiteren Aenderungen erforderlich! %%%%%%%%//&lt;br /&gt;
//____________________________________________________________________________________//&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Bei zu alten AVR-GCC-Versionen werden die Interrupts anders genutzt, daher in diesem Fall mit Fehlermeldung abbrechen&lt;br /&gt;
#if (__GNUC__ * 100 + __GNUC_MINOR__) &amp;lt; 304&lt;br /&gt;
	#error &amp;quot;This library requires AVR-GCC 3.4.5 or later, update to newer AVR-GCC compiler !&amp;quot;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
//Schutz vor unsinnigen Buffergroessen&lt;br /&gt;
#if (i2c_buffer_size &amp;gt; 254)&lt;br /&gt;
	#error Buffer zu gross gewaehlt! Maximal 254 Bytes erlaubt.&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#if (i2c_buffer_size &amp;lt; 2)&lt;br /&gt;
	#error Buffer muss mindestens zwei Byte gross sein!&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/*@}*/&lt;br /&gt;
&lt;br /&gt;
#endif //#ifdef _TWISLAVE_H&lt;br /&gt;
////Ende von twislave.h////&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Slave Testprogramm ==&lt;br /&gt;
Ein Testprogramm für den Slave. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
Testprogramm für die twislave.c&lt;br /&gt;
Der Buffer wird mit Werten gefüllt. Dann wird er fortlaufend über die serielle Schnittstelle ausgegeben.&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;twislave.h&amp;quot;&lt;br /&gt;
#include &amp;quot;uart.c&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#define BAUD 9600 //Baudrate&lt;br /&gt;
#define SLAVE_ADRESSE 0x50 //Die Slave-Adresse&lt;br /&gt;
&lt;br /&gt;
//Funktion für Warteschaleifen&lt;br /&gt;
//Parameter: Wartezeit in Milisekunden&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
void warte (int loop)  //loop: wartezeit in ms &lt;br /&gt;
{&lt;br /&gt;
	int i;&lt;br /&gt;
	for(i=0;i&amp;lt;loop;i++) _delay_ms(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main (void)&lt;br /&gt;
{&lt;br /&gt;
//TWI als Slave mit Adresse slaveadr starten&lt;br /&gt;
init_twi_slave(SLAVE_ADRESSE);&lt;br /&gt;
&lt;br /&gt;
//i2cdatamit Werten füllen, die der Master auslesen und ändern kann&lt;br /&gt;
for(uint8_t i=0;i&amp;lt;buffer_size;i++)&lt;br /&gt;
	{&lt;br /&gt;
		i2cdata[i]=10+i;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
//Serielle Schnittstelle aktivieren&lt;br /&gt;
uart_init((UART_BAUD_SELECT((BAUD),F_CPU)));&lt;br /&gt;
uart_puts(&amp;quot;I2C-Test\r\n&amp;quot;);&lt;br /&gt;
uart_puts(&amp;quot;Teste I2C-Slave mit Adresse &amp;quot;); uart_puti(SLAVE_ADRESSE);&lt;br /&gt;
uart_puts(&amp;quot;\r\n&amp;quot;);&lt;br /&gt;
uart_puts(&amp;quot;\r\n&amp;quot;); //Leerzeile&lt;br /&gt;
&lt;br /&gt;
//in einer Endlosschleife den Inhalt der Buffer ausgeben&lt;br /&gt;
while(1) &lt;br /&gt;
{&lt;br /&gt;
	uart_puts(&amp;quot;i2cdata:\r\n&amp;quot;);&lt;br /&gt;
	for(uint8_t i=0;i&amp;lt;buffer_size;i++)&lt;br /&gt;
		{&lt;br /&gt;
			uart_puti(i2cdata[i]);&lt;br /&gt;
			uart_puts(&amp;quot;\r\n&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	uart_puts(&amp;quot;\r\n&amp;quot;);//leerzeile&lt;br /&gt;
warte(500);&lt;br /&gt;
} //end.while&lt;br /&gt;
} //end.main&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Microcontroller]]&lt;br /&gt;
[[Kategorie:Quellcode C]]&lt;/div&gt;</summary>
		<author><name>HannoHupmann</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=TWI_Slave_mit_avr-gcc&amp;diff=16173</id>
		<title>TWI Slave mit avr-gcc</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=TWI_Slave_mit_avr-gcc&amp;diff=16173"/>
				<updated>2010-04-05T16:47:03Z</updated>
		
		<summary type="html">&lt;p&gt;HannoHupmann: /* Master */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Programm für einen AVR mit [[TWI]] (Hardware-[[I2C]])-Schnittstelle als Slave.&lt;br /&gt;
Manchmal stellt sich die Aufgabe, mehrere AVRs per [[I2C]] zu vernetzen. Ein Beispiel ist die Erweiterung eines bestehenden Systems um einen leistungsstärkeren Controller. Dies ist etwa beim [[Asuro]] oder [[Yeti]] denkbar, um z.B. mehr Ein/Ausgänge oder Speicherplatz zu bekommen.&lt;br /&gt;
&lt;br /&gt;
Man kann aber beim Bau eines Roboters auch von Anfang an auf ein System von mehreren vernetzten Controllern setzen. So kann man verschiedene Aufgabe, die weitgehend unabhängig voneinader gleichzeitg erledigt werden müssen, besser verteilen. Denkbar ist z.B. ein Controller für die Motorsteuerung, einer für die Sensorik, einer für Ein-und Ausgabe (wie LCD und Bedientaster),... , und ein zentraler Controller, der die Richtung vorgibt und alle anderen Controller mit Befehlen versorgt. Ein konkretes Beispiel ist der Roboterbausatz Nibo (siehe: [http://www.nicai-systems.de/nibo.html]) von nicai-systems, der einen Atmel ATmega128 als Hauptcontroller und zwei Atmel ATtiny44 als Controller für die Motorsteuerung und die IR-Sensorik einsetzt. Die Kommunikation läuft mit 400 kHz über den I2C-Bus mit dem ATmega128 als Master.&lt;br /&gt;
&lt;br /&gt;
Schließlich kann ein entsprechend programmierter AVR auch als Ersatz für handelsübliche I2C-Bauteile dienen. Der kleinste AVR mit Hardware-I2C, der ATmega48, ist mit 1,30€ (Reichelt) billiger als viele normale I2C-ICs. Er kann bei entsprechender Programmierung z.B. die Aufgaben von zwei PCF8574 (8bit-Portexpander, 1,25€) und einem PCF8591 (4fach AD-Wandler, 2,35€) übernehmen und außerdem noch als I2C-EEPROM mit 256 Bytes dienen. &lt;br /&gt;
&lt;br /&gt;
Das folgende Programm (twislave.c) steuert das TWI (Hardware-I2C)-Interface eines AVRs als Slave an. Es müsste auf allen AVRs der Mega-Reihe funktionieren, die über eine TWI-Schnittstelle verfügen. &lt;br /&gt;
&lt;br /&gt;
Das System ist als eine Art Dualport-RAM konzipiert, Master und Slave teilen sich also einen Speicherbereich und können darüber Daten austauschen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Master ==&lt;br /&gt;
Ein Codeschnipsel für den Master. Es wird die [http://homepage.hispeed.ch/peterfleury/avr-software.html#libs I2C-Master-Bibliothek von Peter Fleury] verwendet.&lt;br /&gt;
Es wird geprüft, ob der Slave bereit ist, dann werden drei Bytes erst in den Slave geschrieben, und anschließend wieder ausgelesen.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// I2C-Master-Routinen von Peter Fleury verwenden &lt;br /&gt;
// siehe http://homepage.hispeed.ch/peterfleury/avr-software.html#libs&lt;br /&gt;
// Hier sind auch die Datein: i2cmaster.h und twimaster.c zu finden, die benötigt werden&lt;br /&gt;
// (wer mit AVR-Studio arbeitet braucht nur diese Datein)&lt;br /&gt;
// Letztes Update des Codes 5. April 2010 durch HannoHupmann&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;quot;i2cmaster.h&amp;quot;  &lt;br /&gt;
#define SLAVE_ADRESSE 0x50&lt;br /&gt;
&lt;br /&gt;
uint8_t byte1 = 42;&lt;br /&gt;
uint8_t byte2 = 43;&lt;br /&gt;
uint8_t byte3 = 44;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  i2c_init();         // init I2C interface&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if(!(i2c_start(SLAVE_ADRESSE+I2C_WRITE))) //Slave bereit zum schreiben?&lt;br /&gt;
{&lt;br /&gt;
  i2c_write(0x00);  // Buffer Startadresse setzen 	&lt;br /&gt;
  i2c_write(byte1); // Drei Bytes schreiben...&lt;br /&gt;
  i2c_write(byte2); &lt;br /&gt;
  i2c_write(byte3); &lt;br /&gt;
  i2c_stop();       // Zugriff beenden&lt;br /&gt;
}&lt;br /&gt;
else&lt;br /&gt;
{&lt;br /&gt;
  /* Hier könnte eine Fehlermeldung ausgegeben werden... */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if(!(i2c_start(SLAVE_ADRESSE+I2C_WRITE))) //Slave bereit zum lesen?&lt;br /&gt;
{&lt;br /&gt;
  i2c_write(0x00); //Buffer Startadresse zum Auslesen&lt;br /&gt;
  i2c_rep_start(SLAVE_ADRESSE+I2C_READ); //Lesen beginnen&lt;br /&gt;
&lt;br /&gt;
  byte1= i2c_readAck(); // Bytes lesen...&lt;br /&gt;
  byte2= i2c_readAck();&lt;br /&gt;
  byte3= i2c_readNak(); // letztes Byte lesen, darum kein ACK&lt;br /&gt;
  i2c_stop();           // Zugriff beenden&lt;br /&gt;
} &lt;br /&gt;
else&lt;br /&gt;
{&lt;br /&gt;
  /* Hier könnte eine Fehlermeldung ausgegeben werden... */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if ((byte1 != 42)||(byte2 != 43)||(byte3 != 44))&lt;br /&gt;
{&lt;br /&gt;
  /* Die Bytes wurden nicht korrekt übertragen und wieder gelesen! */ &lt;br /&gt;
}&lt;br /&gt;
    for(;;);	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Code wurde von mir getestet und funktioniert auf einem Mega32&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Slave sourcecode ==&lt;br /&gt;
Die twislave.c für den Slave. Stand: 19.2.2010&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;util/twi.h&amp;gt; 		//enthält z.B. die Bezeichnungen für die Statuscodes in TWSR&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;  //dient zur Behandlung der Interrupts&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt; 		//definiert den Datentyp uint8_t&lt;br /&gt;
#include &amp;quot;twislave.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
//%%%%%%%% Globale Variablen, die vom Hauptprogramm genutzt werden %%%%%%%%&lt;br /&gt;
/*Der Buffer, in dem die Daten gespeichert werden. &lt;br /&gt;
Aus Sicht des Masters läuft der Zugrif auf den Buffer genau wie bei einem I2C-EEPROm ab.&lt;br /&gt;
Für den Slave ist es eine globale Variable&lt;br /&gt;
*/&lt;br /&gt;
volatile uint8_t i2cdata[i2c_buffer_size+1];&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
volatile uint8_t buffer_adr; //&amp;quot;Adressregister&amp;quot; für den Buffer&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*Initaliserung des TWI-Inteface. Muss zu Beginn aufgerufen werden, sowie bei einem Wechsel der Slave Adresse&lt;br /&gt;
Parameter adr: gewünschte Slave-Adresse&lt;br /&gt;
*/&lt;br /&gt;
void init_twi_slave(uint8_t adr)&lt;br /&gt;
{&lt;br /&gt;
	TWAR= adr; //Adresse setzen&lt;br /&gt;
	TWCR &amp;amp;= ~(1&amp;lt;&amp;lt;TWSTA)|(1&amp;lt;&amp;lt;TWSTO);&lt;br /&gt;
	TWCR|= (1&amp;lt;&amp;lt;TWEA) | (1&amp;lt;&amp;lt;TWEN)|(1&amp;lt;&amp;lt;TWIE); 	&lt;br /&gt;
	buffer_adr=0xFF;  &lt;br /&gt;
	sei();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Je nach Statuscode in TWSR müssen verschiedene Bitmuster in TWCR geschreiben werden(siehe Tabellen im Datenblatt!). &lt;br /&gt;
//Makros für die verwendeten Bitmuster:&lt;br /&gt;
&lt;br /&gt;
//ACK nach empfangenen Daten senden/ ACK nach gesendeten Daten erwarten&lt;br /&gt;
#define TWCR_ACK TWCR = (1&amp;lt;&amp;lt;TWEN)|(1&amp;lt;&amp;lt;TWIE)|(1&amp;lt;&amp;lt;TWINT)|(1&amp;lt;&amp;lt;TWEA)|(0&amp;lt;&amp;lt;TWSTA)|(0&amp;lt;&amp;lt;TWSTO)|(0&amp;lt;&amp;lt;TWWC);  &lt;br /&gt;
&lt;br /&gt;
//NACK nach empfangenen Daten senden/ NACK nach gesendeten Daten erwarten     &lt;br /&gt;
#define TWCR_NACK TWCR = (1&amp;lt;&amp;lt;TWEN)|(1&amp;lt;&amp;lt;TWIE)|(1&amp;lt;&amp;lt;TWINT)|(0&amp;lt;&amp;lt;TWEA)|(0&amp;lt;&amp;lt;TWSTA)|(0&amp;lt;&amp;lt;TWSTO)|(0&amp;lt;&amp;lt;TWWC);&lt;br /&gt;
&lt;br /&gt;
//switched to the non adressed slave mode...&lt;br /&gt;
#define TWCR_RESET TWCR = (1&amp;lt;&amp;lt;TWEN)|(1&amp;lt;&amp;lt;TWIE)|(1&amp;lt;&amp;lt;TWINT)|(1&amp;lt;&amp;lt;TWEA)|(0&amp;lt;&amp;lt;TWSTA)|(0&amp;lt;&amp;lt;TWSTO)|(0&amp;lt;&amp;lt;TWWC);  &lt;br /&gt;
//Die Bitmuster für TWCR_ACK und TWCR_RESET sind gleich. Dies ist kein Fehler und dient nur der Übersicht!&lt;br /&gt;
&lt;br /&gt;
/*ISR, die bei einem Ereignis auf dem Bus ausgelöst wird. Im Register TWSR befindet sich dann &lt;br /&gt;
ein Statuscode, anhand dessen die Situation festgestellt werden kann.&lt;br /&gt;
*/&lt;br /&gt;
ISR (TWI_vect)  &lt;br /&gt;
{&lt;br /&gt;
uint8_t data=0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
switch (TW_STATUS) //TWI-Statusregister prüfen und nötige Aktion bestimmen &lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
// Slave Receiver &lt;br /&gt;
&lt;br /&gt;
case TW_SR_SLA_ACK: // 0x60 Slave Receiver, Slave wurde adressiert	&lt;br /&gt;
	TWCR_ACK; // nächstes Datenbyte empfangen, ACK danach senden&lt;br /&gt;
	buffer_adr=0xFF; //Bufferposition ist undefiniert&lt;br /&gt;
break;&lt;br /&gt;
	&lt;br /&gt;
case TW_SR_DATA_ACK: // 0x80 Slave Receiver, ein Datenbyte wurde empfangen&lt;br /&gt;
	data=TWDR; //Empfangene Daten auslesen&lt;br /&gt;
	if (buffer_adr == 0xFF) //erster Zugriff, Bufferposition setzen&lt;br /&gt;
		{&lt;br /&gt;
			//Kontrolle ob gewünschte Adresse im erlaubten bereich&lt;br /&gt;
			if(data&amp;lt;i2c_buffer_size)&lt;br /&gt;
				{&lt;br /&gt;
					buffer_adr= data; //Bufferposition wie adressiert setzen&lt;br /&gt;
				}&lt;br /&gt;
			else&lt;br /&gt;
				{&lt;br /&gt;
					buffer_adr=0; //Adresse auf Null setzen. Ist das sinnvoll? TO DO!&lt;br /&gt;
				}				&lt;br /&gt;
			TWCR_ACK;	// nächstes Datenbyte empfangen, ACK danach, um nächstes Byte anzufordern&lt;br /&gt;
		}&lt;br /&gt;
	else //weiterer Zugriff, nachdem die Position im Buffer gesetzt wurde. NUn die Daten empfangen und speichern&lt;br /&gt;
		{&lt;br /&gt;
		&lt;br /&gt;
			if(buffer_adr&amp;lt;i2c_buffer_size)&lt;br /&gt;
				{&lt;br /&gt;
					if(!I2C_reg_Schreibschutz[buffer_adr]) //Wenn Position nicht schreibgeschützt...&lt;br /&gt;
						i2cdata[buffer_adr]=data; 			//...dann Daten in Buffer schreibe&lt;br /&gt;
						&lt;br /&gt;
						&lt;br /&gt;
				}&lt;br /&gt;
			buffer_adr++; //Buffer-Adresse weiterzählen für nächsten Schreibzugriff&lt;br /&gt;
			TWCR_ACK;	&lt;br /&gt;
		}&lt;br /&gt;
break;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Slave transmitter&lt;br /&gt;
&lt;br /&gt;
case TW_ST_SLA_ACK: //0xA8 Slave wurde im Lesemodus adressiert und hat ein ACK zurückgegeben.&lt;br /&gt;
	//Hier steht kein break! Es wird also der folgende Code ebenfalls ausgeführt!&lt;br /&gt;
	&lt;br /&gt;
case TW_ST_DATA_ACK: //0xB8 Slave Transmitter, Daten wurden angefordert&lt;br /&gt;
&lt;br /&gt;
	if (buffer_adr == 0xFF) //zuvor keine Leseadresse angegeben! &lt;br /&gt;
		{&lt;br /&gt;
			buffer_adr=0;&lt;br /&gt;
		}	&lt;br /&gt;
		&lt;br /&gt;
	if(buffer_adr&amp;lt;i2c_buffer_size)	&lt;br /&gt;
		{&lt;br /&gt;
			TWDR = i2cdata[buffer_adr]; //Datenbyte senden&lt;br /&gt;
			buffer_adr++; //bufferadresse für nächstes Byte weiterzählen&lt;br /&gt;
		}&lt;br /&gt;
	else&lt;br /&gt;
		{&lt;br /&gt;
			TWDR=0; //Kein Daten mehr im Buffer&lt;br /&gt;
		}&lt;br /&gt;
	TWCR_ACK;&lt;br /&gt;
break;&lt;br /&gt;
&lt;br /&gt;
case TW_ST_DATA_NACK: // 0xC0 Keine Daten mehr gefordert &lt;br /&gt;
case TW_SR_DATA_NACK: // 0x88 &lt;br /&gt;
case TW_ST_LAST_DATA: // 0xC8  Last data byte in TWDR has been transmitted (TWEA = “0”); ACK has been received&lt;br /&gt;
case TW_SR_STOP:      // 0xA0 STOP empfangen&lt;br /&gt;
default: 	&lt;br /&gt;
    TWCR_RESET;&lt;br /&gt;
break;&lt;br /&gt;
	&lt;br /&gt;
} //end.switch (TW_STATUS)&lt;br /&gt;
} //end.ISR(TWI_vect)&lt;br /&gt;
&lt;br /&gt;
////Ende von twislave.c////&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Slave header ==&lt;br /&gt;
Die zugehörige Headerdatei twislave.h für den Slave. Stand: 19.2.2010&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#ifndef _TWISLAVE_H&lt;br /&gt;
#define _TWISLAVE_H&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;util/twi.h&amp;gt; 		  //enthaelt z.B. die Bezeichnungen fuer die Statuscodes in TWSR&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;  //dient zur behandlung der Interrupts&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt; 		    //definiert den Datentyp uint8_t&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 *  @defgroup twislave TWI-Slave&lt;br /&gt;
 *  @code #include &amp;quot;twislave.h&amp;quot; @endcode&lt;br /&gt;
 * &lt;br /&gt;
 *  @brief Betrieb eines AVRs mit Hardware-TWI-Schnittstelle als Slave.&lt;br /&gt;
 *  Zu Beginn muss init_twi_slave mit der gewuenschten Slave-Adresse als&lt;br /&gt;
 *  Parameter aufgerufen werden.&lt;br /&gt;
 *&lt;br /&gt;
 * Der Datenaustausch mit dem Master erfolgt ueber den Buffer i2cdata, &lt;br /&gt;
 * auf den von Master und Slave zugegriffen werden kann. &lt;br /&gt;
 * Dies ist fuer den Slave eine globale Variable (Array aus uint8_t). &lt;br /&gt;
&lt;br /&gt;
 * Der Zugriff durch den Master erfolgt aehnlich wie bei einem&lt;br /&gt;
 * normalen I2C-EEPROM.&lt;br /&gt;
 * Man sendet zunaechst die Bufferposition, an die man schreiben will,&lt;br /&gt;
 * und dann die Daten. &lt;br /&gt;
 * Die Bufferposition wird automatisch hochgezaehlt, sodass man mehrere&lt;br /&gt;
 * Datenbytes hintereinander schreiben kann, ohne jedesmal die &lt;br /&gt;
 * Bufferadresse zu schreiben.&lt;br /&gt;
 *&lt;br /&gt;
 * Um vom Master aus zu lesen, uebertraegt man zunaechst in einem &lt;br /&gt;
 * Schreibzugriff die gewuenschte Bufferposition und liest dann nach&lt;br /&gt;
 * einem repeated start die Daten aus. Die Bufferposition wird &lt;br /&gt;
 * automatisch hochgezaehlt, sodass man mehrere Datenbytes&lt;br /&gt;
 * hintereinander lesen kann, ohne jedesmal die Bufferposition zu&lt;br /&gt;
 * schreiben.&lt;br /&gt;
 *&lt;br /&gt;
 * Abgefangene Fehlbedienung durch den Master:&lt;br /&gt;
 * - Lesen ueber die Grenze des txbuffers hinaus&lt;br /&gt;
 * - Schreiben ueber die Grenzen des rxbuffers hinaus&lt;br /&gt;
 * - Angabe einer ungueltigen Schreib/Lese-Adresse&lt;br /&gt;
 * - Lesezugriff, ohne vorher Leseadresse geschrieben zu haben&lt;br /&gt;
 * &lt;br /&gt;
 *  @author uwegw&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*@{*/&lt;br /&gt;
&lt;br /&gt;
//%%%%%%%% von Benutzer konfigurierbare Einstellungen %%%%%%%%&lt;br /&gt;
/**@brief Groesse des Buffers in Byte (2..254) */&lt;br /&gt;
#define i2c_buffer_size 8  //Beispiel: acht Register&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//%%%%%%%% Globale Variablen, die vom Hauptprogramm genutzt werden %%%%%%%%&lt;br /&gt;
/**@brief Der Buffer, in dem die Daten gespeichert werden.&lt;br /&gt;
 * Aus Sicht des Masters laeuft der Zugrif auf den Buffer genau wie&lt;br /&gt;
 *  bei einem I2C-EEPROm ab.&lt;br /&gt;
 * Fuer den Slave ist es eine globale Variable&lt;br /&gt;
*/&lt;br /&gt;
volatile uint8_t i2cdata[i2c_buffer_size+1];&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**@brief Initaliserung des TWI-Inteface. Muss zu Beginn aufgerufen werden, sowie bei einem Wechsel der Slave Adresse&lt;br /&gt;
 * @param adr gewuenschte Slave-Adresse */&lt;br /&gt;
void init_twi_slave(uint8_t adr);&lt;br /&gt;
&lt;br /&gt;
//%%%%%%%% ab hier sind normalerweise keine weiteren Aenderungen erforderlich! %%%%%%%%//&lt;br /&gt;
//____________________________________________________________________________________//&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Bei zu alten AVR-GCC-Versionen werden die Interrupts anders genutzt, daher in diesem Fall mit Fehlermeldung abbrechen&lt;br /&gt;
#if (__GNUC__ * 100 + __GNUC_MINOR__) &amp;lt; 304&lt;br /&gt;
	#error &amp;quot;This library requires AVR-GCC 3.4.5 or later, update to newer AVR-GCC compiler !&amp;quot;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
//Schutz vor unsinnigen Buffergroessen&lt;br /&gt;
#if (i2c_buffer_size &amp;gt; 254)&lt;br /&gt;
	#error Buffer zu gross gewaehlt! Maximal 254 Bytes erlaubt.&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#if (i2c_buffer_size &amp;lt; 2)&lt;br /&gt;
	#error Buffer muss mindestens zwei Byte gross sein!&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/*@}*/&lt;br /&gt;
&lt;br /&gt;
#endif //#ifdef _TWISLAVE_H&lt;br /&gt;
////Ende von twislave.h////&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Slave Testprogramm ==&lt;br /&gt;
Ein Testprogramm für den Slave. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
Testprogramm für die twislave.c&lt;br /&gt;
Der Buffer wird mit Werten gefüllt. Dann wird er fortlaufend über die serielle Schnittstelle ausgegeben.&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;twislave.h&amp;quot;&lt;br /&gt;
#include &amp;quot;uart.c&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#define BAUD 9600 //Baudrate&lt;br /&gt;
#define SLAVE_ADRESSE 0x50 //Die Slave-Adresse&lt;br /&gt;
&lt;br /&gt;
//Funktion für Warteschaleifen&lt;br /&gt;
//Parameter: Wartezeit in Milisekunden&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
void warte (int loop)  //loop: wartezeit in ms &lt;br /&gt;
{&lt;br /&gt;
	int i;&lt;br /&gt;
	for(i=0;i&amp;lt;loop;i++) _delay_ms(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main (void)&lt;br /&gt;
{&lt;br /&gt;
//TWI als Slave mit Adresse slaveadr starten&lt;br /&gt;
init_twi_slave(SLAVE_ADRESSE);&lt;br /&gt;
&lt;br /&gt;
//i2cdatamit Werten füllen, die der Master auslesen und ändern kann&lt;br /&gt;
for(uint8_t i=0;i&amp;lt;buffer_size;i++)&lt;br /&gt;
	{&lt;br /&gt;
		i2cdata[i]=10+i;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
//Serielle Schnittstelle aktivieren&lt;br /&gt;
uart_init((UART_BAUD_SELECT((BAUD),F_CPU)));&lt;br /&gt;
uart_puts(&amp;quot;I2C-Test\r\n&amp;quot;);&lt;br /&gt;
uart_puts(&amp;quot;Teste I2C-Slave mit Adresse &amp;quot;); uart_puti(SLAVE_ADRESSE);&lt;br /&gt;
uart_puts(&amp;quot;\r\n&amp;quot;);&lt;br /&gt;
uart_puts(&amp;quot;\r\n&amp;quot;); //Leerzeile&lt;br /&gt;
&lt;br /&gt;
//in einer Endlosschleife den Inhalt der Buffer ausgeben&lt;br /&gt;
while(1) &lt;br /&gt;
{&lt;br /&gt;
	uart_puts(&amp;quot;i2cdata:\r\n&amp;quot;);&lt;br /&gt;
	for(uint8_t i=0;i&amp;lt;buffer_size;i++)&lt;br /&gt;
		{&lt;br /&gt;
			uart_puti(i2cdata[i]);&lt;br /&gt;
			uart_puts(&amp;quot;\r\n&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	uart_puts(&amp;quot;\r\n&amp;quot;);//leerzeile&lt;br /&gt;
warte(500);&lt;br /&gt;
} //end.while&lt;br /&gt;
} //end.main&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Microcontroller]]&lt;br /&gt;
[[Kategorie:Quellcode C]]&lt;/div&gt;</summary>
		<author><name>HannoHupmann</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Wanderkiste&amp;diff=16056</id>
		<title>Wanderkiste</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Wanderkiste&amp;diff=16056"/>
				<updated>2010-03-24T10:12:12Z</updated>
		
		<summary type="html">&lt;p&gt;HannoHupmann: /* Die Liste */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Entstanden auf Grund verschiedener Anregungen im Internet. Jeder Bastler besitzt Bauteile, die er selbst nicht braucht. Zum Wegwerfen zu schade - aber von möglichem Nutzen für andere Bastler.&lt;br /&gt;
&lt;br /&gt;
==Die Idee / Das Konzept:==&lt;br /&gt;
*Es wird eine Kiste mit Dingen befüllt, die man nicht mehr braucht oder von denen man zu viel hat.&amp;lt;br /&amp;gt;Danach wird die Kiste an einen Interessenten weitergeben / verschickt.&amp;lt;br /&amp;gt;Dieser kann sich dann Dinge, die hineingelegt wurden, aussuchen und danach auch wieder neue Sachen rein legen.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Interessenten tragen sich in eine Liste ein, aber dazu später mehr.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Für alles, was man sich aus der Kiste heraus nimmt,&amp;lt;br /&amp;gt;legt man etwas gleichwertig nützliches wieder hinein.&amp;lt;br /&amp;gt;Wobei hier nicht der finanzielle Wert im Vordergrund stehen soll,&amp;lt;br /&amp;gt;sondern der Nutzen bzw. die Freude, die ein Empfänger daran haben könnte.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Hierbei ist es wichtig, fair zu bleiben, d.h. nehmt nur das raus, was ihr auch brauchen könnt.&amp;lt;br /&amp;gt;Wenn ihr etwas wertvolleres herausnehmt, dann legt auch etwas wertvolleres wieder rein,&amp;lt;br /&amp;gt;sonst ist die Kiste nach ein paar Stationen schon wieder leer bzw. mit irgendwelchem Schrott gefüllt, und dass will keiner von uns.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Die Regeln (Kurzversion)==&lt;br /&gt;
* Nimmt man etwas aus der Kiste, so sollte man auch etwas hinein legen, das vergleichbaren Wert hat - nicht unbedingt finanziell, sondern von möglichem Nutzen für Andere.  &lt;br /&gt;
* Keinen Schrott in die Kiste legen (wie durchgebrannte Baugruppen, gebrochene Displays etc). Bei defekten Platinen, wenn möglich, die Art des Schadens angeben.&lt;br /&gt;
* Keine PC-Bauteile hineinlegen. Die machen eine Kiste schnell extrem schwer.&lt;br /&gt;
* Kiste, wenn irgend möglich, nicht länger als eine Woche behalten.&lt;br /&gt;
* Versand bitte nur als Paket (versichert) mit Hermes oder DHL.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Regeln (Ausführlich) ==&lt;br /&gt;
&lt;br /&gt;
===Wiki-Eintrag===&lt;br /&gt;
Jeder, der die Kiste bekommt, also jede Station, muss einen Eintrag hier in diesem Wiki-Artikel hinterlassen.&amp;lt;br /&amp;gt;&lt;br /&gt;
Darin enthalten sollte sein:&amp;lt;br /&amp;gt;&lt;br /&gt;
    * Ein Bild des Zustandes beim Empfang der Kiste&lt;br /&gt;
    * Datum bei Erhalt der Kiste&lt;br /&gt;
    * Was herausgenommen wurde&lt;br /&gt;
    * Was hineingelegt wurde&lt;br /&gt;
    * Ein Bild der Kiste bei Auslieferung&lt;br /&gt;
    * Datum bei Versand der Kiste&lt;br /&gt;
&lt;br /&gt;
===Die Empfänger / Der Versandt ===&lt;br /&gt;
* Aus der im Wiki veröffentlichten Liste kann man sich einen neuen Empfänger heraussuchen &amp;lt;br /&amp;gt;(wenn möglich nach der Reihenfolge gehen, der neue Empfänger sollte aber die Kiste noch nicht erhalten haben) Mit diesem tritt man zuallererst in Kontakt, dass er sich auf den Empfang der Kiste vorbereiten kann und nicht z.B. im Urlaub ist.&lt;br /&gt;
* Der neue Empfänger sollte, wenn möglich, diese Kiste noch nicht gehabt haben.&lt;br /&gt;
* Bitte die Adressaufkleber auf der Kiste komplett entfernen, sonst könnte es Probleme geben.&lt;br /&gt;
* Wenn die Kiste langsam kaputt geht, kann diese gerne ersetzt werden.&lt;br /&gt;
* Die Kiste immer als versichertes Paket versenden (wegen Trackingnummer).&lt;br /&gt;
* Die Kiste darf nur innerhalb Deutschlands versendet werden.&lt;br /&gt;
* Es ist natürlich auch möglich die Kiste persönlich weiter zu geben!&lt;br /&gt;
* Die Kiste sollte nach spätestens einer Woche weiter geschickt werden.&lt;br /&gt;
&lt;br /&gt;
===Versandinfo===&lt;br /&gt;
* [https://privatpaketservice.hlg.de/wps/portal/PRIPS_DEU/PREISE Hermes]: 4-9 Euro (abhängig von Größe); Versichert; Bis 25kg. Abgabe an [http://customer3.map24.com/hermes/?lang=de-DE Paketshops] oder Abholung von Zuhause (dann etwas teurer).&lt;br /&gt;
&lt;br /&gt;
* [http://www.dhl.de/de/paket/privatkunden/preisuebersicht.html DHL]: 3-13 Euro (abhängig von Größe und Gewicht). Versichert.&lt;br /&gt;
&lt;br /&gt;
===Das Log-Büchlein===&lt;br /&gt;
In der Kiste liegt ein kleines Buch. Dies ist das Logbuch, d.h. hier wird der Lebenslauf der Kiste beschrieben.&amp;lt;br /&amp;gt;&lt;br /&gt;
Hier tragt ihr auch folgendes ein:&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    * Datum bei Erhalt&lt;br /&gt;
    * Was herausgenommen wurde&lt;br /&gt;
    * Was hineingelegt wurde&lt;br /&gt;
    * Datum bei Versand&lt;br /&gt;
    * Neuer Empfänger&lt;br /&gt;
&lt;br /&gt;
===Persönliche Briefe===&lt;br /&gt;
Natürlich dürfen für den nächsten Empfänger auch persönliche Briefe etc. mitgeschickt werden.&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Was darf rein, was nicht?==&lt;br /&gt;
===Rein darf===&lt;br /&gt;
    * Da wir hier im Roboternetz sind, darf natürlich alles rein, was mit Robotern zu tun hat,&lt;br /&gt;
      also sowohl Elektronisches wie auch mechanische Bauteile.&lt;br /&gt;
    * CDs, DVDs.&lt;br /&gt;
    * Funktionierender Technikkram (Keine veraltete PC Hardware).&lt;br /&gt;
    * Bücher (Keine veralteten Zeitschriften).&lt;br /&gt;
    * Werkzeug aller Art (nur Funktionierendes).&lt;br /&gt;
    * Spiele (PC &amp;amp; Gesellschaftsspiele).&lt;br /&gt;
    * Sonstiges Brauchbares.&lt;br /&gt;
    * Über gut verpackte Süßigkeiten freut sich der nächste bestimmt (Gummibärchen etc...).&lt;br /&gt;
&lt;br /&gt;
===Was nicht rein darf===&lt;br /&gt;
    * Unbrauchbarer Krempel.&lt;br /&gt;
    * Defekte, durchgebrannte, kaputte Bauteile.&lt;br /&gt;
    * Veraltete Zeitschriften / PC Hardware etc.&lt;br /&gt;
    * Zerbrechliche Sachen und Flüssigkeiten (bzw. Tassen oder Gläser gut verpacken!).&lt;br /&gt;
&lt;br /&gt;
===Bestückung der Kiste===&lt;br /&gt;
* Bei Entnahme einer Sache mit möglichst einer gleichwertigen Sache befüllen.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Die Kiste ist zu voll, was nun?==&lt;br /&gt;
* Ist die Kiste zu voll, sollte zuerst unnützer Schrott aussortiert werden. (Bitte auch im Wikibeitrag vermerken)&lt;br /&gt;
* Sollte die Kiste immer noch zu voll sein, dann sollte man die Kiste splitten.&lt;br /&gt;
#Ein neuer Karton muss her.&lt;br /&gt;
#Der Inhalt wird gleichmäßig aufgeteilt (etwa gleicher Wert, nicht die gleichen Sachen, sonst ist´s doof).&lt;br /&gt;
#Ein neues Büchlein ist Pflicht.&lt;br /&gt;
##Das Alte Büchlein komplett übertragen (nur Namen &amp;amp; Datum).&lt;br /&gt;
#Einer der entstehenden Kisten einen eigenen Namen geben.&lt;br /&gt;
#Der zweiten Kiste den Namen der aufgespaltenen Kiste geben und passenden Suffix dranhängen &amp;lt;br/&amp;gt;(z.B. nicht mehr ''Kistenname'', sondern ''Kistenname2'').&lt;br /&gt;
# Bitte an zwei verschiedene Empfänger verschicken.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Die Liste ==&lt;br /&gt;
'''Wanderkiste Interessenten Liste'''&lt;br /&gt;
Du willst auch mal eine Wanderkiste erhalten?&amp;lt;br /&amp;gt;&lt;br /&gt;
Dann schreibe doch hier folgende Dinge als Infos:&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- Deine Wünsche&amp;lt;br /&amp;gt;&lt;br /&gt;
- Wenn du willst: Was hast du zu bieten?&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
{{FarbigerRahmen|&lt;br /&gt;
Aus datenschutzrechtlichen Gründen und deinem eigenen Interesse bitte keine Adresse hier hin schreiben.&amp;lt;br /&amp;gt;&lt;br /&gt;
Kontakt kann über das Forum, das Nachrichtenmodul oder per Mail aufgenommen werden!&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier trägt sich jeder ein, der mitmachen möchte...&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&amp;quot;&lt;br /&gt;
|+ '''Interessenliste'''&lt;br /&gt;
|-&lt;br /&gt;
| '''Erhalten am (''Kiste'')'''|| '''Kontakt - Forum''' || '''Kontakt - RN-Wissen''' || '''Wünsche''' || '''zu Bieten''' || '''Sonstiges'''&lt;br /&gt;
|-&lt;br /&gt;
| '''11.11.2011''' (''Beispielkiste'') || [http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=ID Profilname] || [http://www.rn-wissen.de/index.php/Benutzer:Profilname Profilname] || Ich wünsche Mikrocontroller, Bauteile, CDs, DVDs || Ich biete einige seltene Bauteile z.B. ... || Hier z.B. eintragen ob eine Kiste gesplittet wurde&lt;br /&gt;
|-&lt;br /&gt;
|  || [http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=35267 Yaro] || [http://www.rn-wissen.de/index.php/Benutzer:Yaro Yaro] || Ungewöhnliche Sensoren, Mechanische Bauteile || Standardbauteile, Motoren, Zahnarzt-Bohrer || '''Sputnik erstellt am: 15.03.2010'''&lt;br /&gt;
|-&lt;br /&gt;
|  || [http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=36199 Williwilli] || [http://www.rn-wissen.de/index.php/Benutzer:Williwilli Williwilli] ||  ||  ||&lt;br /&gt;
|-&lt;br /&gt;
|  || [http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=42535 fUnK3r] || [http://www.rn-wissen.de/index.php/Benutzer:FUnK3r fUnK3r] || Natürlich alles mögliche an elektronischen Bauteilen und alles mögliche was mit Casemodding zu tun hat, außerdem gerne auch was Süßes und gute Bücher/DVD usw.|| Bauteile, Edelstahl Kabeldurchführungen, Schlauchverbinder, diverses anderes Kleinzeug ||&lt;br /&gt;
|-&lt;br /&gt;
|  || [http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=33426h Max Hinze] || [http://www.rn-wissen.de/index.php/Benutzer:Max_Hinze Max Hinze] || alles mögliche || Kleinzeugs, Platinen.etc. ||&lt;br /&gt;
|-&lt;br /&gt;
|  || [http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=38729 Thund3r] || [http://www.rn-wissen.de/index.php/Benutzer:Thund3r Thund3r] || elektronische und mechanische Bauteile, Werkzeuge, Sensoren, Motoren Pfostenstecker o.ä.|| Werkzeug, LEDs, Bauteile, mechanische Komponenten etc. ||&lt;br /&gt;
|-&lt;br /&gt;
|  || [http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=40635 DeVlinder] || [http://www.rn-wissen.de/index.php/Benutzer:DeVlinder DeVlinder] || || Standardbauteile, H-Brücken-ICs (SMD), Stecker-/Buchsenleisten, Beschleunigungssensor||&lt;br /&gt;
|-&lt;br /&gt;
|  || [http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=16367 HannoHupmann] || [http://www.rn-wissen.de/index.php/Benutzer:HannoHupmann HannoHupmann] || || Servos, Displays, Bauteile, Diverses ||&lt;br /&gt;
|-&lt;br /&gt;
|  || [...] || [...] || || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Kiste '''Sputnik''' ==&lt;br /&gt;
=== Der Weg ===&lt;br /&gt;
* '''''[http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=35267 Yaro]''''' geschickt an '''''[http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=36199 Williwilli]''''' am '''''15.03.2010'''''&lt;br /&gt;
* '''''[http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=36199 Williwilli]''''' Kiste erhalten am '''''18.03.2010'''''&lt;br /&gt;
* '''''[http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=36199 Williwilli]''''' geschickt an '''''[http://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&amp;amp;u=42535 fUnK3r]''''' am '''''24.03.2010'''''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Online Logbuch ===&lt;br /&gt;
    * Foto beim Öffnen der Kiste&lt;br /&gt;
    * Was herausgenommen wurde&lt;br /&gt;
    * Was hineingelegt wurde&lt;br /&gt;
    * Ein Bild der Kiste bei Auslieferung&lt;br /&gt;
    * Datum bei Versand der Kiste&lt;br /&gt;
&lt;br /&gt;
Foto beim Öffnen der Kiste am 19.03.2010&amp;lt;br/&amp;gt;[[Bild:Wanderkiste.JPG]]&amp;lt;br/&amp;gt;&lt;br /&gt;
Foto beim Versand der Kiste am 24.03.2010&amp;lt;br/&amp;gt;[[Bild:Wanderkiste1.JPG]]&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Herausgenommen:'''&lt;br /&gt;
 * Williwilli&lt;br /&gt;
    * 3 St. NE567&lt;br /&gt;
    * 2 St 100nF HF-Kondensatoren&lt;br /&gt;
    * 8 St. Taster&lt;br /&gt;
    * 5 St. IRF520&lt;br /&gt;
    * 1 St. Zahnarztbohrer&lt;br /&gt;
    * 2 St. Laborkabel&lt;br /&gt;
&lt;br /&gt;
'''Hineingelegt:'''&lt;br /&gt;
 * Williwilli&lt;br /&gt;
    * 3 Taster, 1 Schalter&lt;br /&gt;
    * 25pol D-Sub-Stecker, Lötanschluß&lt;br /&gt;
    * 6 EPROMs&lt;br /&gt;
    * diverse SMD-ICs&lt;br /&gt;
    * 100 LEDs 5mm - 4 Farben&lt;br /&gt;
    * 75 LEDs 3mm - 3 Farben&lt;br /&gt;
    * Steckernetzteil 6,8V DC&lt;br /&gt;
    * 5 dicke PTCs von ITT&lt;br /&gt;
    * 2 Europlatinen einseitig Kupfer (zum Ätzen)&lt;br /&gt;
    * etwas Moosgummi (antistatisch für ICs)&lt;br /&gt;
&lt;br /&gt;
=== Der Inhalt ===&lt;br /&gt;
Hier sollte immer der aktuelle Inhalt der Kiste zu finden sein. Also: entnommene Teile bitte löschen, neue Teile dazu schreiben:&lt;br /&gt;
     * 2 Tüten mit kleinen und großen Elkos, HF-Kondensatoren&lt;br /&gt;
     * kleine Schachtel mit FETs IRF520&lt;br /&gt;
     * 1 SRAM 62LV1025-55&lt;br /&gt;
     * 1 Tütchen NE567&lt;br /&gt;
     * 1 Tütchen Logikgatter HEF40xx&lt;br /&gt;
     * 1 Tütchen mit 6 EPROMs&lt;br /&gt;
     * 1 Tütchen mit diversen SMD-ICs&lt;br /&gt;
     * 1 Tütchen Widerstandsnetzwerke 4k7-9&lt;br /&gt;
     * 1 Tütchen Transistoren&lt;br /&gt;
     * 3 Tütchen LEDs&lt;br /&gt;
     * 1 Tütchen Schalter und Taster&lt;br /&gt;
     * 1 Tütchen PTCs&lt;br /&gt;
     * 25pol D-Sub-Stecker, Lötanschluß&lt;br /&gt;
     * 2 Schrittmotoren (CD-Laufwerk), 1 kleiner Motor&lt;br /&gt;
     * 1 Hochstrompoti&lt;br /&gt;
     * 1 Steckernetzteil&lt;br /&gt;
     * Drucker-LCD-Display&lt;br /&gt;
     * '''3''' Zahnarztbohrer (es waren 4!!!)&lt;br /&gt;
     * 2 Europlatinen einseitig Kupfer (zum Ätzen)&lt;br /&gt;
     * etwas Moosgummi (antistatisch für ICs)&lt;br /&gt;
     * Tütchen mit kleinen Mechanikbauteilen aus Platik&lt;br /&gt;
     * 3 große Mechanikbauteile aus Metall, 3 aus Platik&lt;br /&gt;
     * ein TT-Ball, zwei &amp;quot;Continental&amp;quot;-Flummis&lt;br /&gt;
     * ein paar Meter Doppellitze&lt;br /&gt;
     * Cuttermesser&lt;br /&gt;
     * Bleistifte, Filzstifte, Lineal&lt;br /&gt;
     * ... und natürlich das Logbuch&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Anmerkungen ==&lt;br /&gt;
Noch Fragen? Anregungen? &amp;lt;br /&amp;gt;&lt;br /&gt;
Bei Bedarf wird hier ergänzt&lt;/div&gt;</summary>
		<author><name>HannoHupmann</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Spinnenbeine_(Hexapods)&amp;diff=10183</id>
		<title>Spinnenbeine (Hexapods)</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Spinnenbeine_(Hexapods)&amp;diff=10183"/>
				<updated>2007-02-18T20:57:57Z</updated>
		
		<summary type="html">&lt;p&gt;HannoHupmann: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Einleitung und grundsätzliche Anmerkungen==&lt;br /&gt;
Da z.Z. immer mehr Hobbyrobotiker auf den Geschmack kommen sich einen Hexapod (oder andere Beinzahl) selbst zu bauen, möchte ich einige Grundsätzliche Tipps geben und Hinderinsse aufzeigen. Laufroboter gehören von der mechanischen Seite und der Programmierung zu den schwersten Hobbyroboterprojekten. Ein Hexabot ist demnach kein Roboter für: &amp;quot;so eben schnell&amp;quot; sondern will wohl durchdacht und geplant werden. In den meisten Hobbyanwendungen hat Hexabot einen Durchmesser von etwa 500mm und ein Gewicht zwischen 1kg und 3kg. Da mit höherem Gewicht die Kosten für passende Servos enerom ansteigen durchbrechen Hexabots ab 3kg sehr schnell die 1000€ Marke. Auch Hexabots mit einem Gewicht zwischen 1kg bis 2kg können leicht einige Hundert Euro kosten. Konsequenter Leichtbau ist also eine der Herausforderungen und zugleich ein wichtiger Tipp. &lt;br /&gt;
Für die Energieversorgung empfehlen sich leichte Lithium Polymer Akkus aus kostengründen kann auch mit, deutlich schwereren,  RC-Akkus gearbeitet werden. Falls Bleiakkus zum Einsatz kommen sollen übersteigen im Regelfall die daraus resultierenden mechanischen Proble weit den Nutzfaktor.&lt;br /&gt;
&lt;br /&gt;
Bemerkung zu Laufrobotern mit deutlich mehr als 3kg: &lt;br /&gt;
Sobald auf Modellbauservos verzichtet wird und Getriebemotoren zum Einsatz kommen sollen, gilt es einige Dinge besonders zu beachten. Ein Servo verfügt im allgemeinen über: Getriebemotor, Potentiometer und eine integrierte Schaltung zur Ansteuerung. Wird nun nur ein Getriebemotor verwendet müssen, Potentiometer und integriete Schaltung anders bereit gestellt werden. Dies führt zu zustäzlichen Kosten. Des weiteren sind die meisten Getriebemotoren auf Drehzahl ausgelegt und nicht auf halten der Kräfte. Für ein Roboterbein sind die Bewegungswege sehr kurz und lediglich kleine Stellbewegung so, dass die Motoren hauptsächlich auf halten beansprucht werden. Bei ungünstiger Wahl der Motoren können sich diese erhitzen und dadurch zerstört werden. Auch sollte ab 5kg jede Achs bzw. jedes Knickelement kugelgelagert werden um die Reibungsverluste zu minimieren. &lt;br /&gt;
Bei 18 Achsen und somit 18-36 Kugellagern werden die Kosten enorm. &lt;br /&gt;
Als Fazit kann somit gesagt werden für eine vernünftige Lösung über 10kg steigen die kosten enorm an und sich daher als Hobbyprojekte nicht mehr geeignet. &lt;br /&gt;
&lt;br /&gt;
==Spinnenbeine, Hexapods, Quadropods und Polypods==&lt;br /&gt;
&lt;br /&gt;
Wenn man sich erstmal nicht damit zufriedengibt, einfach mit den Beinen irgendwie herumzurudern (&amp;quot;Hauptsache, es bewegt sich&amp;quot;), sind Beinbewegungen gar nicht so ohne. Die Provis verwenden hier für die exakte Berechnung der Beine das Verfahren der inversen Kinematik. Da es sich bei diesem Thema jedoch um sehr spezielle mathematische Verfahren und aufwendige Berechnungen handelt beschränken wir uns auf die einfachere und etwas ungenauere Lösung mit fest programmierten Positionen für die einzelnen Schritte.&lt;br /&gt;
&lt;br /&gt;
Schauen wir uns mal die häufigste Variante an, das sind die echsen- oder spinnenartigen Bauformen. Hauptmerkmal ist, dass die Beine seitlich am Körper angebracht sind.&lt;br /&gt;
&lt;br /&gt;
Dabei können folgende Anordnungen und Beine unterschieden werden: &lt;br /&gt;
Die auf dem Bild gezeigte anordnung von 3 Beinen links so wie rechts ist die gängigste für Hexabots. Alternativ können die Beine auch in einem Sechseck angeordnet werden (siehe auch Bild weiter unten). Diese Anordnung hat den Vorteil, dass sie etwas wendiger ist, dies erkauft man sich durch eine etwas komplizierte Programmierung. Denn die Beinstellungen sind hier aufwendiger. &lt;br /&gt;
&lt;br /&gt;
Roboter mit nur 4 Beinen werden gemeinhin als Quadropods bezeichnet. &lt;br /&gt;
Roboter mit mehr als 6 Beinen werden als Polypod bezeichnet.&lt;br /&gt;
&lt;br /&gt;
==Ein Beinpaar im Querschnitt==&lt;br /&gt;
Das hier dargestellte Bein hat 3 Gelenke (jedoch sind nur 2 sichtbar). Einmal ein Gelenk an der Schulter und eines am Knie, das nicht sichtbare ist in der ansicht von Oben dafür verantwortlich das Bein vor und zurück zu bewegen. &lt;br /&gt;
Somit hat diese Bein 3 Freiheitsgrade (1x Knie, 1x Schulter (auf und ab) und 1x Schulter (vor zurück) dies wird oft auch als 3DOF (Degree of Freedom) bezeichnet. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:Podlegside.jpg]]&lt;br /&gt;
&lt;br /&gt;
(Die Beinhaltung ist hier ganz allgemein gehalten, tatsächlich sind da große Unterschiede, je nach Bauart.)&lt;br /&gt;
*Z ist die vertikale Drehachse des &amp;quot;Schulter&amp;quot;-Gelenks&lt;br /&gt;
*h ist die Höhe des Körpers über dem Boden&lt;br /&gt;
*a ist der Oberschenkel&lt;br /&gt;
*&amp;amp;beta; der Winkel des Oberschenkels&lt;br /&gt;
*K ist das Knie&lt;br /&gt;
*b ist der Unterschenkel &lt;br /&gt;
*&amp;amp;alpha; der Winkel im Knie &lt;br /&gt;
*F ist der Fußpunkt&lt;br /&gt;
*&amp;amp;gamma; der Winkel, den der Unterschenkel mit dem Boden einnimmt&lt;br /&gt;
*r ist der resultierende Radius des Fußpunktes um die Schulter&lt;br /&gt;
*M der Schwerpunkt unseres Roboters &lt;br /&gt;
*br der Abstand des Schwerpunkts bis zur Schulter&lt;br /&gt;
&lt;br /&gt;
==Variante &amp;quot;Lynxmotion&amp;quot;==&lt;br /&gt;
[[Bild:Podlynx.jpg]]&lt;br /&gt;
&lt;br /&gt;
Hier ist der Oberschenkel gewissermaßen geteilt. Der vertikal bewegliche Teil davon ist sehr kurz und als Parallelogramm ausgeführt, um den Unterschenkel senkrecht halten zu können. Dieser kann aktiv nur gehoben und gesenkt werden, durch Federn hat er aber ein gewisses seitliches Spiel.&lt;br /&gt;
&lt;br /&gt;
Der Zweck dieser Konstruktion ist es, das Schultergelenk mit nur einem Freiheitsgrad sehr robust ausführen zu können.&lt;br /&gt;
Diese Variante der Beine hat also insgesammt nur 2 Freiheitsgrade (Schulter und heben, senken) und wird oft auch als DOF2 bezeichnet.&lt;br /&gt;
&lt;br /&gt;
==Ein (linkes) Bein von oben==&lt;br /&gt;
&lt;br /&gt;
[[Bild:Podlegtop.jpg]]&lt;br /&gt;
&lt;br /&gt;
man findet die Werte aus der seitlichen Ansicht&lt;br /&gt;
*Z die vertikale Drehachse der Schulter (bleiben wir mal bei &amp;quot;Schulter&amp;quot;)&lt;br /&gt;
*r&amp;lt;sup&amp;gt;min&amp;lt;/sup&amp;gt; als kleinstmöglicher Radius, den der Fußpunkt beschreiben kann (wenn der Unterschenkel maximal angezogen ist = kleines &amp;amp;alpha;)&lt;br /&gt;
*r&amp;lt;sup&amp;gt;max&amp;lt;/sup&amp;gt; als größtmöglicher Radius (= großes &amp;amp;alpha;)&lt;br /&gt;
*&amp;amp;delta;&amp;lt;sup&amp;gt;max&amp;lt;/sup&amp;gt; das ist der größtmögliche Drehwinkel des Schultergelenks&lt;br /&gt;
&lt;br /&gt;
schraffiert ist der Bereich, in dem sich die &amp;quot;Fußspitze&amp;quot; bewegen kann. &lt;br /&gt;
&lt;br /&gt;
 '''s''' ist somit die größtmögliche Schrittweite (bei gerader Fortbewegung)&lt;br /&gt;
&lt;br /&gt;
und dann noch&lt;br /&gt;
*M ist der Schwerpunkt (oder Mittelpunkt) des gesamten Fahrzeuges&lt;br /&gt;
*br die halbe Breite&lt;br /&gt;
*f der Abstand dieses Beines von der Querachse&lt;br /&gt;
&lt;br /&gt;
==Beinbewegung==&lt;br /&gt;
===Geradeaus===&lt;br /&gt;
Wird das Bein nun für einen Schritt von vorne nach hinten gedreht (durch Drehung des &amp;quot;Schulter&amp;quot;-Servos), würde sich die Fußspitze in einem Kreisbogen bewegen. Unterwegs würde allerdings die Fußspitze nach außen wegrutschen. Am schlimmsten daran ist der Verlust der Haftreibung, von der noch zu sprechen ist.&lt;br /&gt;
&lt;br /&gt;
Das Bein muß also unterwegs so verkürzt werden, daß sich die Fußspitze entlang der geraden Sehne '''s''' bewegt. Und dann muss noch die Winkelgeschwindigkeit des Schultergelenks angepasst werden, da ja auch der Radius kontinuierlich verändert wird.&lt;br /&gt;
===In einer Kurve===&lt;br /&gt;
Um irgendein Fahrzeug in eine Kurve nach rechts zu bringen, kann man z.B. die Räder links schneller drehen lassen. Sowas geht bei Beinen natürlich nicht. Hier muß die Schrittweite variiert werden. &lt;br /&gt;
Und noch eine Tücke in der Kurve: Der Schreitweg '''s''' muss um den Kurvenradius-Mittelpunkt einen Bogen machen. &lt;br /&gt;
&lt;br /&gt;
[[Bild:Podtopc.jpg]]&lt;br /&gt;
&lt;br /&gt;
*P Kurven-Mittelpunkt&lt;br /&gt;
*M Fahrzeugmittelpunkt&lt;br /&gt;
*r&amp;lt;sub&amp;gt;fzg&amp;lt;/sub&amp;gt;Radius des Fahrzeuges um P&lt;br /&gt;
&lt;br /&gt;
==Anordnung der Beine==&lt;br /&gt;
===Hexapods===&lt;br /&gt;
[[Bild:Hextop1.jpg]]&lt;br /&gt;
[[Bild:Hextop2.jpg]]&lt;br /&gt;
&lt;br /&gt;
das sind zwei Möglichkeiten, bei einem Hexpod die Beine anzuordnen. Die linke Variante hat den Vorteil, dass beim Geradeauslauf die Bewegungen der Beine identisch sein können, allerdings den Nachteil, dass der Rumpf länger sein muss (damit sich die Beine nicht in die Quere kommen). Die rechte Bauart hat diesen Nachteil nicht, aber dafür sind die erforderlichen Schrittbewegungen komplizierter.&lt;br /&gt;
&lt;br /&gt;
==Schrittfolge==&lt;br /&gt;
Es ist ja klar, daß wir nicht alle sechs Beine gleichzeitig bewegen können. Man braucht also eine Schrittfolge.&lt;br /&gt;
Hier können mehrere Varianten unterschieden werden. Da ein Spinnenroboter 6 Beine hat und zum stehen 3 Stück (ein Dreieck bildend) ausreichen gibt es: 3:3. Wir können aber auch nur 2 Beine bewegen und 4 auf dem Boden stehen lassen also 2:4 oder alternativ nur ein Bein bewegen und mit den restlichen 5 auf dem Boden stehen, also 5:1. In Kurven ist das ganze noch etwas komplizierter daher beschäftigen wir uns als erstes mit: &lt;br /&gt;
&lt;br /&gt;
===geradeaus 3:3===&lt;br /&gt;
Die folgende Methode wird gerne angewandt, weil sie recht einfach und auch rein mechanisch gemacht werden kann, allerdings ist die Belastung für die Servos bei dieser Variante am grössten, denn nur 3 Beine teilen sich das gesamte Gewicht des Roboters. Die Beine 1, 4 u. 5  bzw. 2, 3 u. 6  werden jeweils gleich angesteuert, phasenmäßig aber um 180 Grad versetzt. &lt;br /&gt;
&lt;br /&gt;
Im linken Bild sind die Beine 2, 3 u. 6 gerade ganz vorne, die anderen Beine 1, 4 u. 5 ganz hinten&lt;br /&gt;
&lt;br /&gt;
[[Bild:Podstp1.jpg]]&lt;br /&gt;
[[Bild:Podstp2.jpg]]&lt;br /&gt;
&lt;br /&gt;
Im rechten Bild sind 2, 3 u. 6 mit ihrer Bewegung fertig, sie haben das Fahrzeug fortbewegt, jetzt kehrt sich die Sache um&lt;br /&gt;
&lt;br /&gt;
'''Schwerpunkt ?'''&lt;br /&gt;
&lt;br /&gt;
Unterstützt wird das ganze Gerät immer an den Fußpunkten der Beine. Verbindet man diese jeweils drei Punkte, ergeben sich zwei Dreiecke, die in den beiden Zeichnungen strichliert angedeutet sind. Teilweise überlappen sie sich, das ist der Bereich, wo sich der Schwerpunkt des ganzen Fahrzeuges befinden darf.&lt;br /&gt;
&lt;br /&gt;
 Und man sieht, dass diese Fläche bemerkenswert klein ist.&lt;br /&gt;
&lt;br /&gt;
Für 3:3 laufen benötigt jedes Bein 2 Stellungen einmal vorn (A) und einmal hinten (B). Zuerst befinden sich die Beine 2,3 u 6 in Stellung A und werden auf dem Boden gleichzeitig in Stellung B bewegt. Dadurch schiebt sich der Roboter um das Stück A zu B nach vorn. Die Beine 1, 4 u 5 bewegen sich in der selben Zeit von Stellung B nach A, jedoch ohne Bodenkontakt. Wird nun diese Sequenz, im wechsel mit 1, 4 u 5 am Boden und 2, 3 u 6 in der Luft, zyklisch ausgeführt, hat man schon ein passables Laufprogramm für gerade aus. &lt;br /&gt;
&lt;br /&gt;
===geradeaus 2:4===&lt;br /&gt;
Bei dieser Variante wird jeweils ein Beinpaar gleichzeitig bewegt. Diese sind günstigerweise:&lt;br /&gt;
1 und 4 (Paar 1); 3 und 6 (Paar 2); 2 und 5 (Paar 3)&lt;br /&gt;
Jedes Beinpaar benötigt jedoch 3 Stellungen: A, B, C. Der Algoritmus teilt sich daher auch in drei Schritte auf I, II und III. &lt;br /&gt;
&lt;br /&gt;
Für Schritt I bringen wir Paar 1 in Stellung A, Paar 2 in Stellung C und Paar 3 in Stellung B. &lt;br /&gt;
Für Schritt II bewegt sich Paar 1 in Stellung B, Paar 2 in Stellung A (diese Bewegung muss ohne Bodenkontakt erfolgen) und Paar 3 in Stellung C. &lt;br /&gt;
Für Schritt III bewegt sich Paar 1 in Stellung C, Paar 2 in Stellung B und Paar 3 in Stellung A (auch wieder in der Luft) &lt;br /&gt;
Ab hier wiederholt sich das Programm&lt;br /&gt;
&lt;br /&gt;
Fazit: Die Bewegungn sind etwas aufwendiger sich zu überlegen und zu programmieren, der Roboter gewinnt aber insgesammt an Stabilität und ist nur etwas langsamer als bei 3:3. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===geradeaus 1:5===&lt;br /&gt;
Diese Variante ist die langsamste, aber dafür am stabilsten, denn das Gewicht verteilt sich auf 5 Standbeine. &lt;br /&gt;
Es werden 6 Stellungen pro Bein benötigt (A, B, C, D, E, F) und 6 Schritte. &lt;br /&gt;
Es gibt mehrere Möglichkeiten der Startaufstellung ich will hier eine kurz Darstellen: &lt;br /&gt;
Bein 1: A -&amp;gt; B  -&amp;gt; C  usw. &amp;lt;br&amp;gt;&lt;br /&gt;
Bein 2: D -&amp;gt; E  -&amp;gt; F &amp;lt;br&amp;gt;&lt;br /&gt;
Bein 3: E -&amp;gt; F  --&amp;gt; A &amp;lt;br&amp;gt;&lt;br /&gt;
Bein 4: B -&amp;gt; C  -&amp;gt; D &amp;lt;br&amp;gt;&lt;br /&gt;
Bein 5: C -&amp;gt; D  -&amp;gt; E &amp;lt;br&amp;gt;&lt;br /&gt;
Bein 6: F --&amp;gt; A -&amp;gt; B &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Pfeile geben an in Welche Stellung sich die Beine als nächstes bewegen, Bein 6 wird sich in die Stellung A bewegen. Dieser Rückstellvorgang muss immer in der Luft erfolgen. So wird sich der Roboter kontinuierlich vorwärts bewegen.&lt;br /&gt;
&lt;br /&gt;
==Hexapods in der Kurve==&lt;br /&gt;
&lt;br /&gt;
Nochmals das Bild von oben &lt;br /&gt;
&lt;br /&gt;
[[Bild:Hextop1.jpg]]&lt;br /&gt;
&lt;br /&gt;
Die effektiven Beinwege '''s''' können auch wie die Räder von einem sechsrädrigen Fahrzeug verstanden werden.&lt;br /&gt;
&lt;br /&gt;
Wenn wir nun eine Kurve beschreiben wollen, verkürzen wir die Wege '''s''' auf einer Seite, dadurch ergibt sich ein Drehpunkt '''P'''&lt;br /&gt;
&lt;br /&gt;
[[Bild:Hexcurv1.jpg]]&lt;br /&gt;
&lt;br /&gt;
Was man sieht: Es muss eigentlich jedes Bein eine individuelle Bewegung machen.&lt;br /&gt;
UND: jedes Bein muss seinen eigenen [[Spinnenbeine#Beinbewegung|Kurvenradius einhalten]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Hexapods drehen===&lt;br /&gt;
Alternativ, etwas einfacher zu programmieren, weil die Stellungen von Oben weiter verwendet werden können ist das Panzer Modell. &lt;br /&gt;
Konkret heisst es, die rechte Seite der Beine bewegt sich weiter nach oben, wärend die linke Seite der Beine sich nach unten bewegt. Dadurch wird der Roboter auf der Stelle gedreht. D.h. die Bewegungsrichtung der Beine ist insgesammt links zu rechts gegenläufig.&lt;br /&gt;
&lt;br /&gt;
==Kräfte am Spinnenbein==&lt;br /&gt;
Da eine genaue Berechnung recht aufwendig ist und von vielen Faktoren zusätzlich stark beeinflusst wird (Dynamik und äußere Einflüsse), soll hier nur eine qualifizierende Betrachtung erfolgen. &lt;br /&gt;
&lt;br /&gt;
Für Beine gibt es zwei völlig unterschiedliche Situationen: &lt;br /&gt;
===Ohne Bodenhaftung===&lt;br /&gt;
(Glatteis)&lt;br /&gt;
[[Bild:Podvec1.jpg]]&lt;br /&gt;
&lt;br /&gt;
Die Beine werden auseinandergedrückt. Das Kniegelenk muß versuchen, Ober- und Unterschenkel beisammenzuhalten, und in der Schulter muss das anteilige Gewicht des Fahrzeuges getragen werden. Durch die langen Hebel wird da, je nach Beinstellung, eine beachtliche Kraft erforderlich.&lt;br /&gt;
&lt;br /&gt;
===Mit Bodenhaftung===&lt;br /&gt;
(Teppich)&lt;br /&gt;
[[Bild:Podvec2.jpg]]&lt;br /&gt;
&lt;br /&gt;
Ganz anders bei ausreichender Haftung: Da die Füße ja nicht wegrutschen, zieht das Gewicht des Fahrzeuges über die Oberschenkel die Knie nach innen. Hier müssen die Oberschenkel nach außen stemmen, um dem entgegenzuwirken. &lt;br /&gt;
&lt;br /&gt;
''Bitte beachten, die Beine können auch günstiger als auf dem Bild dargestellt, eingerichtet werden. Wenn der Oberschenkel waagrecht zum Roboterkörper ist. Muss das Schultergelenk zwar das gesammte Gewicht des Roboters tragen, aber das Kniegelenk wird praktisch vollständig entlastet. Auch bei Eis als Untergrund würde ein Wegrutschen der Beine so verhindert werden. ''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Ein Rechenbeispiel====&lt;br /&gt;
Des weiteren ist es wichtig zu erwähnen, dass je nach Bauart des Beines, also welche die sich weiter an der Seite vom Bot befinden, enorme Hebelkräfte auftreten. Um die passenden Servos für seinen Roboter heraus zu suchen hier ein Rechenbeispiel: &lt;br /&gt;
&lt;br /&gt;
[[Bild:Beine65.jpg]]&lt;br /&gt;
&lt;br /&gt;
Gegeben sei &amp;quot;a&amp;quot; als größtmöglicher Abstand zum Körper (blau).&lt;br /&gt;
Je nach Bauart des Roboters und der Wahl der Bewegung sind entweder 3 oder 4 oder gar 5 Beine gleichzeit am Boden. Auf diese wird das gesammte Gewicht des Roboter verteilt. Uns interessiert an dieser Stelle wieviel Ncm im Schultergelenk notwendig sind um den Roboter hochzudrücken. Aus der Zeichnung wird wieder deutlich warum es sinnvoll ist den Unterschenkel möglichst senkrecht zu halten und den Oberschenkel waagrecht. Unter dieser Positionierung muss das Kniegelenk nämlich kein Drehmoment übertragen. &lt;br /&gt;
&lt;br /&gt;
Aber zurück zur Rechnung. &lt;br /&gt;
&lt;br /&gt;
das Drehmoment in der Schulter wird wie folgt berechnet: &lt;br /&gt;
(Gewicht /Anzahl der Beine)* Hebelarm = Drehmoment in der Schulter&lt;br /&gt;
&lt;br /&gt;
in unserem Beispielt &lt;br /&gt;
a=10cm; G=1kg--&amp;gt; 1kg * 9,81m/s² = 9,81N ~ 10N; 3Beine am Boden&lt;br /&gt;
&lt;br /&gt;
(10N / 3)* 10cm = 33,3Ncm&lt;br /&gt;
    &lt;br /&gt;
Wir benötigen also in der Schulter Servos welche mindestens 33,3Ncm schaffen, zur Sicherheit wären 35Ncm sinnvoller. &lt;br /&gt;
Die Rechnung lässt sich natürlich auch so umstellen, dass anhand der Servos das Gesamtgewicht ermittelt werden kann: &lt;br /&gt;
&lt;br /&gt;
(Drehmoment der Servos / Hebelarm)* Anzahl der Beine = Gewicht des Roboters&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dasselbe gilt natürlich auch für Quadropods. Nur muss man die Faktoren der Anzahl der Beine ändern&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[Servos]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Mechanik]]&lt;br /&gt;
[[Kategorie:Praxis]]&lt;br /&gt;
&lt;br /&gt;
[http://www.lynxmotion.com Lynxmotion, Referenz für Roboter mit Beinen]&lt;/div&gt;</summary>
		<author><name>HannoHupmann</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Spinnenbeine_(Hexapods)&amp;diff=10182</id>
		<title>Spinnenbeine (Hexapods)</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Spinnenbeine_(Hexapods)&amp;diff=10182"/>
				<updated>2007-02-18T20:50:07Z</updated>
		
		<summary type="html">&lt;p&gt;HannoHupmann: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Einleitung und Grundsätzliche Anmerkungen==&lt;br /&gt;
Da z.Z. immer mehr Hobbyrobotiker auf den Geschmack kommen sich einen Hexapod (oder andere Beinzahl) selbst zu bauen, möchte ich einige Grundsätzliche Tipps geben und Hinderinsse aufzeigen. Laufroboter gehören von der mechanischen Seite und der Programmierung zu den schwersten Hobbyroboterprojekten. Ein Hexabot ist demnach kein Roboter für: &amp;quot;so eben schnell&amp;quot; sondern will wohl durchdacht und geplant werden. In den meisten Hobbyanwendungen hat Hexabot einen Durchmesser von etwa 500mm und ein Gewicht zwischen 1kg und 3kg. Da mit höherem Gewicht die Kosten für passende Servos enerom ansteigen durchbrechen Hexabots ab 3kg sehr schnell die 1000€ Marke. Auch Hexabots mit einem Gewicht zwischen 1kg bis 2kg können leicht einige Hundert Euro kosten. Konsequenter Leichtbau ist also eine der Herausforderungen und zugleich ein wichtiger Tipp. &lt;br /&gt;
Für die Energieversorgung empfehlen sich leichte Lithium Polymer Akkus aus kostengründen kann auch mit, deutlich schwereren,  RC-Akkus gearbeitet werden. Falls Bleiakkus zum Einsatz kommen sollen übersteigen im Regelfall die daraus resultierenden mechanischen Proble weit den Nutzfaktor.&lt;br /&gt;
&lt;br /&gt;
Bemerkung zu Laufrobotern mit deutlich mehr als 3kg: &lt;br /&gt;
Sobald auf Modellbauservos verzichtet wird und Getriebemotoren zum Einsatz kommen sollen, gilt es einige Dinge besonders zu beachten. Ein Servo verfügt im allgemeinen über: Getriebemotor, Potentiometer und eine integrierte Schaltung zur Ansteuerung. Wird nun nur ein Getriebemotor verwendet müssen, Potentiometer und integriete Schaltung anders bereit gestellt werden. Dies führt zu zustäzlichen Kosten. Des weiteren sind die meisten Getriebemotoren auf Drehzahl ausgelegt und nicht auf halten der Kräfte. Für ein Roboterbein sind die Bewegungswege sehr kurz und lediglich kleine Stellbewegung so, dass die Motoren hauptsächlich auf halten beansprucht werden. Bei ungünstiger Wahl der Motoren können sich diese erhitzen und dadurch zerstört werden. Auch sollte ab 5kg jede Achs bzw. jedes Knickelement kugelgelagert werden um die Reibungsverluste zu minimieren. &lt;br /&gt;
Bei 18 Achsen und somit 18-36 Kugellagern werden die Kosten enorm. &lt;br /&gt;
Als Fazit kann somit gesagt werden für eine vernünftige Lösung über 10kg steigen die kosten enorm an und sich daher als Hobbyprojekte nicht mehr geeignet. &lt;br /&gt;
&lt;br /&gt;
==Spinnenbeine, Hexapods, Quadropods und Polypods==&lt;br /&gt;
&lt;br /&gt;
Wenn man sich erstmal nicht damit zufriedengibt, einfach mit den Beinen irgendwie herumzurudern (&amp;quot;Hauptsache, es bewegt sich&amp;quot;), sind Beinbewegungen gar nicht so ohne. Die Provis verwenden hier für die exakte Berechnung der Beine das Verfahren der inversen Kinematik. Da es sich bei diesem Thema jedoch um sehr spezielle mathematische Verfahren und aufwendige Berechnungen handelt beschränken wir uns auf die einfachere und etwas ungenauere Lösung mit fest programmierten Positionen für die einzelnen Schritte.&lt;br /&gt;
&lt;br /&gt;
Schauen wir uns mal die häufigste Variante an, das sind die echsen- oder spinnenartigen Bauformen. Hauptmerkmal ist, dass die Beine seitlich am Körper angebracht sind.&lt;br /&gt;
&lt;br /&gt;
Dabei können folgende Anordnungen und Beine unterschieden werden: &lt;br /&gt;
Die auf dem Bild gezeigte anordnung von 3 Beinen links so wie rechts ist die gängigste für Hexabots. Alternativ können die Beine auch in einem Sechseck angeordnet werden (siehe auch Bild weiter unten). Diese Anordnung hat den Vorteil, dass sie etwas wendiger ist, dies erkauft man sich durch eine etwas komplizierte Programmierung. Denn die Beinstellungen sind hier aufwendiger. &lt;br /&gt;
&lt;br /&gt;
Roboter mit nur 4 Beinen werden gemeinhin als Quadropods bezeichnet. &lt;br /&gt;
Roboter mit mehr als 6 Beinen werden als Polypod bezeichnet.&lt;br /&gt;
&lt;br /&gt;
==Ein Beinpaar im Querschnitt==&lt;br /&gt;
Das hier dargestellte Bein hat 3 Gelenke (jedoch sind nur 2 sichtbar). Einmal ein Gelenk an der Schulter und eines am Knie, das nicht sichtbare ist in der ansicht von Oben dafür verantwortlich das Bein vor und zurück zu bewegen. &lt;br /&gt;
Somit hat diese Bein 3 Freiheitsgrade (1x Knie, 1x Schulter (auf und ab) und 1x Schulter (vor zurück) dies wird oft auch als 3DOF (Degree of Freedom) bezeichnet. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:Podlegside.jpg]]&lt;br /&gt;
&lt;br /&gt;
(Die Beinhaltung ist hier ganz allgemein gehalten, tatsächlich sind da große Unterschiede, je nach Bauart.)&lt;br /&gt;
*Z ist die vertikale Drehachse des &amp;quot;Schulter&amp;quot;-Gelenks&lt;br /&gt;
*h ist die Höhe des Körpers über dem Boden&lt;br /&gt;
*a ist der Oberschenkel&lt;br /&gt;
*&amp;amp;beta; der Winkel des Oberschenkels&lt;br /&gt;
*K ist das Knie&lt;br /&gt;
*b ist der Unterschenkel &lt;br /&gt;
*&amp;amp;alpha; der Winkel im Knie &lt;br /&gt;
*F ist der Fußpunkt&lt;br /&gt;
*&amp;amp;gamma; der Winkel, den der Unterschenkel mit dem Boden einnimmt&lt;br /&gt;
*r ist der resultierende Radius des Fußpunktes um die Schulter&lt;br /&gt;
*M der Schwerpunkt unseres Roboters &lt;br /&gt;
*br der Abstand des Schwerpunkts bis zur Schulter&lt;br /&gt;
&lt;br /&gt;
==Variante &amp;quot;Lynxmotion&amp;quot;==&lt;br /&gt;
[[Bild:Podlynx.jpg]]&lt;br /&gt;
&lt;br /&gt;
Hier ist der Oberschenkel gewissermaßen geteilt. Der vertikal bewegliche Teil davon ist sehr kurz und als Parallelogramm ausgeführt, um den Unterschenkel senkrecht halten zu können. Dieser kann aktiv nur gehoben und gesenkt werden, durch Federn hat er aber ein gewisses seitliches Spiel.&lt;br /&gt;
&lt;br /&gt;
Der Zweck dieser Konstruktion ist es, das Schultergelenk mit nur einem Freiheitsgrad sehr robust ausführen zu können.&lt;br /&gt;
Diese Variante der Beine hat also insgesammt nur 2 Freiheitsgrade (Schulter und heben, senken) und wird oft auch als DOF2 bezeichnet.&lt;br /&gt;
&lt;br /&gt;
==Ein (linkes) Bein von oben==&lt;br /&gt;
&lt;br /&gt;
[[Bild:Podlegtop.jpg]]&lt;br /&gt;
&lt;br /&gt;
man findet die Werte aus der seitlichen Ansicht&lt;br /&gt;
*Z die vertikale Drehachse der Schulter (bleiben wir mal bei &amp;quot;Schulter&amp;quot;)&lt;br /&gt;
*r&amp;lt;sup&amp;gt;min&amp;lt;/sup&amp;gt; als kleinstmöglicher Radius, den der Fußpunkt beschreiben kann (wenn der Unterschenkel maximal angezogen ist = kleines &amp;amp;alpha;)&lt;br /&gt;
*r&amp;lt;sup&amp;gt;max&amp;lt;/sup&amp;gt; als größtmöglicher Radius (= großes &amp;amp;alpha;)&lt;br /&gt;
*&amp;amp;delta;&amp;lt;sup&amp;gt;max&amp;lt;/sup&amp;gt; das ist der größtmögliche Drehwinkel des Schultergelenks&lt;br /&gt;
&lt;br /&gt;
schraffiert ist der Bereich, in dem sich die &amp;quot;Fußspitze&amp;quot; bewegen kann. &lt;br /&gt;
&lt;br /&gt;
 '''s''' ist somit die größtmögliche Schrittweite (bei gerader Fortbewegung)&lt;br /&gt;
&lt;br /&gt;
und dann noch&lt;br /&gt;
*M ist der Schwerpunkt (oder Mittelpunkt) des gesamten Fahrzeuges&lt;br /&gt;
*br die halbe Breite&lt;br /&gt;
*f der Abstand dieses Beines von der Querachse&lt;br /&gt;
&lt;br /&gt;
==Beinbewegung==&lt;br /&gt;
===Geradeaus===&lt;br /&gt;
Wird das Bein nun für einen Schritt von vorne nach hinten gedreht (durch Drehung des &amp;quot;Schulter&amp;quot;-Servos), würde sich die Fußspitze in einem Kreisbogen bewegen. Unterwegs würde allerdings die Fußspitze nach außen wegrutschen. Am schlimmsten daran ist der Verlust der Haftreibung, von der noch zu sprechen ist.&lt;br /&gt;
&lt;br /&gt;
Das Bein muß also unterwegs so verkürzt werden, daß sich die Fußspitze entlang der geraden Sehne '''s''' bewegt. Und dann muss noch die Winkelgeschwindigkeit des Schultergelenks angepasst werden, da ja auch der Radius kontinuierlich verändert wird.&lt;br /&gt;
===In einer Kurve===&lt;br /&gt;
Um irgendein Fahrzeug in eine Kurve nach rechts zu bringen, kann man z.B. die Räder links schneller drehen lassen. Sowas geht bei Beinen natürlich nicht. Hier muß die Schrittweite variiert werden. &lt;br /&gt;
Und noch eine Tücke in der Kurve: Der Schreitweg '''s''' muss um den Kurvenradius-Mittelpunkt einen Bogen machen. &lt;br /&gt;
&lt;br /&gt;
[[Bild:Podtopc.jpg]]&lt;br /&gt;
&lt;br /&gt;
*P Kurven-Mittelpunkt&lt;br /&gt;
*M Fahrzeugmittelpunkt&lt;br /&gt;
*r&amp;lt;sub&amp;gt;fzg&amp;lt;/sub&amp;gt;Radius des Fahrzeuges um P&lt;br /&gt;
&lt;br /&gt;
==Anordnung der Beine==&lt;br /&gt;
===Hexapods===&lt;br /&gt;
[[Bild:Hextop1.jpg]]&lt;br /&gt;
[[Bild:Hextop2.jpg]]&lt;br /&gt;
&lt;br /&gt;
das sind zwei Möglichkeiten, bei einem Hexpod die Beine anzuordnen. Die linke Variante hat den Vorteil, dass beim Geradeauslauf die Bewegungen der Beine identisch sein können, allerdings den Nachteil, dass der Rumpf länger sein muss (damit sich die Beine nicht in die Quere kommen). Die rechte Bauart hat diesen Nachteil nicht, aber dafür sind die erforderlichen Schrittbewegungen komplizierter.&lt;br /&gt;
&lt;br /&gt;
==Schrittfolge==&lt;br /&gt;
Es ist ja klar, daß wir nicht alle sechs Beine gleichzeitig bewegen können. Man braucht also eine Schrittfolge.&lt;br /&gt;
Hier können mehrere Varianten unterschieden werden. Da ein Spinnenroboter 6 Beine hat und zum stehen 3 Stück (ein Dreieck bildend) ausreichen gibt es: 3:3. Wir können aber auch nur 2 Beine bewegen und 4 auf dem Boden stehen lassen also 2:4 oder alternativ nur ein Bein bewegen und mit den restlichen 5 auf dem Boden stehen, also 5:1. In Kurven ist das ganze noch etwas komplizierter daher beschäftigen wir uns als erstes mit: &lt;br /&gt;
&lt;br /&gt;
===geradeaus 3:3===&lt;br /&gt;
Die folgende Methode wird gerne angewandt, weil sie recht einfach und auch rein mechanisch gemacht werden kann, allerdings ist die Belastung für die Servos bei dieser Variante am grössten, denn nur 3 Beine teilen sich das gesamte Gewicht des Roboters. Die Beine 1, 4 u. 5  bzw. 2, 3 u. 6  werden jeweils gleich angesteuert, phasenmäßig aber um 180 Grad versetzt. &lt;br /&gt;
&lt;br /&gt;
Im linken Bild sind die Beine 2, 3 u. 6 gerade ganz vorne, die anderen Beine 1, 4 u. 5 ganz hinten&lt;br /&gt;
&lt;br /&gt;
[[Bild:Podstp1.jpg]]&lt;br /&gt;
[[Bild:Podstp2.jpg]]&lt;br /&gt;
&lt;br /&gt;
Im rechten Bild sind 2, 3 u. 6 mit ihrer Bewegung fertig, sie haben das Fahrzeug fortbewegt, jetzt kehrt sich die Sache um&lt;br /&gt;
&lt;br /&gt;
'''Schwerpunkt ?'''&lt;br /&gt;
&lt;br /&gt;
Unterstützt wird das ganze Gerät immer an den Fußpunkten der Beine. Verbindet man diese jeweils drei Punkte, ergeben sich zwei Dreiecke, die in den beiden Zeichnungen strichliert angedeutet sind. Teilweise überlappen sie sich, das ist der Bereich, wo sich der Schwerpunkt des ganzen Fahrzeuges befinden darf.&lt;br /&gt;
&lt;br /&gt;
 Und man sieht, dass diese Fläche bemerkenswert klein ist.&lt;br /&gt;
&lt;br /&gt;
Für 3:3 laufen benötigt jedes Bein 2 Stellungen einmal vorn (A) und einmal hinten (B). Zuerst befinden sich die Beine 2,3 u 6 in Stellung A und werden auf dem Boden gleichzeitig in Stellung B bewegt. Dadurch schiebt sich der Roboter um das Stück A zu B nach vorn. Die Beine 1, 4 u 5 bewegen sich in der selben Zeit von Stellung B nach A, jedoch ohne Bodenkontakt. Wird nun diese Sequenz, im wechsel mit 1, 4 u 5 am Boden und 2, 3 u 6 in der Luft, zyklisch ausgeführt, hat man schon ein passables Laufprogramm für gerade aus. &lt;br /&gt;
&lt;br /&gt;
===geradeaus 2:4===&lt;br /&gt;
Bei dieser Variante wird jeweils ein Beinpaar gleichzeitig bewegt. Diese sind günstigerweise:&lt;br /&gt;
1 und 4 (Paar 1); 3 und 6 (Paar 2); 2 und 5 (Paar 3)&lt;br /&gt;
Jedes Beinpaar benötigt jedoch 3 Stellungen: A, B, C. Der Algoritmus teilt sich daher auch in drei Schritte auf I, II und III. &lt;br /&gt;
&lt;br /&gt;
Für Schritt I bringen wir Paar 1 in Stellung A, Paar 2 in Stellung C und Paar 3 in Stellung B. &lt;br /&gt;
Für Schritt II bewegt sich Paar 1 in Stellung B, Paar 2 in Stellung A (diese Bewegung muss ohne Bodenkontakt erfolgen) und Paar 3 in Stellung C. &lt;br /&gt;
Für Schritt III bewegt sich Paar 1 in Stellung C, Paar 2 in Stellung B und Paar 3 in Stellung A (auch wieder in der Luft) &lt;br /&gt;
Ab hier wiederholt sich das Programm&lt;br /&gt;
&lt;br /&gt;
Fazit: Die Bewegungn sind etwas aufwendiger sich zu überlegen und zu programmieren, der Roboter gewinnt aber insgesammt an Stabilität und ist nur etwas langsamer als bei 3:3. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===geradeaus 1:5===&lt;br /&gt;
Diese Variante ist die langsamste, aber dafür am stabilsten, denn das Gewicht verteilt sich auf 5 Standbeine. &lt;br /&gt;
Es werden 6 Stellungen pro Bein benötigt (A, B, C, D, E, F) und 6 Schritte. &lt;br /&gt;
Es gibt mehrere Möglichkeiten der Startaufstellung ich will hier eine kurz Darstellen: &lt;br /&gt;
Bein 1: A -&amp;gt; B  -&amp;gt; C  usw. &amp;lt;br&amp;gt;&lt;br /&gt;
Bein 2: D -&amp;gt; E  -&amp;gt; F &amp;lt;br&amp;gt;&lt;br /&gt;
Bein 3: E -&amp;gt; F  --&amp;gt; A &amp;lt;br&amp;gt;&lt;br /&gt;
Bein 4: B -&amp;gt; C  -&amp;gt; D &amp;lt;br&amp;gt;&lt;br /&gt;
Bein 5: C -&amp;gt; D  -&amp;gt; E &amp;lt;br&amp;gt;&lt;br /&gt;
Bein 6: F --&amp;gt; A -&amp;gt; B &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Pfeile geben an in Welche Stellung sich die Beine als nächstes bewegen, Bein 6 wird sich in die Stellung A bewegen. Dieser Rückstellvorgang muss immer in der Luft erfolgen. So wird sich der Roboter kontinuierlich vorwärts bewegen.&lt;br /&gt;
&lt;br /&gt;
==Hexapods in der Kurve==&lt;br /&gt;
&lt;br /&gt;
Nochmals das Bild von oben &lt;br /&gt;
&lt;br /&gt;
[[Bild:Hextop1.jpg]]&lt;br /&gt;
&lt;br /&gt;
Die effektiven Beinwege '''s''' können auch wie die Räder von einem sechsrädrigen Fahrzeug verstanden werden.&lt;br /&gt;
&lt;br /&gt;
Wenn wir nun eine Kurve beschreiben wollen, verkürzen wir die Wege '''s''' auf einer Seite, dadurch ergibt sich ein Drehpunkt '''P'''&lt;br /&gt;
&lt;br /&gt;
[[Bild:Hexcurv1.jpg]]&lt;br /&gt;
&lt;br /&gt;
Was man sieht: Es muss eigentlich jedes Bein eine individuelle Bewegung machen.&lt;br /&gt;
UND: jedes Bein muss seinen eigenen [[Spinnenbeine#Beinbewegung|Kurvenradius einhalten]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Hexapods drehen===&lt;br /&gt;
Alternativ, etwas einfacher zu programmieren, weil die Stellungen von Oben weiter verwendet werden können ist das Panzer Modell. &lt;br /&gt;
Konkret heisst es, die rechte Seite der Beine bewegt sich weiter nach oben, wärend die linke Seite der Beine sich nach unten bewegt. Dadurch wird der Roboter auf der Stelle gedreht. D.h. die Bewegungsrichtung der Beine ist insgesammt links zu rechts gegenläufig.&lt;br /&gt;
&lt;br /&gt;
==Kräfte am Spinnenbein==&lt;br /&gt;
Da eine genaue Berechnung recht aufwendig ist und von vielen Faktoren zusätzlich stark beeinflusst wird (Dynamik und äußere Einflüsse), soll hier nur eine qualifizierende Betrachtung erfolgen. &lt;br /&gt;
&lt;br /&gt;
Für Beine gibt es zwei völlig unterschiedliche Situationen: &lt;br /&gt;
===Ohne Bodenhaftung===&lt;br /&gt;
(Glatteis)&lt;br /&gt;
[[Bild:Podvec1.jpg]]&lt;br /&gt;
&lt;br /&gt;
Die Beine werden auseinandergedrückt. Das Kniegelenk muß versuchen, Ober- und Unterschenkel beisammenzuhalten, und in der Schulter muss das anteilige Gewicht des Fahrzeuges getragen werden. Durch die langen Hebel wird da, je nach Beinstellung, eine beachtliche Kraft erforderlich.&lt;br /&gt;
&lt;br /&gt;
===Mit Bodenhaftung===&lt;br /&gt;
(Teppich)&lt;br /&gt;
[[Bild:Podvec2.jpg]]&lt;br /&gt;
&lt;br /&gt;
Ganz anders bei ausreichender Haftung: Da die Füße ja nicht wegrutschen, zieht das Gewicht des Fahrzeuges über die Oberschenkel die Knie nach innen. Hier müssen die Oberschenkel nach außen stemmen, um dem entgegenzuwirken. &lt;br /&gt;
&lt;br /&gt;
''Bitte beachten, die Beine können auch günstiger als auf dem Bild dargestellt, eingerichtet werden. Wenn der Oberschenkel waagrecht zum Roboterkörper ist. Muss das Schultergelenk zwar das gesammte Gewicht des Roboters tragen, aber das Kniegelenk wird praktisch vollständig entlastet. Auch bei Eis als Untergrund würde ein Wegrutschen der Beine so verhindert werden. ''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Ein Rechenbeispiel====&lt;br /&gt;
Des weiteren ist es wichtig zu erwähnen, dass je nach Bauart des Beines, also welche die sich weiter an der Seite vom Bot befinden, enorme Hebelkräfte auftreten. Um die passenden Servos für seinen Roboter heraus zu suchen hier ein Rechenbeispiel: &lt;br /&gt;
&lt;br /&gt;
[[Bild:Beine65.jpg]]&lt;br /&gt;
&lt;br /&gt;
Gegeben sei &amp;quot;a&amp;quot; als größtmöglicher Abstand zum Körper (blau).&lt;br /&gt;
Je nach Bauart des Roboters und der Wahl der Bewegung sind entweder 3 oder 4 oder gar 5 Beine gleichzeit am Boden. Auf diese wird das gesammte Gewicht des Roboter verteilt. Uns interessiert an dieser Stelle wieviel Ncm im Schultergelenk notwendig sind um den Roboter hochzudrücken. Aus der Zeichnung wird wieder deutlich warum es sinnvoll ist den Unterschenkel möglichst senkrecht zu halten und den Oberschenkel waagrecht. Unter dieser Positionierung muss das Kniegelenk nämlich kein Drehmoment übertragen. &lt;br /&gt;
&lt;br /&gt;
Aber zurück zur Rechnung. &lt;br /&gt;
&lt;br /&gt;
das Drehmoment in der Schulter wird wie folgt berechnet: &lt;br /&gt;
(Gewicht /Anzahl der Beine)* Hebelarm = Drehmoment in der Schulter&lt;br /&gt;
&lt;br /&gt;
in unserem Beispielt &lt;br /&gt;
a=10cm; G=1kg--&amp;gt; 1kg * 9,81m/s² = 9,81N ~ 10N; 3Beine am Boden&lt;br /&gt;
&lt;br /&gt;
(10N / 3)* 10cm = 33,3Ncm&lt;br /&gt;
    &lt;br /&gt;
Wir benötigen also in der Schulter Servos welche mindestens 33,3Ncm schaffen, zur Sicherheit wären 35Ncm sinnvoller. &lt;br /&gt;
Die Rechnung lässt sich natürlich auch so umstellen, dass anhand der Servos das Gesamtgewicht ermittelt werden kann: &lt;br /&gt;
&lt;br /&gt;
(Drehmoment der Servos / Hebelarm)* Anzahl der Beine = Gewicht des Roboters&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dasselbe gilt natürlich auch für Quadropods. Nur muss man die Faktoren der Anzahl der Beine ändern&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[Servos]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Mechanik]]&lt;br /&gt;
[[Kategorie:Praxis]]&lt;br /&gt;
&lt;br /&gt;
[http://www.lynxmotion.com Lynxmotion, Referenz für Roboter mit Beinen]&lt;/div&gt;</summary>
		<author><name>HannoHupmann</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Spinnenbeine_(Hexapods)&amp;diff=10178</id>
		<title>Spinnenbeine (Hexapods)</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Spinnenbeine_(Hexapods)&amp;diff=10178"/>
				<updated>2007-02-18T20:31:35Z</updated>
		
		<summary type="html">&lt;p&gt;HannoHupmann: Spinnenbeine wurde nach Spinnenbeine (Hexapods) verschoben&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Spinnenbeine, Hexapods, Quadropods und Polypods==&lt;br /&gt;
&lt;br /&gt;
Wenn man sich erstmal nicht damit zufriedengibt, einfach mit den Beinen irgendwie herumzurudern (&amp;quot;Hauptsache, es bewegt sich&amp;quot;), sind Beinbewegungen gar nicht so ohne. &lt;br /&gt;
&lt;br /&gt;
Schauen wir uns mal die häufigste Variante an, das sind die echsen- oder spinnenartigen Bauformen. Hauptmerkmal ist, dass die Beine seitlich am Körper angebracht sind.&lt;br /&gt;
&lt;br /&gt;
Dabei können folgende Anordnungen und Beine unterschieden werden: &lt;br /&gt;
Die auf dem Bild gezeigte anordnung von 3 Beinen links so wie rechts ist die gängigste für Hexabots. Alternativ können die Beine auch in einem Sechseck angeordnet werden (siehe auch Bild weiter unten). Diese Anordnung hat den Vorteil, dass sie etwas wendiger ist, dies erkauft man sich durch eine etwas komplizierte Programmierung. Denn die Beinstellungen sind hier aufwendiger. &lt;br /&gt;
&lt;br /&gt;
Roboter mit nur 4 Beinen werden gemeinhin als Quadropods bezeichnet. &lt;br /&gt;
Roboter mit mehr als 6 Beinen werden als Polypod bezeichnet.&lt;br /&gt;
&lt;br /&gt;
==Ein Beinpaar im Querschnitt==&lt;br /&gt;
Das hier dargestellte Bein hat 3 Gelenke (jedoch sind nur 2 sichtbar). Einmal ein Gelenk an der Schulter und eines am Knie, das nicht sichtbare ist in der ansicht von Oben dafür verantwortlich das Bein vor und zurück zu bewegen. &lt;br /&gt;
Somit hat diese Bein 3 Freiheitsgrade (1x Knie, 1x Schulter (auf und ab) und 1x Schulter (vor zurück) dies wird oft auch als 3DOF (Degree of Freedom) bezeichnet. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:Podlegside.jpg]]&lt;br /&gt;
&lt;br /&gt;
(Die Beinhaltung ist hier ganz allgemein gehalten, tatsächlich sind da große Unterschiede, je nach Bauart.)&lt;br /&gt;
*Z ist die vertikale Drehachse des &amp;quot;Schulter&amp;quot;-Gelenks&lt;br /&gt;
*h ist die Höhe des Körpers über dem Boden&lt;br /&gt;
*a ist der Oberschenkel&lt;br /&gt;
*&amp;amp;beta; der Winkel des Oberschenkels&lt;br /&gt;
*K ist das Knie&lt;br /&gt;
*b ist der Unterschenkel &lt;br /&gt;
*&amp;amp;alpha; der Winkel im Knie &lt;br /&gt;
*F ist der Fußpunkt&lt;br /&gt;
*&amp;amp;gamma; der Winkel, den der Unterschenkel mit dem Boden einnimmt&lt;br /&gt;
*r ist der resultierende Radius des Fußpunktes um die Schulter&lt;br /&gt;
*M der Schwerpunkt unseres Roboters &lt;br /&gt;
*br der Abstand des Schwerpunkts bis zur Schulter&lt;br /&gt;
&lt;br /&gt;
==Variante &amp;quot;Lynxmotion&amp;quot;==&lt;br /&gt;
[[Bild:Podlynx.jpg]]&lt;br /&gt;
&lt;br /&gt;
Hier ist der Oberschenkel gewissermaßen geteilt. Der vertikal bewegliche Teil davon ist sehr kurz und als Parallelogramm ausgeführt, um den Unterschenkel senkrecht halten zu können. Dieser kann aktiv nur gehoben und gesenkt werden, durch Federn hat er aber ein gewisses seitliches Spiel.&lt;br /&gt;
&lt;br /&gt;
Der Zweck dieser Konstruktion ist es, das Schultergelenk mit nur einem Freiheitsgrad sehr robust ausführen zu können.&lt;br /&gt;
Diese Variante der Beine hat also insgesammt nur 2 Freiheitsgrade (Schulter und heben, senken) und wird oft auch als DOF2 bezeichnet.&lt;br /&gt;
&lt;br /&gt;
==Ein (linkes) Bein von oben==&lt;br /&gt;
&lt;br /&gt;
[[Bild:Podlegtop.jpg]]&lt;br /&gt;
&lt;br /&gt;
man findet die Werte aus der seitlichen Ansicht&lt;br /&gt;
*Z die vertikale Drehachse der Schulter (bleiben wir mal bei &amp;quot;Schulter&amp;quot;)&lt;br /&gt;
*r&amp;lt;sup&amp;gt;min&amp;lt;/sup&amp;gt; als kleinstmöglicher Radius, den der Fußpunkt beschreiben kann (wenn der Unterschenkel maximal angezogen ist = kleines &amp;amp;alpha;)&lt;br /&gt;
*r&amp;lt;sup&amp;gt;max&amp;lt;/sup&amp;gt; als größtmöglicher Radius (= großes &amp;amp;alpha;)&lt;br /&gt;
*&amp;amp;delta;&amp;lt;sup&amp;gt;max&amp;lt;/sup&amp;gt; das ist der größtmögliche Drehwinkel des Schultergelenks&lt;br /&gt;
&lt;br /&gt;
schraffiert ist der Bereich, in dem sich die &amp;quot;Fußspitze&amp;quot; bewegen kann. &lt;br /&gt;
&lt;br /&gt;
 '''s''' ist somit die größtmögliche Schrittweite (bei gerader Fortbewegung)&lt;br /&gt;
&lt;br /&gt;
und dann noch&lt;br /&gt;
*M ist der Schwerpunkt (oder Mittelpunkt) des gesamten Fahrzeuges&lt;br /&gt;
*br die halbe Breite&lt;br /&gt;
*f der Abstand dieses Beines von der Querachse&lt;br /&gt;
&lt;br /&gt;
==Beinbewegung==&lt;br /&gt;
===Geradeaus===&lt;br /&gt;
Wird das Bein nun für einen Schritt von vorne nach hinten gedreht (durch Drehung des &amp;quot;Schulter&amp;quot;-Servos), würde sich die Fußspitze in einem Kreisbogen bewegen. Unterwegs würde allerdings die Fußspitze nach außen wegrutschen. Am schlimmsten daran ist der Verlust der Haftreibung, von der noch zu sprechen ist.&lt;br /&gt;
&lt;br /&gt;
Das Bein muß also unterwegs so verkürzt werden, daß sich die Fußspitze entlang der geraden Sehne '''s''' bewegt. Und dann muss noch die Winkelgeschwindigkeit des Schultergelenks angepasst werden, da ja auch der Radius kontinuierlich verändert wird.&lt;br /&gt;
===In einer Kurve===&lt;br /&gt;
Um irgendein Fahrzeug in eine Kurve nach rechts zu bringen, kann man z.B. die Räder links schneller drehen lassen. Sowas geht bei Beinen natürlich nicht. Hier muß die Schrittweite variiert werden. &lt;br /&gt;
Und noch eine Tücke in der Kurve: Der Schreitweg '''s''' muss um den Kurvenradius-Mittelpunkt einen Bogen machen. &lt;br /&gt;
&lt;br /&gt;
[[Bild:Podtopc.jpg]]&lt;br /&gt;
&lt;br /&gt;
*P Kurven-Mittelpunkt&lt;br /&gt;
*M Fahrzeugmittelpunkt&lt;br /&gt;
*r&amp;lt;sub&amp;gt;fzg&amp;lt;/sub&amp;gt;Radius des Fahrzeuges um P&lt;br /&gt;
&lt;br /&gt;
==Anordnung der Beine==&lt;br /&gt;
===Hexapods===&lt;br /&gt;
[[Bild:Hextop1.jpg]]&lt;br /&gt;
[[Bild:Hextop2.jpg]]&lt;br /&gt;
&lt;br /&gt;
das sind zwei Möglichkeiten, bei einem Hexpod die Beine anzuordnen. Die linke Variante hat den Vorteil, dass beim Geradeauslauf die Bewegungen der Beine identisch sein können, allerdings den Nachteil, dass der Rumpf länger sein muss (damit sich die Beine nicht in die Quere kommen). Die rechte Bauart hat diesen Nachteil nicht, aber dafür sind die erforderlichen Schrittbewegungen komplizierter.&lt;br /&gt;
&lt;br /&gt;
==Schrittfolge==&lt;br /&gt;
Es ist ja klar, daß wir nicht alle sechs Beine gleichzeitig bewegen können. Man braucht also eine Schrittfolge.&lt;br /&gt;
Hier können mehrere Varianten unterschieden werden. Da ein Spinnenroboter 6 Beine hat und zum stehen 3 Stück (ein Dreieck bildend) ausreichen gibt es: 3:3. Wir können aber auch nur 2 Beine bewegen und 4 auf dem Boden stehen lassen also 2:4 oder alternativ nur ein Bein bewegen und mit den restlichen 5 auf dem Boden stehen, also 5:1. In Kurven ist das ganze noch etwas komplizierter daher beschäftigen wir uns als erstes mit: &lt;br /&gt;
&lt;br /&gt;
===geradeaus 3:3===&lt;br /&gt;
Die folgende Methode wird gerne angewandt, weil sie recht einfach und auch rein mechanisch gemacht werden kann, allerdings ist die Belastung für die Servos bei dieser Variante am grössten, denn nur 3 Beine teilen sich das gesamte Gewicht des Roboters. Die Beine 1, 4 u. 5  bzw. 2, 3 u. 6  werden jeweils gleich angesteuert, phasenmäßig aber um 180 Grad versetzt. &lt;br /&gt;
&lt;br /&gt;
Im linken Bild sind die Beine 2, 3 u. 6 gerade ganz vorne, die anderen Beine 1, 4 u. 5 ganz hinten&lt;br /&gt;
&lt;br /&gt;
[[Bild:Podstp1.jpg]]&lt;br /&gt;
[[Bild:Podstp2.jpg]]&lt;br /&gt;
&lt;br /&gt;
Im rechten Bild sind 2, 3 u. 6 mit ihrer Bewegung fertig, sie haben das Fahrzeug fortbewegt, jetzt kehrt sich die Sache um&lt;br /&gt;
&lt;br /&gt;
'''Schwerpunkt ?'''&lt;br /&gt;
&lt;br /&gt;
Unterstützt wird das ganze Gerät immer an den Fußpunkten der Beine. Verbindet man diese jeweils drei Punkte, ergeben sich zwei Dreiecke, die in den beiden Zeichnungen strichliert angedeutet sind. Teilweise überlappen sie sich, das ist der Bereich, wo sich der Schwerpunkt des ganzen Fahrzeuges befinden darf.&lt;br /&gt;
&lt;br /&gt;
 Und man sieht, dass diese Fläche bemerkenswert klein ist.&lt;br /&gt;
&lt;br /&gt;
Für 3:3 laufen benötigt jedes Bein 2 Stellungen einmal vorn (A) und einmal hinten (B). Zuerst befinden sich die Beine 2,3 u 6 in Stellung A und werden auf dem Boden gleichzeitig in Stellung B bewegt. Dadurch schiebt sich der Roboter um das Stück A zu B nach vorn. Die Beine 1, 4 u 5 bewegen sich in der selben Zeit von Stellung B nach A, jedoch ohne Bodenkontakt. Wird nun diese Sequenz, im wechsel mit 1, 4 u 5 am Boden und 2, 3 u 6 in der Luft, zyklisch ausgeführt, hat man schon ein passables Laufprogramm für gerade aus. &lt;br /&gt;
&lt;br /&gt;
===geradeaus 2:4===&lt;br /&gt;
Bei dieser Variante wird jeweils ein Beinpaar gleichzeitig bewegt. Diese sind günstigerweise:&lt;br /&gt;
1 und 4 (Paar 1); 3 und 6 (Paar 2); 2 und 5 (Paar 3)&lt;br /&gt;
Jedes Beinpaar benötigt jedoch 3 Stellungen: A, B, C. Der Algoritmus teilt sich daher auch in drei Schritte auf I, II und III. &lt;br /&gt;
&lt;br /&gt;
Für Schritt I bringen wir Paar 1 in Stellung A, Paar 2 in Stellung C und Paar 3 in Stellung B. &lt;br /&gt;
Für Schritt II bewegt sich Paar 1 in Stellung B, Paar 2 in Stellung A (diese Bewegung muss ohne Bodenkontakt erfolgen) und Paar 3 in Stellung C. &lt;br /&gt;
Für Schritt III bewegt sich Paar 1 in Stellung C, Paar 2 in Stellung B und Paar 3 in Stellung A (auch wieder in der Luft) &lt;br /&gt;
Ab hier wiederholt sich das Programm&lt;br /&gt;
&lt;br /&gt;
Fazit: Die Bewegungn sind etwas aufwendiger sich zu überlegen und zu programmieren, der Roboter gewinnt aber insgesammt an Stabilität und ist nur etwas langsamer als bei 3:3. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===geradeaus 1:5===&lt;br /&gt;
Diese Variante ist die langsamste, aber dafür am stabilsten, denn das Gewicht verteilt sich auf 5 Standbeine. &lt;br /&gt;
Es werden 6 Stellungen pro Bein benötigt (A, B, C, D, E, F) und 6 Schritte. &lt;br /&gt;
Es gibt mehrere Möglichkeiten der Startaufstellung ich will hier eine kurz Darstellen: &lt;br /&gt;
Bein 1: A -&amp;gt; B  -&amp;gt; C  usw. &amp;lt;br&amp;gt;&lt;br /&gt;
Bein 2: D -&amp;gt; E  -&amp;gt; F &amp;lt;br&amp;gt;&lt;br /&gt;
Bein 3: E -&amp;gt; F  --&amp;gt; A &amp;lt;br&amp;gt;&lt;br /&gt;
Bein 4: B -&amp;gt; C  -&amp;gt; D &amp;lt;br&amp;gt;&lt;br /&gt;
Bein 5: C -&amp;gt; D  -&amp;gt; E &amp;lt;br&amp;gt;&lt;br /&gt;
Bein 6: F --&amp;gt; A -&amp;gt; B &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Pfeile geben an in Welche Stellung sich die Beine als nächstes bewegen, Bein 6 wird sich in die Stellung A bewegen. Dieser Rückstellvorgang muss immer in der Luft erfolgen. So wird sich der Roboter kontinuierlich vorwärts bewegen.&lt;br /&gt;
&lt;br /&gt;
==Hexapods in der Kurve==&lt;br /&gt;
&lt;br /&gt;
Nochmals das Bild von oben &lt;br /&gt;
&lt;br /&gt;
[[Bild:Hextop1.jpg]]&lt;br /&gt;
&lt;br /&gt;
Die effektiven Beinwege '''s''' können auch wie die Räder von einem sechsrädrigen Fahrzeug verstanden werden.&lt;br /&gt;
&lt;br /&gt;
Wenn wir nun eine Kurve beschreiben wollen, verkürzen wir die Wege '''s''' auf einer Seite, dadurch ergibt sich ein Drehpunkt '''P'''&lt;br /&gt;
&lt;br /&gt;
[[Bild:Hexcurv1.jpg]]&lt;br /&gt;
&lt;br /&gt;
Was man sieht: Es muss eigentlich jedes Bein eine individuelle Bewegung machen.&lt;br /&gt;
UND: jedes Bein muss seinen eigenen [[Spinnenbeine#Beinbewegung|Kurvenradius einhalten]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Hexapods drehen===&lt;br /&gt;
Alternativ, etwas einfacher zu programmieren, weil die Stellungen von Oben weiter verwendet werden können ist das Panzer Modell. &lt;br /&gt;
Konkret heisst es, die rechte Seite der Beine bewegt sich weiter nach oben, wärend die linke Seite der Beine sich nach unten bewegt. Dadurch wird der Roboter auf der Stelle gedreht. D.h. die Bewegungsrichtung der Beine ist insgesammt links zu rechts gegenläufig.&lt;br /&gt;
&lt;br /&gt;
==Kräfte am Spinnenbein==&lt;br /&gt;
Da eine genaue Berechnung recht aufwendig ist und von vielen Faktoren zusätzlich stark beeinflusst wird (Dynamik und äußere Einflüsse), soll hier nur eine qualifizierende Betrachtung erfolgen. &lt;br /&gt;
&lt;br /&gt;
Für Beine gibt es zwei völlig unterschiedliche Situationen: &lt;br /&gt;
===Ohne Bodenhaftung===&lt;br /&gt;
(Glatteis)&lt;br /&gt;
[[Bild:Podvec1.jpg]]&lt;br /&gt;
&lt;br /&gt;
Die Beine werden auseinandergedrückt. Das Kniegelenk muß versuchen, Ober- und Unterschenkel beisammenzuhalten, und in der Schulter muss das anteilige Gewicht des Fahrzeuges getragen werden. Durch die langen Hebel wird da, je nach Beinstellung, eine beachtliche Kraft erforderlich.&lt;br /&gt;
&lt;br /&gt;
===Mit Bodenhaftung===&lt;br /&gt;
(Teppich)&lt;br /&gt;
[[Bild:Podvec2.jpg]]&lt;br /&gt;
&lt;br /&gt;
Ganz anders bei ausreichender Haftung: Da die Füße ja nicht wegrutschen, zieht das Gewicht des Fahrzeuges über die Oberschenkel die Knie nach innen. Hier müssen die Oberschenkel nach außen stemmen, um dem entgegenzuwirken. &lt;br /&gt;
&lt;br /&gt;
''Bitte beachten, die Beine können auch günstiger als auf dem Bild dargestellt, eingerichtet werden. Wenn der Oberschenkel waagrecht zum Roboterkörper ist. Muss das Schultergelenk zwar das gesammte Gewicht des Roboters tragen, aber das Kniegelenk wird praktisch vollständig entlastet. Auch bei Eis als Untergrund würde ein Wegrutschen der Beine so verhindert werden. ''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Ein Rechenbeispiel====&lt;br /&gt;
Des weiteren ist es wichtig zu erwähnen, dass je nach Bauart des Beines, also welche die sich weiter an der Seite vom Bot befinden, enorme Hebelkräfte auftreten. Um die passenden Servos für seinen Roboter heraus zu suchen hier ein Rechenbeispiel: &lt;br /&gt;
&lt;br /&gt;
[[Bild:Beine65.jpg]]&lt;br /&gt;
&lt;br /&gt;
Gegeben sei &amp;quot;a&amp;quot; als größtmöglicher Abstand zum Körper (blau).&lt;br /&gt;
Je nach Bauart des Roboters und der Wahl der Bewegung sind entweder 3 oder 4 oder gar 5 Beine gleichzeit am Boden. Auf diese wird das gesammte Gewicht des Roboter verteilt. Uns interessiert an dieser Stelle wieviel Ncm im Schultergelenk notwendig sind um den Roboter hochzudrücken. Aus der Zeichnung wird wieder deutlich warum es sinnvoll ist den Unterschenkel möglichst senkrecht zu halten und den Oberschenkel waagrecht. Unter dieser Positionierung muss das Kniegelenk nämlich kein Drehmoment übertragen. &lt;br /&gt;
&lt;br /&gt;
Aber zurück zur Rechnung. &lt;br /&gt;
&lt;br /&gt;
das Drehmoment in der Schulter wird wie folgt berechnet: &lt;br /&gt;
(Gewicht /Anzahl der Beine)* Hebelarm = Drehmoment in der Schulter&lt;br /&gt;
&lt;br /&gt;
in unserem Beispielt &lt;br /&gt;
a=10cm; G=1kg--&amp;gt; 1kg * 9,81m/s² = 9,81N ~ 10N; 3Beine am Boden&lt;br /&gt;
&lt;br /&gt;
(10N / 3)* 10cm = 33,3Ncm&lt;br /&gt;
    &lt;br /&gt;
Wir benötigen also in der Schulter Servos welche mindestens 33,3Ncm schaffen, zur Sicherheit wären 35Ncm sinnvoller. &lt;br /&gt;
Die Rechnung lässt sich natürlich auch so umstellen, dass anhand der Servos das Gesamtgewicht ermittelt werden kann: &lt;br /&gt;
&lt;br /&gt;
(Drehmoment der Servos / Hebelarm)* Anzahl der Beine = Gewicht des Roboters&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dasselbe gilt natürlich auch für Quadropods. Nur muss man die Faktoren der Anzahl der Beine ändern&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[Servos]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Mechanik]]&lt;br /&gt;
[[Kategorie:Praxis]]&lt;br /&gt;
&lt;br /&gt;
[http://www.lynxmotion.com Lynxmotion, Referenz für Roboter mit Beinen]&lt;/div&gt;</summary>
		<author><name>HannoHupmann</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Spinnenbeine&amp;diff=10179</id>
		<title>Spinnenbeine</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Spinnenbeine&amp;diff=10179"/>
				<updated>2007-02-18T20:31:35Z</updated>
		
		<summary type="html">&lt;p&gt;HannoHupmann: Spinnenbeine wurde nach Spinnenbeine (Hexapods) verschoben: Da Spinnenbeine im Regelfall für Hexa, Poly und Quadropods verwendet werden und so Einsteigern der Einstieg erleidert wird.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#redirect [[Spinnenbeine (Hexapods)]]&lt;/div&gt;</summary>
		<author><name>HannoHupmann</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Diskussion:Spinnenbeine_(Hexapods)&amp;diff=10180</id>
		<title>Diskussion:Spinnenbeine (Hexapods)</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Diskussion:Spinnenbeine_(Hexapods)&amp;diff=10180"/>
				<updated>2007-02-18T20:31:35Z</updated>
		
		<summary type="html">&lt;p&gt;HannoHupmann: Diskussion:Spinnenbeine wurde nach Diskussion:Spinnenbeine (Hexapods) verschoben&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ich glaube, die 4-Bein Version heißt eigentlich  Tetrapod. Oder gibt es da verschiedene Namen ? &lt;br /&gt;
&lt;br /&gt;
--PicNick 18:56, 17. Dez 2005 (CET)&lt;br /&gt;
&lt;br /&gt;
== Tetrapod ==&lt;br /&gt;
&lt;br /&gt;
Gebräuchlicher ist Quadrobot. &lt;br /&gt;
&lt;br /&gt;
Achja ich hab mir erlaubt den Artikel zu erweitern.&lt;br /&gt;
-- HannoHupmann 18:41 14. Sep 2006 (CET)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Ich werde den Artikel in den nächsten Tagen komplett erneuern, um den Stil des Wikis ein wenig anzuheben ;-)&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Ist ja schon etwas länger her die Anmerkung von PicNick,&lt;br /&gt;
aber wenn man sich die herkunft anschaut, macht die Bezeichnung Tetrapod mehr Sinn, denn beides kommt dann aus dem griechischen: vier (griechisch tetra), Füße (griechisch podes)&lt;br /&gt;
&lt;br /&gt;
Die Verwendung von Quadrobot lässt noch nicht direkt auf vier Beine schliessen, könnten auch vier Räder sein, man kann es nur mit einem Roboter in Verbindung bringen weil es mit bot endet.&lt;br /&gt;
&lt;br /&gt;
Aber die Verwendung von verschiedenen Sprachräumen hat die IT-Leute noch nie von etwas abgehalten, siehe Hexadezimalsystem ;-)&lt;br /&gt;
--[[Benutzer:Linux 80|Linux 80]] 15:15, 15. Sep 2006 (CEST)&lt;/div&gt;</summary>
		<author><name>HannoHupmann</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Diskussion:Spinnenbeine&amp;diff=10181</id>
		<title>Diskussion:Spinnenbeine</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Diskussion:Spinnenbeine&amp;diff=10181"/>
				<updated>2007-02-18T20:31:35Z</updated>
		
		<summary type="html">&lt;p&gt;HannoHupmann: Diskussion:Spinnenbeine wurde nach Diskussion:Spinnenbeine (Hexapods) verschoben: Da Spinnenbeine im Regelfall für Hexa, Poly und Quadropods verwendet werden und so Einsteigern der Einstieg erleidert wird.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#redirect [[Diskussion:Spinnenbeine (Hexapods)]]&lt;/div&gt;</summary>
		<author><name>HannoHupmann</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Spinnenbeine_(Hexapods)&amp;diff=10177</id>
		<title>Spinnenbeine (Hexapods)</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Spinnenbeine_(Hexapods)&amp;diff=10177"/>
				<updated>2007-02-18T20:28:42Z</updated>
		
		<summary type="html">&lt;p&gt;HannoHupmann: /* Ein Rechenbeispiel */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Spinnenbeine, Hexapods, Quadropods und Polypods==&lt;br /&gt;
&lt;br /&gt;
Wenn man sich erstmal nicht damit zufriedengibt, einfach mit den Beinen irgendwie herumzurudern (&amp;quot;Hauptsache, es bewegt sich&amp;quot;), sind Beinbewegungen gar nicht so ohne. &lt;br /&gt;
&lt;br /&gt;
Schauen wir uns mal die häufigste Variante an, das sind die echsen- oder spinnenartigen Bauformen. Hauptmerkmal ist, dass die Beine seitlich am Körper angebracht sind.&lt;br /&gt;
&lt;br /&gt;
Dabei können folgende Anordnungen und Beine unterschieden werden: &lt;br /&gt;
Die auf dem Bild gezeigte anordnung von 3 Beinen links so wie rechts ist die gängigste für Hexabots. Alternativ können die Beine auch in einem Sechseck angeordnet werden (siehe auch Bild weiter unten). Diese Anordnung hat den Vorteil, dass sie etwas wendiger ist, dies erkauft man sich durch eine etwas komplizierte Programmierung. Denn die Beinstellungen sind hier aufwendiger. &lt;br /&gt;
&lt;br /&gt;
Roboter mit nur 4 Beinen werden gemeinhin als Quadropods bezeichnet. &lt;br /&gt;
Roboter mit mehr als 6 Beinen werden als Polypod bezeichnet.&lt;br /&gt;
&lt;br /&gt;
==Ein Beinpaar im Querschnitt==&lt;br /&gt;
Das hier dargestellte Bein hat 3 Gelenke (jedoch sind nur 2 sichtbar). Einmal ein Gelenk an der Schulter und eines am Knie, das nicht sichtbare ist in der ansicht von Oben dafür verantwortlich das Bein vor und zurück zu bewegen. &lt;br /&gt;
Somit hat diese Bein 3 Freiheitsgrade (1x Knie, 1x Schulter (auf und ab) und 1x Schulter (vor zurück) dies wird oft auch als 3DOF (Degree of Freedom) bezeichnet. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:Podlegside.jpg]]&lt;br /&gt;
&lt;br /&gt;
(Die Beinhaltung ist hier ganz allgemein gehalten, tatsächlich sind da große Unterschiede, je nach Bauart.)&lt;br /&gt;
*Z ist die vertikale Drehachse des &amp;quot;Schulter&amp;quot;-Gelenks&lt;br /&gt;
*h ist die Höhe des Körpers über dem Boden&lt;br /&gt;
*a ist der Oberschenkel&lt;br /&gt;
*&amp;amp;beta; der Winkel des Oberschenkels&lt;br /&gt;
*K ist das Knie&lt;br /&gt;
*b ist der Unterschenkel &lt;br /&gt;
*&amp;amp;alpha; der Winkel im Knie &lt;br /&gt;
*F ist der Fußpunkt&lt;br /&gt;
*&amp;amp;gamma; der Winkel, den der Unterschenkel mit dem Boden einnimmt&lt;br /&gt;
*r ist der resultierende Radius des Fußpunktes um die Schulter&lt;br /&gt;
*M der Schwerpunkt unseres Roboters &lt;br /&gt;
*br der Abstand des Schwerpunkts bis zur Schulter&lt;br /&gt;
&lt;br /&gt;
==Variante &amp;quot;Lynxmotion&amp;quot;==&lt;br /&gt;
[[Bild:Podlynx.jpg]]&lt;br /&gt;
&lt;br /&gt;
Hier ist der Oberschenkel gewissermaßen geteilt. Der vertikal bewegliche Teil davon ist sehr kurz und als Parallelogramm ausgeführt, um den Unterschenkel senkrecht halten zu können. Dieser kann aktiv nur gehoben und gesenkt werden, durch Federn hat er aber ein gewisses seitliches Spiel.&lt;br /&gt;
&lt;br /&gt;
Der Zweck dieser Konstruktion ist es, das Schultergelenk mit nur einem Freiheitsgrad sehr robust ausführen zu können.&lt;br /&gt;
Diese Variante der Beine hat also insgesammt nur 2 Freiheitsgrade (Schulter und heben, senken) und wird oft auch als DOF2 bezeichnet.&lt;br /&gt;
&lt;br /&gt;
==Ein (linkes) Bein von oben==&lt;br /&gt;
&lt;br /&gt;
[[Bild:Podlegtop.jpg]]&lt;br /&gt;
&lt;br /&gt;
man findet die Werte aus der seitlichen Ansicht&lt;br /&gt;
*Z die vertikale Drehachse der Schulter (bleiben wir mal bei &amp;quot;Schulter&amp;quot;)&lt;br /&gt;
*r&amp;lt;sup&amp;gt;min&amp;lt;/sup&amp;gt; als kleinstmöglicher Radius, den der Fußpunkt beschreiben kann (wenn der Unterschenkel maximal angezogen ist = kleines &amp;amp;alpha;)&lt;br /&gt;
*r&amp;lt;sup&amp;gt;max&amp;lt;/sup&amp;gt; als größtmöglicher Radius (= großes &amp;amp;alpha;)&lt;br /&gt;
*&amp;amp;delta;&amp;lt;sup&amp;gt;max&amp;lt;/sup&amp;gt; das ist der größtmögliche Drehwinkel des Schultergelenks&lt;br /&gt;
&lt;br /&gt;
schraffiert ist der Bereich, in dem sich die &amp;quot;Fußspitze&amp;quot; bewegen kann. &lt;br /&gt;
&lt;br /&gt;
 '''s''' ist somit die größtmögliche Schrittweite (bei gerader Fortbewegung)&lt;br /&gt;
&lt;br /&gt;
und dann noch&lt;br /&gt;
*M ist der Schwerpunkt (oder Mittelpunkt) des gesamten Fahrzeuges&lt;br /&gt;
*br die halbe Breite&lt;br /&gt;
*f der Abstand dieses Beines von der Querachse&lt;br /&gt;
&lt;br /&gt;
==Beinbewegung==&lt;br /&gt;
===Geradeaus===&lt;br /&gt;
Wird das Bein nun für einen Schritt von vorne nach hinten gedreht (durch Drehung des &amp;quot;Schulter&amp;quot;-Servos), würde sich die Fußspitze in einem Kreisbogen bewegen. Unterwegs würde allerdings die Fußspitze nach außen wegrutschen. Am schlimmsten daran ist der Verlust der Haftreibung, von der noch zu sprechen ist.&lt;br /&gt;
&lt;br /&gt;
Das Bein muß also unterwegs so verkürzt werden, daß sich die Fußspitze entlang der geraden Sehne '''s''' bewegt. Und dann muss noch die Winkelgeschwindigkeit des Schultergelenks angepasst werden, da ja auch der Radius kontinuierlich verändert wird.&lt;br /&gt;
===In einer Kurve===&lt;br /&gt;
Um irgendein Fahrzeug in eine Kurve nach rechts zu bringen, kann man z.B. die Räder links schneller drehen lassen. Sowas geht bei Beinen natürlich nicht. Hier muß die Schrittweite variiert werden. &lt;br /&gt;
Und noch eine Tücke in der Kurve: Der Schreitweg '''s''' muss um den Kurvenradius-Mittelpunkt einen Bogen machen. &lt;br /&gt;
&lt;br /&gt;
[[Bild:Podtopc.jpg]]&lt;br /&gt;
&lt;br /&gt;
*P Kurven-Mittelpunkt&lt;br /&gt;
*M Fahrzeugmittelpunkt&lt;br /&gt;
*r&amp;lt;sub&amp;gt;fzg&amp;lt;/sub&amp;gt;Radius des Fahrzeuges um P&lt;br /&gt;
&lt;br /&gt;
==Anordnung der Beine==&lt;br /&gt;
===Hexapods===&lt;br /&gt;
[[Bild:Hextop1.jpg]]&lt;br /&gt;
[[Bild:Hextop2.jpg]]&lt;br /&gt;
&lt;br /&gt;
das sind zwei Möglichkeiten, bei einem Hexpod die Beine anzuordnen. Die linke Variante hat den Vorteil, dass beim Geradeauslauf die Bewegungen der Beine identisch sein können, allerdings den Nachteil, dass der Rumpf länger sein muss (damit sich die Beine nicht in die Quere kommen). Die rechte Bauart hat diesen Nachteil nicht, aber dafür sind die erforderlichen Schrittbewegungen komplizierter.&lt;br /&gt;
&lt;br /&gt;
==Schrittfolge==&lt;br /&gt;
Es ist ja klar, daß wir nicht alle sechs Beine gleichzeitig bewegen können. Man braucht also eine Schrittfolge.&lt;br /&gt;
Hier können mehrere Varianten unterschieden werden. Da ein Spinnenroboter 6 Beine hat und zum stehen 3 Stück (ein Dreieck bildend) ausreichen gibt es: 3:3. Wir können aber auch nur 2 Beine bewegen und 4 auf dem Boden stehen lassen also 2:4 oder alternativ nur ein Bein bewegen und mit den restlichen 5 auf dem Boden stehen, also 5:1. In Kurven ist das ganze noch etwas komplizierter daher beschäftigen wir uns als erstes mit: &lt;br /&gt;
&lt;br /&gt;
===geradeaus 3:3===&lt;br /&gt;
Die folgende Methode wird gerne angewandt, weil sie recht einfach und auch rein mechanisch gemacht werden kann, allerdings ist die Belastung für die Servos bei dieser Variante am grössten, denn nur 3 Beine teilen sich das gesamte Gewicht des Roboters. Die Beine 1, 4 u. 5  bzw. 2, 3 u. 6  werden jeweils gleich angesteuert, phasenmäßig aber um 180 Grad versetzt. &lt;br /&gt;
&lt;br /&gt;
Im linken Bild sind die Beine 2, 3 u. 6 gerade ganz vorne, die anderen Beine 1, 4 u. 5 ganz hinten&lt;br /&gt;
&lt;br /&gt;
[[Bild:Podstp1.jpg]]&lt;br /&gt;
[[Bild:Podstp2.jpg]]&lt;br /&gt;
&lt;br /&gt;
Im rechten Bild sind 2, 3 u. 6 mit ihrer Bewegung fertig, sie haben das Fahrzeug fortbewegt, jetzt kehrt sich die Sache um&lt;br /&gt;
&lt;br /&gt;
'''Schwerpunkt ?'''&lt;br /&gt;
&lt;br /&gt;
Unterstützt wird das ganze Gerät immer an den Fußpunkten der Beine. Verbindet man diese jeweils drei Punkte, ergeben sich zwei Dreiecke, die in den beiden Zeichnungen strichliert angedeutet sind. Teilweise überlappen sie sich, das ist der Bereich, wo sich der Schwerpunkt des ganzen Fahrzeuges befinden darf.&lt;br /&gt;
&lt;br /&gt;
 Und man sieht, dass diese Fläche bemerkenswert klein ist.&lt;br /&gt;
&lt;br /&gt;
Für 3:3 laufen benötigt jedes Bein 2 Stellungen einmal vorn (A) und einmal hinten (B). Zuerst befinden sich die Beine 2,3 u 6 in Stellung A und werden auf dem Boden gleichzeitig in Stellung B bewegt. Dadurch schiebt sich der Roboter um das Stück A zu B nach vorn. Die Beine 1, 4 u 5 bewegen sich in der selben Zeit von Stellung B nach A, jedoch ohne Bodenkontakt. Wird nun diese Sequenz, im wechsel mit 1, 4 u 5 am Boden und 2, 3 u 6 in der Luft, zyklisch ausgeführt, hat man schon ein passables Laufprogramm für gerade aus. &lt;br /&gt;
&lt;br /&gt;
===geradeaus 2:4===&lt;br /&gt;
Bei dieser Variante wird jeweils ein Beinpaar gleichzeitig bewegt. Diese sind günstigerweise:&lt;br /&gt;
1 und 4 (Paar 1); 3 und 6 (Paar 2); 2 und 5 (Paar 3)&lt;br /&gt;
Jedes Beinpaar benötigt jedoch 3 Stellungen: A, B, C. Der Algoritmus teilt sich daher auch in drei Schritte auf I, II und III. &lt;br /&gt;
&lt;br /&gt;
Für Schritt I bringen wir Paar 1 in Stellung A, Paar 2 in Stellung C und Paar 3 in Stellung B. &lt;br /&gt;
Für Schritt II bewegt sich Paar 1 in Stellung B, Paar 2 in Stellung A (diese Bewegung muss ohne Bodenkontakt erfolgen) und Paar 3 in Stellung C. &lt;br /&gt;
Für Schritt III bewegt sich Paar 1 in Stellung C, Paar 2 in Stellung B und Paar 3 in Stellung A (auch wieder in der Luft) &lt;br /&gt;
Ab hier wiederholt sich das Programm&lt;br /&gt;
&lt;br /&gt;
Fazit: Die Bewegungn sind etwas aufwendiger sich zu überlegen und zu programmieren, der Roboter gewinnt aber insgesammt an Stabilität und ist nur etwas langsamer als bei 3:3. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===geradeaus 1:5===&lt;br /&gt;
Diese Variante ist die langsamste, aber dafür am stabilsten, denn das Gewicht verteilt sich auf 5 Standbeine. &lt;br /&gt;
Es werden 6 Stellungen pro Bein benötigt (A, B, C, D, E, F) und 6 Schritte. &lt;br /&gt;
Es gibt mehrere Möglichkeiten der Startaufstellung ich will hier eine kurz Darstellen: &lt;br /&gt;
Bein 1: A -&amp;gt; B  -&amp;gt; C  usw. &amp;lt;br&amp;gt;&lt;br /&gt;
Bein 2: D -&amp;gt; E  -&amp;gt; F &amp;lt;br&amp;gt;&lt;br /&gt;
Bein 3: E -&amp;gt; F  --&amp;gt; A &amp;lt;br&amp;gt;&lt;br /&gt;
Bein 4: B -&amp;gt; C  -&amp;gt; D &amp;lt;br&amp;gt;&lt;br /&gt;
Bein 5: C -&amp;gt; D  -&amp;gt; E &amp;lt;br&amp;gt;&lt;br /&gt;
Bein 6: F --&amp;gt; A -&amp;gt; B &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Pfeile geben an in Welche Stellung sich die Beine als nächstes bewegen, Bein 6 wird sich in die Stellung A bewegen. Dieser Rückstellvorgang muss immer in der Luft erfolgen. So wird sich der Roboter kontinuierlich vorwärts bewegen.&lt;br /&gt;
&lt;br /&gt;
==Hexapods in der Kurve==&lt;br /&gt;
&lt;br /&gt;
Nochmals das Bild von oben &lt;br /&gt;
&lt;br /&gt;
[[Bild:Hextop1.jpg]]&lt;br /&gt;
&lt;br /&gt;
Die effektiven Beinwege '''s''' können auch wie die Räder von einem sechsrädrigen Fahrzeug verstanden werden.&lt;br /&gt;
&lt;br /&gt;
Wenn wir nun eine Kurve beschreiben wollen, verkürzen wir die Wege '''s''' auf einer Seite, dadurch ergibt sich ein Drehpunkt '''P'''&lt;br /&gt;
&lt;br /&gt;
[[Bild:Hexcurv1.jpg]]&lt;br /&gt;
&lt;br /&gt;
Was man sieht: Es muss eigentlich jedes Bein eine individuelle Bewegung machen.&lt;br /&gt;
UND: jedes Bein muss seinen eigenen [[Spinnenbeine#Beinbewegung|Kurvenradius einhalten]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Hexapods drehen===&lt;br /&gt;
Alternativ, etwas einfacher zu programmieren, weil die Stellungen von Oben weiter verwendet werden können ist das Panzer Modell. &lt;br /&gt;
Konkret heisst es, die rechte Seite der Beine bewegt sich weiter nach oben, wärend die linke Seite der Beine sich nach unten bewegt. Dadurch wird der Roboter auf der Stelle gedreht. D.h. die Bewegungsrichtung der Beine ist insgesammt links zu rechts gegenläufig.&lt;br /&gt;
&lt;br /&gt;
==Kräfte am Spinnenbein==&lt;br /&gt;
Da eine genaue Berechnung recht aufwendig ist und von vielen Faktoren zusätzlich stark beeinflusst wird (Dynamik und äußere Einflüsse), soll hier nur eine qualifizierende Betrachtung erfolgen. &lt;br /&gt;
&lt;br /&gt;
Für Beine gibt es zwei völlig unterschiedliche Situationen: &lt;br /&gt;
===Ohne Bodenhaftung===&lt;br /&gt;
(Glatteis)&lt;br /&gt;
[[Bild:Podvec1.jpg]]&lt;br /&gt;
&lt;br /&gt;
Die Beine werden auseinandergedrückt. Das Kniegelenk muß versuchen, Ober- und Unterschenkel beisammenzuhalten, und in der Schulter muss das anteilige Gewicht des Fahrzeuges getragen werden. Durch die langen Hebel wird da, je nach Beinstellung, eine beachtliche Kraft erforderlich.&lt;br /&gt;
&lt;br /&gt;
===Mit Bodenhaftung===&lt;br /&gt;
(Teppich)&lt;br /&gt;
[[Bild:Podvec2.jpg]]&lt;br /&gt;
&lt;br /&gt;
Ganz anders bei ausreichender Haftung: Da die Füße ja nicht wegrutschen, zieht das Gewicht des Fahrzeuges über die Oberschenkel die Knie nach innen. Hier müssen die Oberschenkel nach außen stemmen, um dem entgegenzuwirken. &lt;br /&gt;
&lt;br /&gt;
''Bitte beachten, die Beine können auch günstiger als auf dem Bild dargestellt, eingerichtet werden. Wenn der Oberschenkel waagrecht zum Roboterkörper ist. Muss das Schultergelenk zwar das gesammte Gewicht des Roboters tragen, aber das Kniegelenk wird praktisch vollständig entlastet. Auch bei Eis als Untergrund würde ein Wegrutschen der Beine so verhindert werden. ''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Ein Rechenbeispiel====&lt;br /&gt;
Des weiteren ist es wichtig zu erwähnen, dass je nach Bauart des Beines, also welche die sich weiter an der Seite vom Bot befinden, enorme Hebelkräfte auftreten. Um die passenden Servos für seinen Roboter heraus zu suchen hier ein Rechenbeispiel: &lt;br /&gt;
&lt;br /&gt;
[[Bild:Beine65.jpg]]&lt;br /&gt;
&lt;br /&gt;
Gegeben sei &amp;quot;a&amp;quot; als größtmöglicher Abstand zum Körper (blau).&lt;br /&gt;
Je nach Bauart des Roboters und der Wahl der Bewegung sind entweder 3 oder 4 oder gar 5 Beine gleichzeit am Boden. Auf diese wird das gesammte Gewicht des Roboter verteilt. Uns interessiert an dieser Stelle wieviel Ncm im Schultergelenk notwendig sind um den Roboter hochzudrücken. Aus der Zeichnung wird wieder deutlich warum es sinnvoll ist den Unterschenkel möglichst senkrecht zu halten und den Oberschenkel waagrecht. Unter dieser Positionierung muss das Kniegelenk nämlich kein Drehmoment übertragen. &lt;br /&gt;
&lt;br /&gt;
Aber zurück zur Rechnung. &lt;br /&gt;
&lt;br /&gt;
das Drehmoment in der Schulter wird wie folgt berechnet: &lt;br /&gt;
(Gewicht /Anzahl der Beine)* Hebelarm = Drehmoment in der Schulter&lt;br /&gt;
&lt;br /&gt;
in unserem Beispielt &lt;br /&gt;
a=10cm; G=1kg--&amp;gt; 1kg * 9,81m/s² = 9,81N ~ 10N; 3Beine am Boden&lt;br /&gt;
&lt;br /&gt;
(10N / 3)* 10cm = 33,3Ncm&lt;br /&gt;
    &lt;br /&gt;
Wir benötigen also in der Schulter Servos welche mindestens 33,3Ncm schaffen, zur Sicherheit wären 35Ncm sinnvoller. &lt;br /&gt;
Die Rechnung lässt sich natürlich auch so umstellen, dass anhand der Servos das Gesamtgewicht ermittelt werden kann: &lt;br /&gt;
&lt;br /&gt;
(Drehmoment der Servos / Hebelarm)* Anzahl der Beine = Gewicht des Roboters&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dasselbe gilt natürlich auch für Quadropods. Nur muss man die Faktoren der Anzahl der Beine ändern&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[Servos]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Mechanik]]&lt;br /&gt;
[[Kategorie:Praxis]]&lt;br /&gt;
&lt;br /&gt;
[http://www.lynxmotion.com Lynxmotion, Referenz für Roboter mit Beinen]&lt;/div&gt;</summary>
		<author><name>HannoHupmann</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Spinnenbeine_(Hexapods)&amp;diff=8702</id>
		<title>Spinnenbeine (Hexapods)</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Spinnenbeine_(Hexapods)&amp;diff=8702"/>
				<updated>2006-09-15T08:17:34Z</updated>
		
		<summary type="html">&lt;p&gt;HannoHupmann: /* Mit Bodenhaftung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Spinnenbeine, Hexapods, Quadropods und Polypods==&lt;br /&gt;
&lt;br /&gt;
Wenn man sich erstmal nicht damit zufriedengibt, einfach mit den Beinen irgendwie herumzurudern (&amp;quot;Hauptsache, es bewegt sich&amp;quot;), sind Beinbewegungen gar nicht so ohne. &lt;br /&gt;
&lt;br /&gt;
Schauen wir uns mal die häufigste Variante an, das sind die echsen- oder spinnenartigen Bauformen. Hauptmerkmal ist, dass die Beine seitlich am Körper angebracht sind.&lt;br /&gt;
&lt;br /&gt;
Dabei können folgende Anordnungen und Beine unterschieden werden: &lt;br /&gt;
Die auf dem Bild gezeigte anordnung von 3 Beinen links so wie rechts ist die gängigste für Hexabots. Alternativ können die Beine auch in einem Sechseck angeordnet werden (siehe auch Bild weiter unten). Diese Anordnung hat den Vorteil, dass sie etwas wendiger ist, dies erkauft man sich durch eine etwas komplizierte Programmierung. Denn die Beinstellungen sind hier aufwendiger. &lt;br /&gt;
&lt;br /&gt;
Roboter mit nur 4 Beinen werden gemeinhin als Quadropods bezeichnet. &lt;br /&gt;
Roboter mit mehr als 6 Beinen werden als Polypod bezeichnet.&lt;br /&gt;
&lt;br /&gt;
==Ein Beinpaar im Querschnitt==&lt;br /&gt;
Das hier dargestellte Bein hat 3 Gelenke (jedoch sind nur 2 sichtbar). Einmal ein Gelenk an der Schulter und eines am Knie, das nicht sichtbare ist in der ansicht von Oben dafür verantwortlich das Bein vor und zurück zu bewegen. &lt;br /&gt;
Somit hat diese Bein 3 Freiheitsgrade (1x Knie, 1x Schulter (auf und ab) und 1x Schulter (vor zurück) dies wird oft auch als 3DOF (Degree of Freedom) bezeichnet. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:Podlegside.jpg]]&lt;br /&gt;
&lt;br /&gt;
(Die Beinhaltung ist hier ganz allgemein gehalten, tatsächlich sind da große Unterschiede, je nach Bauart.)&lt;br /&gt;
*Z ist die vertikale Drehachse des &amp;quot;Schulter&amp;quot;-Gelenks&lt;br /&gt;
*h ist die Höhe des Körpers über dem Boden&lt;br /&gt;
*a ist der Oberschenkel&lt;br /&gt;
*&amp;amp;beta; der Winkel des Oberschenkels&lt;br /&gt;
*K ist das Knie&lt;br /&gt;
*b ist der Unterschenkel &lt;br /&gt;
*&amp;amp;alpha; der Winkel im Knie &lt;br /&gt;
*F ist der Fußpunkt&lt;br /&gt;
*&amp;amp;gamma; der Winkel, den der Unterschenkel mit dem Boden einnimmt&lt;br /&gt;
*r ist der resultierende Radius des Fußpunktes um die Schulter&lt;br /&gt;
*M der Schwerpunkt unseres Roboters &lt;br /&gt;
*br der Abstand des Schwerpunkts bis zur Schulter&lt;br /&gt;
&lt;br /&gt;
==Variante &amp;quot;Lynxmotion&amp;quot;==&lt;br /&gt;
[[Bild:Podlynx.jpg]]&lt;br /&gt;
&lt;br /&gt;
Hier ist der Oberschenkel gewissermaßen geteilt. Der vertikal bewegliche Teil davon ist sehr kurz und als Parallelogramm ausgeführt, um den Unterschenkel senkrecht halten zu können. Dieser kann aktiv nur gehoben und gesenkt werden, durch Federn hat er aber ein gewisses seitliches Spiel.&lt;br /&gt;
&lt;br /&gt;
Der Zweck dieser Konstruktion ist es, das Schultergelenk mit nur einem Freiheitsgrad sehr robust ausführen zu können.&lt;br /&gt;
Diese Variante der Beine hat also insgesammt nur 2 Freiheitsgrade (Schulter und heben, senken) und wird oft auch als DOF2 bezeichnet.&lt;br /&gt;
&lt;br /&gt;
==Ein (linkes) Bein von oben==&lt;br /&gt;
&lt;br /&gt;
[[Bild:Podlegtop.jpg]]&lt;br /&gt;
&lt;br /&gt;
man findet die Werte aus der seitlichen Ansicht&lt;br /&gt;
*Z die vertikale Drehachse der Schulter (bleiben wir mal bei &amp;quot;Schulter&amp;quot;)&lt;br /&gt;
*r&amp;lt;sup&amp;gt;min&amp;lt;/sup&amp;gt; als kleinstmöglicher Radius, den der Fußpunkt beschreiben kann (wenn der Unterschenkel maximal angezogen ist = kleines &amp;amp;alpha;)&lt;br /&gt;
*r&amp;lt;sup&amp;gt;max&amp;lt;/sup&amp;gt; als größtmöglicher Radius (= großes &amp;amp;alpha;)&lt;br /&gt;
*&amp;amp;delta;&amp;lt;sup&amp;gt;max&amp;lt;/sup&amp;gt; das ist der größtmögliche Drehwinkel des Schultergelenks&lt;br /&gt;
&lt;br /&gt;
schraffiert ist der Bereich, in dem sich die &amp;quot;Fußspitze&amp;quot; bewegen kann. &lt;br /&gt;
&lt;br /&gt;
 '''s''' ist somit die größtmögliche Schrittweite (bei gerader Fortbewegung)&lt;br /&gt;
&lt;br /&gt;
und dann noch&lt;br /&gt;
*M ist der Schwerpunkt (oder Mittelpunkt) des gesamten Fahrzeuges&lt;br /&gt;
*br die halbe Breite&lt;br /&gt;
*f der Abstand dieses Beines von der Querachse&lt;br /&gt;
&lt;br /&gt;
==Beinbewegung==&lt;br /&gt;
===Geradeaus===&lt;br /&gt;
Wird das Bein nun für einen Schritt von vorne nach hinten gedreht (durch Drehung des &amp;quot;Schulter&amp;quot;-Servos), würde sich die Fußspitze in einem Kreisbogen bewegen. Unterwegs würde allerdings die Fußspitze nach außen wegrutschen. Am schlimmsten daran ist der Verlust der Haftreibung, von der noch zu sprechen ist.&lt;br /&gt;
&lt;br /&gt;
Das Bein muß also unterwegs so verkürzt werden, daß sich die Fußspitze entlang der geraden Sehne '''s''' bewegt. Und dann muss noch die Winkelgeschwindigkeit des Schultergelenks angepasst werden, da ja auch der Radius kontinuierlich verändert wird.&lt;br /&gt;
===In einer Kurve===&lt;br /&gt;
Um irgendein Fahrzeug in eine Kurve nach rechts zu bringen, kann man z.B. die Räder links schneller drehen lassen. Sowas geht bei Beinen natürlich nicht. Hier muß die Schrittweite variiert werden. &lt;br /&gt;
Und noch eine Tücke in der Kurve: Der Schreitweg '''s''' muss um den Kurvenradius-Mittelpunkt einen Bogen machen. &lt;br /&gt;
&lt;br /&gt;
[[Bild:Podtopc.jpg]]&lt;br /&gt;
&lt;br /&gt;
*P Kurven-Mittelpunkt&lt;br /&gt;
*M Fahrzeugmittelpunkt&lt;br /&gt;
*r&amp;lt;sub&amp;gt;fzg&amp;lt;/sub&amp;gt;Radius des Fahrzeuges um P&lt;br /&gt;
&lt;br /&gt;
==Anordnung der Beine==&lt;br /&gt;
===Hexapods===&lt;br /&gt;
[[Bild:Hextop1.jpg]]&lt;br /&gt;
[[Bild:Hextop2.jpg]]&lt;br /&gt;
&lt;br /&gt;
das sind zwei Möglichkeiten, bei einem Hexpod die Beine anzuordnen. Die linke Variante hat den Vorteil, dass beim Geradeauslauf die Bewegungen der Beine identisch sein können, allerdings den Nachteil, dass der Rumpf länger sein muss (damit sich die Beine nicht in die Quere kommen). Die rechte Bauart hat diesen Nachteil nicht, aber dafür sind die erforderlichen Schrittbewegungen komplizierter.&lt;br /&gt;
&lt;br /&gt;
==Schrittfolge==&lt;br /&gt;
Es ist ja klar, daß wir nicht alle sechs Beine gleichzeitig bewegen können. Man braucht also eine Schrittfolge.&lt;br /&gt;
Hier können mehrere Varianten unterschieden werden. Da ein Spinnenroboter 6 Beine hat und zum stehen 3 Stück (ein Dreieck bildend) ausreichen gibt es: 3:3. Wir können aber auch nur 2 Beine bewegen und 4 auf dem Boden stehen lassen also 2:4 oder alternativ nur ein Bein bewegen und mit den restlichen 5 auf dem Boden stehen, also 5:1. In Kurven ist das ganze noch etwas komplizierter daher beschäftigen wir uns als erstes mit: &lt;br /&gt;
&lt;br /&gt;
===geradeaus 3:3===&lt;br /&gt;
Die folgende Methode wird gerne angewandt, weil sie recht einfach und auch rein mechanisch gemacht werden kann, allerdings ist die Belastung für die Servos bei dieser Variante am grössten, denn nur 3 Beine teilen sich das gesamte Gewicht des Roboters. Die Beine 1, 4 u. 5  bzw. 2, 3 u. 6  werden jeweils gleich angesteuert, phasenmäßig aber um 180 Grad versetzt. &lt;br /&gt;
&lt;br /&gt;
Im linken Bild sind die Beine 2, 3 u. 6 gerade ganz vorne, die anderen Beine 1, 4 u. 5 ganz hinten&lt;br /&gt;
&lt;br /&gt;
[[Bild:Podstp1.jpg]]&lt;br /&gt;
[[Bild:Podstp2.jpg]]&lt;br /&gt;
&lt;br /&gt;
Im rechten Bild sind 2, 3 u. 6 mit ihrer Bewegung fertig, sie haben das Fahrzeug fortbewegt, jetzt kehrt sich die Sache um&lt;br /&gt;
&lt;br /&gt;
'''Schwerpunkt ?'''&lt;br /&gt;
&lt;br /&gt;
Unterstützt wird das ganze Gerät immer an den Fußpunkten der Beine. Verbindet man diese jeweils drei Punkte, ergeben sich zwei Dreiecke, die in den beiden Zeichnungen strichliert angedeutet sind. Teilweise überlappen sie sich, das ist der Bereich, wo sich der Schwerpunkt des ganzen Fahrzeuges befinden darf.&lt;br /&gt;
&lt;br /&gt;
 Und man sieht, dass diese Fläche bemerkenswert klein ist.&lt;br /&gt;
&lt;br /&gt;
Für 3:3 laufen benötigt jedes Bein 2 Stellungen einmal vorn (A) und einmal hinten (B). Zuerst befinden sich die Beine 2,3 u 6 in Stellung A und werden auf dem Boden gleichzeitig in Stellung B bewegt. Dadurch schiebt sich der Roboter um das Stück A zu B nach vorn. Die Beine 1, 4 u 5 bewegen sich in der selben Zeit von Stellung B nach A, jedoch ohne Bodenkontakt. Wird nun diese Sequenz, im wechsel mit 1, 4 u 5 am Boden und 2, 3 u 6 in der Luft, zyklisch ausgeführt, hat man schon ein passables Laufprogramm für gerade aus. &lt;br /&gt;
&lt;br /&gt;
===geradeaus 2:4===&lt;br /&gt;
Bei dieser Variante wird jeweils ein Beinpaar gleichzeitig bewegt. Diese sind günstigerweise:&lt;br /&gt;
1 und 4 (Paar 1); 3 und 6 (Paar 2); 2 und 5 (Paar 3)&lt;br /&gt;
Jedes Beinpaar benötigt jedoch 3 Stellungen: A, B, C. Der Algoritmus teilt sich daher auch in drei Schritte auf I, II und III. &lt;br /&gt;
&lt;br /&gt;
Für Schritt I bringen wir Paar 1 in Stellung A, Paar 2 in Stellung C und Paar 3 in Stellung B. &lt;br /&gt;
Für Schritt II bewegt sich Paar 1 in Stellung B, Paar 2 in Stellung A (diese Bewegung muss ohne Bodenkontakt erfolgen) und Paar 3 in Stellung C. &lt;br /&gt;
Für Schritt III bewegt sich Paar 1 in Stellung C, Paar 2 in Stellung B und Paar 3 in Stellung A (auch wieder in der Luft) &lt;br /&gt;
Ab hier wiederholt sich das Programm&lt;br /&gt;
&lt;br /&gt;
Fazit: Die Bewegungn sind etwas aufwendiger sich zu überlegen und zu programmieren, der Roboter gewinnt aber insgesammt an Stabilität und ist nur etwas langsamer als bei 3:3. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===geradeaus 1:5===&lt;br /&gt;
Diese Variante ist die langsamste, aber dafür am stabilsten, denn das Gewicht verteilt sich auf 5 Standbeine. &lt;br /&gt;
Es werden 6 Stellungen pro Bein benötigt (A, B, C, D, E, F) und 6 Schritte. &lt;br /&gt;
Es gibt mehrere Möglichkeiten der Startaufstellung ich will hier eine kurz Darstellen: &lt;br /&gt;
Bein 1: A -&amp;gt; B  -&amp;gt; C  usw. &amp;lt;br&amp;gt;&lt;br /&gt;
Bein 2: D -&amp;gt; E  -&amp;gt; F &amp;lt;br&amp;gt;&lt;br /&gt;
Bein 3: E -&amp;gt; F  --&amp;gt; A &amp;lt;br&amp;gt;&lt;br /&gt;
Bein 4: B -&amp;gt; C  -&amp;gt; D &amp;lt;br&amp;gt;&lt;br /&gt;
Bein 5: C -&amp;gt; D  -&amp;gt; E &amp;lt;br&amp;gt;&lt;br /&gt;
Bein 6: F --&amp;gt; A -&amp;gt; B &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Pfeile geben an in Welche Stellung sich die Beine als nächstes bewegen, Bein 6 wird sich in die Stellung A bewegen. Dieser Rückstellvorgang muss immer in der Luft erfolgen. So wird sich der Roboter kontinuierlich vorwärts bewegen.&lt;br /&gt;
&lt;br /&gt;
==Hexapods in der Kurve==&lt;br /&gt;
&lt;br /&gt;
Nochmals das Bild von oben &lt;br /&gt;
&lt;br /&gt;
[[Bild:Hextop1.jpg]]&lt;br /&gt;
&lt;br /&gt;
Die effektiven Beinwege '''s''' können auch wie die Räder von einem sechsrädrigen Fahrzeug verstanden werden.&lt;br /&gt;
&lt;br /&gt;
Wenn wir nun eine Kurve beschreiben wollen, verkürzen wir die Wege '''s''' auf einer Seite, dadurch ergibt sich ein Drehpunkt '''P'''&lt;br /&gt;
&lt;br /&gt;
[[Bild:Hexcurv1.jpg]]&lt;br /&gt;
&lt;br /&gt;
Was man sieht: Es muss eigentlich jedes Bein eine individuelle Bewegung machen.&lt;br /&gt;
UND: jedes Bein muss seinen eigenen [[Spinnenbeine#Beinbewegung|Kurvenradius einhalten]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Hexapods drehen===&lt;br /&gt;
Alternativ, etwas einfacher zu programmieren, weil die Stellungen von Oben weiter verwendet werden können ist das Panzer Modell. &lt;br /&gt;
Konkret heisst es, die rechte Seite der Beine bewegt sich weiter nach oben, wärend die linke Seite der Beine sich nach unten bewegt. Dadurch wird der Roboter auf der Stelle gedreht. D.h. die Bewegungsrichtung der Beine ist insgesammt links zu rechts gegenläufig.&lt;br /&gt;
&lt;br /&gt;
==Kräfte am Spinnenbein==&lt;br /&gt;
Da eine genaue Berechnung recht aufwendig ist und von vielen Faktoren zusätzlich stark beeinflusst wird (Dynamik und äußere Einflüsse), soll hier nur eine qualifizierende Betrachtung erfolgen. &lt;br /&gt;
&lt;br /&gt;
Für Beine gibt es zwei völlig unterschiedliche Situationen: &lt;br /&gt;
===Ohne Bodenhaftung===&lt;br /&gt;
(Glatteis)&lt;br /&gt;
[[Bild:Podvec1.jpg]]&lt;br /&gt;
&lt;br /&gt;
Die Beine werden auseinandergedrückt. Das Kniegelenk muß versuchen, Ober- und Unterschenkel beisammenzuhalten, und in der Schulter muss das anteilige Gewicht des Fahrzeuges getragen werden. Durch die langen Hebel wird da, je nach Beinstellung, eine beachtliche Kraft erforderlich.&lt;br /&gt;
&lt;br /&gt;
===Mit Bodenhaftung===&lt;br /&gt;
(Teppich)&lt;br /&gt;
[[Bild:Podvec2.jpg]]&lt;br /&gt;
&lt;br /&gt;
Ganz anders bei ausreichender Haftung: Da die Füße ja nicht wegrutschen, zieht das Gewicht des Fahrzeuges über die Oberschenkel die Knie nach innen. Hier müssen die Oberschenkel nach außen stemmen, um dem entgegenzuwirken. &lt;br /&gt;
&lt;br /&gt;
''Bitte beachten, die Beine können auch günstiger als auf dem Bild dargestellt, eingerichtet werden. Wenn der Oberschenkel waagrecht zum Roboterkörper ist. Muss das Schultergelenk zwar das gesammte Gewicht des Roboters tragen, aber das Kniegelenk wird praktisch vollständig entlastet. Auch bei Eis als Untergrund würde ein Wegrutschen der Beine so verhindert werden. ''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Ein Rechenbeispiel====&lt;br /&gt;
Des weiteren ist es wichtig zu erwähnen, dass je nach Bauart des Beines, also welche die sich weiter an der Seite vom Bot befinden, enorme Hebelkräfte auftreten. Um die passenden Servos für seinen Roboter heraus zu suchen hier ein Rechenbeispiel: &lt;br /&gt;
&lt;br /&gt;
[[Bild:Beine65.jpg]]&lt;br /&gt;
&lt;br /&gt;
Gegeben sei &amp;quot;a&amp;quot; als größtmöglicher Abstand zum Körper (blau).&lt;br /&gt;
Je nach Bauart des Roboters und der Wahl der Bewegung sind entweder 3 oder 4 oder gar 5 Beine gleichzeit am Boden. Auf diese wird das gesammte Gewicht des Roboter verteilt. Uns interessiert an dieser Stelle wieviel Ncm im Schultergelenk notwendig sind um den Roboter hochzudrücken. Aus der Zeichnung wird wieder deutlich warum es sinnvoll ist den Unterschenkel möglichst senkrecht zu halten und den Oberschenkel waagrecht. Unter dieser Positionierung muss das Kniegelenk nämlich kein Drehmoment übertragen. &lt;br /&gt;
&lt;br /&gt;
Aber zurück zur Rechnung. &lt;br /&gt;
&lt;br /&gt;
das Drehmoment in der Schulter wird wie folgt berechnet: &lt;br /&gt;
(Gewicht /Anzahl der Beine)* Hebelarm = Drehmoment in der Schulter&lt;br /&gt;
&lt;br /&gt;
in unserem Beispielt &lt;br /&gt;
a=10cm; G=1kg=10N; 3Beine am Boden&lt;br /&gt;
&lt;br /&gt;
(10N / 3)* 10cm = 33,3Ncm&lt;br /&gt;
    &lt;br /&gt;
Wir benötigen also in der Schulter Servos welche mindestens 33,3Ncm schaffen, zur Sicherheit wären 35Ncm sinnvoller. &lt;br /&gt;
Die Rechnung lässt sich natürlich auch so umstellen, dass anhand der Servos das Gesamtgewicht ermittelt werden kann: &lt;br /&gt;
&lt;br /&gt;
(Drehmoment der Servos / Hebelarm)* Anzahl der Beine = Gewicht des Roboters&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dasselbe gilt natürlich auch für Quadropods. Nur muss man die Faktoren der Anzahl der Beine ändern&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[Servos]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Mechanik]]&lt;br /&gt;
[[Kategorie:Praxis]]&lt;br /&gt;
&lt;br /&gt;
[http://www.lynxmotion.com Lynxmotion, Referenz für Roboter mit Beinen]&lt;/div&gt;</summary>
		<author><name>HannoHupmann</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Spinnenbeine_(Hexapods)&amp;diff=8701</id>
		<title>Spinnenbeine (Hexapods)</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Spinnenbeine_(Hexapods)&amp;diff=8701"/>
				<updated>2006-09-15T08:15:10Z</updated>
		
		<summary type="html">&lt;p&gt;HannoHupmann: /* Spinnenbeine, Hexabots, Quadrobots und Polybots */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Spinnenbeine, Hexapods, Quadropods und Polypods==&lt;br /&gt;
&lt;br /&gt;
Wenn man sich erstmal nicht damit zufriedengibt, einfach mit den Beinen irgendwie herumzurudern (&amp;quot;Hauptsache, es bewegt sich&amp;quot;), sind Beinbewegungen gar nicht so ohne. &lt;br /&gt;
&lt;br /&gt;
Schauen wir uns mal die häufigste Variante an, das sind die echsen- oder spinnenartigen Bauformen. Hauptmerkmal ist, dass die Beine seitlich am Körper angebracht sind.&lt;br /&gt;
&lt;br /&gt;
Dabei können folgende Anordnungen und Beine unterschieden werden: &lt;br /&gt;
Die auf dem Bild gezeigte anordnung von 3 Beinen links so wie rechts ist die gängigste für Hexabots. Alternativ können die Beine auch in einem Sechseck angeordnet werden (siehe auch Bild weiter unten). Diese Anordnung hat den Vorteil, dass sie etwas wendiger ist, dies erkauft man sich durch eine etwas komplizierte Programmierung. Denn die Beinstellungen sind hier aufwendiger. &lt;br /&gt;
&lt;br /&gt;
Roboter mit nur 4 Beinen werden gemeinhin als Quadropods bezeichnet. &lt;br /&gt;
Roboter mit mehr als 6 Beinen werden als Polypod bezeichnet.&lt;br /&gt;
&lt;br /&gt;
==Ein Beinpaar im Querschnitt==&lt;br /&gt;
Das hier dargestellte Bein hat 3 Gelenke (jedoch sind nur 2 sichtbar). Einmal ein Gelenk an der Schulter und eines am Knie, das nicht sichtbare ist in der ansicht von Oben dafür verantwortlich das Bein vor und zurück zu bewegen. &lt;br /&gt;
Somit hat diese Bein 3 Freiheitsgrade (1x Knie, 1x Schulter (auf und ab) und 1x Schulter (vor zurück) dies wird oft auch als 3DOF (Degree of Freedom) bezeichnet. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:Podlegside.jpg]]&lt;br /&gt;
&lt;br /&gt;
(Die Beinhaltung ist hier ganz allgemein gehalten, tatsächlich sind da große Unterschiede, je nach Bauart.)&lt;br /&gt;
*Z ist die vertikale Drehachse des &amp;quot;Schulter&amp;quot;-Gelenks&lt;br /&gt;
*h ist die Höhe des Körpers über dem Boden&lt;br /&gt;
*a ist der Oberschenkel&lt;br /&gt;
*&amp;amp;beta; der Winkel des Oberschenkels&lt;br /&gt;
*K ist das Knie&lt;br /&gt;
*b ist der Unterschenkel &lt;br /&gt;
*&amp;amp;alpha; der Winkel im Knie &lt;br /&gt;
*F ist der Fußpunkt&lt;br /&gt;
*&amp;amp;gamma; der Winkel, den der Unterschenkel mit dem Boden einnimmt&lt;br /&gt;
*r ist der resultierende Radius des Fußpunktes um die Schulter&lt;br /&gt;
*M der Schwerpunkt unseres Roboters &lt;br /&gt;
*br der Abstand des Schwerpunkts bis zur Schulter&lt;br /&gt;
&lt;br /&gt;
==Variante &amp;quot;Lynxmotion&amp;quot;==&lt;br /&gt;
[[Bild:Podlynx.jpg]]&lt;br /&gt;
&lt;br /&gt;
Hier ist der Oberschenkel gewissermaßen geteilt. Der vertikal bewegliche Teil davon ist sehr kurz und als Parallelogramm ausgeführt, um den Unterschenkel senkrecht halten zu können. Dieser kann aktiv nur gehoben und gesenkt werden, durch Federn hat er aber ein gewisses seitliches Spiel.&lt;br /&gt;
&lt;br /&gt;
Der Zweck dieser Konstruktion ist es, das Schultergelenk mit nur einem Freiheitsgrad sehr robust ausführen zu können.&lt;br /&gt;
Diese Variante der Beine hat also insgesammt nur 2 Freiheitsgrade (Schulter und heben, senken) und wird oft auch als DOF2 bezeichnet.&lt;br /&gt;
&lt;br /&gt;
==Ein (linkes) Bein von oben==&lt;br /&gt;
&lt;br /&gt;
[[Bild:Podlegtop.jpg]]&lt;br /&gt;
&lt;br /&gt;
man findet die Werte aus der seitlichen Ansicht&lt;br /&gt;
*Z die vertikale Drehachse der Schulter (bleiben wir mal bei &amp;quot;Schulter&amp;quot;)&lt;br /&gt;
*r&amp;lt;sup&amp;gt;min&amp;lt;/sup&amp;gt; als kleinstmöglicher Radius, den der Fußpunkt beschreiben kann (wenn der Unterschenkel maximal angezogen ist = kleines &amp;amp;alpha;)&lt;br /&gt;
*r&amp;lt;sup&amp;gt;max&amp;lt;/sup&amp;gt; als größtmöglicher Radius (= großes &amp;amp;alpha;)&lt;br /&gt;
*&amp;amp;delta;&amp;lt;sup&amp;gt;max&amp;lt;/sup&amp;gt; das ist der größtmögliche Drehwinkel des Schultergelenks&lt;br /&gt;
&lt;br /&gt;
schraffiert ist der Bereich, in dem sich die &amp;quot;Fußspitze&amp;quot; bewegen kann. &lt;br /&gt;
&lt;br /&gt;
 '''s''' ist somit die größtmögliche Schrittweite (bei gerader Fortbewegung)&lt;br /&gt;
&lt;br /&gt;
und dann noch&lt;br /&gt;
*M ist der Schwerpunkt (oder Mittelpunkt) des gesamten Fahrzeuges&lt;br /&gt;
*br die halbe Breite&lt;br /&gt;
*f der Abstand dieses Beines von der Querachse&lt;br /&gt;
&lt;br /&gt;
==Beinbewegung==&lt;br /&gt;
===Geradeaus===&lt;br /&gt;
Wird das Bein nun für einen Schritt von vorne nach hinten gedreht (durch Drehung des &amp;quot;Schulter&amp;quot;-Servos), würde sich die Fußspitze in einem Kreisbogen bewegen. Unterwegs würde allerdings die Fußspitze nach außen wegrutschen. Am schlimmsten daran ist der Verlust der Haftreibung, von der noch zu sprechen ist.&lt;br /&gt;
&lt;br /&gt;
Das Bein muß also unterwegs so verkürzt werden, daß sich die Fußspitze entlang der geraden Sehne '''s''' bewegt. Und dann muss noch die Winkelgeschwindigkeit des Schultergelenks angepasst werden, da ja auch der Radius kontinuierlich verändert wird.&lt;br /&gt;
===In einer Kurve===&lt;br /&gt;
Um irgendein Fahrzeug in eine Kurve nach rechts zu bringen, kann man z.B. die Räder links schneller drehen lassen. Sowas geht bei Beinen natürlich nicht. Hier muß die Schrittweite variiert werden. &lt;br /&gt;
Und noch eine Tücke in der Kurve: Der Schreitweg '''s''' muss um den Kurvenradius-Mittelpunkt einen Bogen machen. &lt;br /&gt;
&lt;br /&gt;
[[Bild:Podtopc.jpg]]&lt;br /&gt;
&lt;br /&gt;
*P Kurven-Mittelpunkt&lt;br /&gt;
*M Fahrzeugmittelpunkt&lt;br /&gt;
*r&amp;lt;sub&amp;gt;fzg&amp;lt;/sub&amp;gt;Radius des Fahrzeuges um P&lt;br /&gt;
&lt;br /&gt;
==Anordnung der Beine==&lt;br /&gt;
===Hexapods===&lt;br /&gt;
[[Bild:Hextop1.jpg]]&lt;br /&gt;
[[Bild:Hextop2.jpg]]&lt;br /&gt;
&lt;br /&gt;
das sind zwei Möglichkeiten, bei einem Hexpod die Beine anzuordnen. Die linke Variante hat den Vorteil, dass beim Geradeauslauf die Bewegungen der Beine identisch sein können, allerdings den Nachteil, dass der Rumpf länger sein muss (damit sich die Beine nicht in die Quere kommen). Die rechte Bauart hat diesen Nachteil nicht, aber dafür sind die erforderlichen Schrittbewegungen komplizierter.&lt;br /&gt;
&lt;br /&gt;
==Schrittfolge==&lt;br /&gt;
Es ist ja klar, daß wir nicht alle sechs Beine gleichzeitig bewegen können. Man braucht also eine Schrittfolge.&lt;br /&gt;
Hier können mehrere Varianten unterschieden werden. Da ein Spinnenroboter 6 Beine hat und zum stehen 3 Stück (ein Dreieck bildend) ausreichen gibt es: 3:3. Wir können aber auch nur 2 Beine bewegen und 4 auf dem Boden stehen lassen also 2:4 oder alternativ nur ein Bein bewegen und mit den restlichen 5 auf dem Boden stehen, also 5:1. In Kurven ist das ganze noch etwas komplizierter daher beschäftigen wir uns als erstes mit: &lt;br /&gt;
&lt;br /&gt;
===geradeaus 3:3===&lt;br /&gt;
Die folgende Methode wird gerne angewandt, weil sie recht einfach und auch rein mechanisch gemacht werden kann, allerdings ist die Belastung für die Servos bei dieser Variante am grössten, denn nur 3 Beine teilen sich das gesamte Gewicht des Roboters. Die Beine 1, 4 u. 5  bzw. 2, 3 u. 6  werden jeweils gleich angesteuert, phasenmäßig aber um 180 Grad versetzt. &lt;br /&gt;
&lt;br /&gt;
Im linken Bild sind die Beine 2, 3 u. 6 gerade ganz vorne, die anderen Beine 1, 4 u. 5 ganz hinten&lt;br /&gt;
&lt;br /&gt;
[[Bild:Podstp1.jpg]]&lt;br /&gt;
[[Bild:Podstp2.jpg]]&lt;br /&gt;
&lt;br /&gt;
Im rechten Bild sind 2, 3 u. 6 mit ihrer Bewegung fertig, sie haben das Fahrzeug fortbewegt, jetzt kehrt sich die Sache um&lt;br /&gt;
&lt;br /&gt;
'''Schwerpunkt ?'''&lt;br /&gt;
&lt;br /&gt;
Unterstützt wird das ganze Gerät immer an den Fußpunkten der Beine. Verbindet man diese jeweils drei Punkte, ergeben sich zwei Dreiecke, die in den beiden Zeichnungen strichliert angedeutet sind. Teilweise überlappen sie sich, das ist der Bereich, wo sich der Schwerpunkt des ganzen Fahrzeuges befinden darf.&lt;br /&gt;
&lt;br /&gt;
 Und man sieht, dass diese Fläche bemerkenswert klein ist.&lt;br /&gt;
&lt;br /&gt;
Für 3:3 laufen benötigt jedes Bein 2 Stellungen einmal vorn (A) und einmal hinten (B). Zuerst befinden sich die Beine 2,3 u 6 in Stellung A und werden auf dem Boden gleichzeitig in Stellung B bewegt. Dadurch schiebt sich der Roboter um das Stück A zu B nach vorn. Die Beine 1, 4 u 5 bewegen sich in der selben Zeit von Stellung B nach A, jedoch ohne Bodenkontakt. Wird nun diese Sequenz, im wechsel mit 1, 4 u 5 am Boden und 2, 3 u 6 in der Luft, zyklisch ausgeführt, hat man schon ein passables Laufprogramm für gerade aus. &lt;br /&gt;
&lt;br /&gt;
===geradeaus 2:4===&lt;br /&gt;
Bei dieser Variante wird jeweils ein Beinpaar gleichzeitig bewegt. Diese sind günstigerweise:&lt;br /&gt;
1 und 4 (Paar 1); 3 und 6 (Paar 2); 2 und 5 (Paar 3)&lt;br /&gt;
Jedes Beinpaar benötigt jedoch 3 Stellungen: A, B, C. Der Algoritmus teilt sich daher auch in drei Schritte auf I, II und III. &lt;br /&gt;
&lt;br /&gt;
Für Schritt I bringen wir Paar 1 in Stellung A, Paar 2 in Stellung C und Paar 3 in Stellung B. &lt;br /&gt;
Für Schritt II bewegt sich Paar 1 in Stellung B, Paar 2 in Stellung A (diese Bewegung muss ohne Bodenkontakt erfolgen) und Paar 3 in Stellung C. &lt;br /&gt;
Für Schritt III bewegt sich Paar 1 in Stellung C, Paar 2 in Stellung B und Paar 3 in Stellung A (auch wieder in der Luft) &lt;br /&gt;
Ab hier wiederholt sich das Programm&lt;br /&gt;
&lt;br /&gt;
Fazit: Die Bewegungn sind etwas aufwendiger sich zu überlegen und zu programmieren, der Roboter gewinnt aber insgesammt an Stabilität und ist nur etwas langsamer als bei 3:3. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===geradeaus 1:5===&lt;br /&gt;
Diese Variante ist die langsamste, aber dafür am stabilsten, denn das Gewicht verteilt sich auf 5 Standbeine. &lt;br /&gt;
Es werden 6 Stellungen pro Bein benötigt (A, B, C, D, E, F) und 6 Schritte. &lt;br /&gt;
Es gibt mehrere Möglichkeiten der Startaufstellung ich will hier eine kurz Darstellen: &lt;br /&gt;
Bein 1: A -&amp;gt; B  -&amp;gt; C  usw. &amp;lt;br&amp;gt;&lt;br /&gt;
Bein 2: D -&amp;gt; E  -&amp;gt; F &amp;lt;br&amp;gt;&lt;br /&gt;
Bein 3: E -&amp;gt; F  --&amp;gt; A &amp;lt;br&amp;gt;&lt;br /&gt;
Bein 4: B -&amp;gt; C  -&amp;gt; D &amp;lt;br&amp;gt;&lt;br /&gt;
Bein 5: C -&amp;gt; D  -&amp;gt; E &amp;lt;br&amp;gt;&lt;br /&gt;
Bein 6: F --&amp;gt; A -&amp;gt; B &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Pfeile geben an in Welche Stellung sich die Beine als nächstes bewegen, Bein 6 wird sich in die Stellung A bewegen. Dieser Rückstellvorgang muss immer in der Luft erfolgen. So wird sich der Roboter kontinuierlich vorwärts bewegen.&lt;br /&gt;
&lt;br /&gt;
==Hexapods in der Kurve==&lt;br /&gt;
&lt;br /&gt;
Nochmals das Bild von oben &lt;br /&gt;
&lt;br /&gt;
[[Bild:Hextop1.jpg]]&lt;br /&gt;
&lt;br /&gt;
Die effektiven Beinwege '''s''' können auch wie die Räder von einem sechsrädrigen Fahrzeug verstanden werden.&lt;br /&gt;
&lt;br /&gt;
Wenn wir nun eine Kurve beschreiben wollen, verkürzen wir die Wege '''s''' auf einer Seite, dadurch ergibt sich ein Drehpunkt '''P'''&lt;br /&gt;
&lt;br /&gt;
[[Bild:Hexcurv1.jpg]]&lt;br /&gt;
&lt;br /&gt;
Was man sieht: Es muss eigentlich jedes Bein eine individuelle Bewegung machen.&lt;br /&gt;
UND: jedes Bein muss seinen eigenen [[Spinnenbeine#Beinbewegung|Kurvenradius einhalten]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Hexapods drehen===&lt;br /&gt;
Alternativ, etwas einfacher zu programmieren, weil die Stellungen von Oben weiter verwendet werden können ist das Panzer Modell. &lt;br /&gt;
Konkret heisst es, die rechte Seite der Beine bewegt sich weiter nach oben, wärend die linke Seite der Beine sich nach unten bewegt. Dadurch wird der Roboter auf der Stelle gedreht. D.h. die Bewegungsrichtung der Beine ist insgesammt links zu rechts gegenläufig.&lt;br /&gt;
&lt;br /&gt;
==Kräfte am Spinnenbein==&lt;br /&gt;
Da eine genaue Berechnung recht aufwendig ist und von vielen Faktoren zusätzlich stark beeinflusst wird (Dynamik und äußere Einflüsse), soll hier nur eine qualifizierende Betrachtung erfolgen. &lt;br /&gt;
&lt;br /&gt;
Für Beine gibt es zwei völlig unterschiedliche Situationen: &lt;br /&gt;
===Ohne Bodenhaftung===&lt;br /&gt;
(Glatteis)&lt;br /&gt;
[[Bild:Podvec1.jpg]]&lt;br /&gt;
&lt;br /&gt;
Die Beine werden auseinandergedrückt. Das Kniegelenk muß versuchen, Ober- und Unterschenkel beisammenzuhalten, und in der Schulter muss das anteilige Gewicht des Fahrzeuges getragen werden. Durch die langen Hebel wird da, je nach Beinstellung, eine beachtliche Kraft erforderlich.&lt;br /&gt;
&lt;br /&gt;
===Mit Bodenhaftung===&lt;br /&gt;
(Teppich)&lt;br /&gt;
[[Bild:Podvec2.jpg]]&lt;br /&gt;
&lt;br /&gt;
Ganz anders bei ausreichender Haftung: Da die Füße ja nicht wegrutschen, zieht das Gewicht des Fahrzeuges über die Oberschenkel die Knie nach innen. Hier müssen die Oberschenkel nach außen stemmen, um dem entgegenzuwirken. &lt;br /&gt;
&lt;br /&gt;
''TextBitte beachten, die Beine können auch günstiger als auf dem Bild dargestellt, eingerichtet werden. Wenn der Oberschenkel waagrecht zum Roboterkörper ist. Muss das Schultergelenk zwar das gesammte Gewicht des Roboters tragen, aber das Kniegelenk wird praktisch vollständig entlastet. Auch bei Eis als Untergrund würde ein Wegrutschen der Beine so verhindert werden. ''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Ein Rechenbeispiel====&lt;br /&gt;
Des weiteren ist es wichtig zu erwähnen, dass je nach Bauart des Beines, also welche die sich weiter an der Seite vom Bot befinden, enorme Hebelkräfte auftreten. Um die passenden Servos für seinen Roboter heraus zu suchen hier ein Rechenbeispiel: &lt;br /&gt;
&lt;br /&gt;
[[Bild:Beine65.jpg]]&lt;br /&gt;
&lt;br /&gt;
Gegeben sei &amp;quot;a&amp;quot; als größtmöglicher Abstand zum Körper (blau).&lt;br /&gt;
Je nach Bauart des Roboters und der Wahl der Bewegung sind entweder 3 oder 4 oder gar 5 Beine gleichzeit am Boden. Auf diese wird das gesammte Gewicht des Roboter verteilt. Uns interessiert an dieser Stelle wieviel Ncm im Schultergelenk notwendig sind um den Roboter hochzudrücken. Aus der Zeichnung wird wieder deutlich warum es sinnvoll ist den Unterschenkel möglichst senkrecht zu halten und den Oberschenkel waagrecht. Unter dieser Positionierung muss das Kniegelenk nämlich kein Drehmoment übertragen. &lt;br /&gt;
&lt;br /&gt;
Aber zurück zur Rechnung. &lt;br /&gt;
&lt;br /&gt;
das Drehmoment in der Schulter wird wie folgt berechnet: &lt;br /&gt;
(Gewicht /Anzahl der Beine)* Hebelarm = Drehmoment in der Schulter&lt;br /&gt;
&lt;br /&gt;
in unserem Beispielt &lt;br /&gt;
a=10cm; G=1kg=10N; 3Beine am Boden&lt;br /&gt;
&lt;br /&gt;
(10N / 3)* 10cm = 33,3Ncm&lt;br /&gt;
    &lt;br /&gt;
Wir benötigen also in der Schulter Servos welche mindestens 33,3Ncm schaffen, zur Sicherheit wären 35Ncm sinnvoller. &lt;br /&gt;
Die Rechnung lässt sich natürlich auch so umstellen, dass anhand der Servos das Gesamtgewicht ermittelt werden kann: &lt;br /&gt;
&lt;br /&gt;
(Drehmoment der Servos / Hebelarm)* Anzahl der Beine = Gewicht des Roboters&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dasselbe gilt natürlich auch für Quadrobots. Nur muss man die Faktoren der Anzahl der Beine ändern&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[Servos]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Mechanik]]&lt;br /&gt;
[[Kategorie:Praxis]]&lt;br /&gt;
&lt;br /&gt;
[http://www.lynxmotion.com Lynxmotion, Referenz für Roboter mit Beinen]&lt;/div&gt;</summary>
		<author><name>HannoHupmann</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Spinnenbeine_(Hexapods)&amp;diff=8698</id>
		<title>Spinnenbeine (Hexapods)</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Spinnenbeine_(Hexapods)&amp;diff=8698"/>
				<updated>2006-09-14T17:18:55Z</updated>
		
		<summary type="html">&lt;p&gt;HannoHupmann: /* Siehe auch */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Spinnenbeine, Hexabots, Quadrobots und Polybots==&lt;br /&gt;
&lt;br /&gt;
Wenn man sich erstmal nicht damit zufriedengibt, einfach mit den Beinen irgendwie herumzurudern (&amp;quot;Hauptsache, es bewegt sich&amp;quot;), sind Beinbewegungen gar nicht so ohne. &lt;br /&gt;
&lt;br /&gt;
Schauen wir uns mal die häufigste Variante an, das sind die echsen- oder spinnenartigen Bauformen. Hauptmerkmal ist, dass die Beine seitlich am Körper angebracht sind.&lt;br /&gt;
&lt;br /&gt;
Dabei können folgende Anordnungen und Beine unterschieden werden: &lt;br /&gt;
Die auf dem Bild gezeigte anordnung von 3 Beinen links so wie rechts ist die gängigste für Hexabots. Alternativ können die Beine auch in einem Sechseck angeordnet werden (siehe auch Bild weiter unten). Diese Anordnung hat den Vorteil, dass sie etwas wendiger ist, dies erkauft man sich durch eine etwas komplizierte Programmierung. Denn die Beinstellungen sind hier aufwendiger. &lt;br /&gt;
&lt;br /&gt;
Roboter mit nur 4 Beinen werden gemeinhin als Quadrobots bezeichnet. &lt;br /&gt;
Roboter mit mehr als 6 Beinen werden als Polybot bezeichnet.&lt;br /&gt;
&lt;br /&gt;
==Ein Beinpaar im Querschnitt==&lt;br /&gt;
Das hier dargestellte Bein hat 3 Gelenke (jedoch sind nur 2 sichtbar). Einmal ein Gelenk an der Schulter und eines am Knie, das nicht sichtbare ist in der ansicht von Oben dafür verantwortlich das Bein vor und zurück zu bewegen. &lt;br /&gt;
Somit hat diese Bein 3 Freiheitsgrade (1x Knie, 1x Schulter (auf und ab) und 1x Schulter (vor zurück) dies wird oft auch als 3DOF (Degree of Freedom) bezeichnet. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:Podlegside.jpg]]&lt;br /&gt;
&lt;br /&gt;
(Die Beinhaltung ist hier ganz allgemein gehalten, tatsächlich sind da große Unterschiede, je nach Bauart.)&lt;br /&gt;
*Z ist die vertikale Drehachse des &amp;quot;Schulter&amp;quot;-Gelenks&lt;br /&gt;
*h ist die Höhe des Körpers über dem Boden&lt;br /&gt;
*a ist der Oberschenkel&lt;br /&gt;
*&amp;amp;beta; der Winkel des Oberschenkels&lt;br /&gt;
*K ist das Knie&lt;br /&gt;
*b ist der Unterschenkel &lt;br /&gt;
*&amp;amp;alpha; der Winkel im Knie &lt;br /&gt;
*F ist der Fußpunkt&lt;br /&gt;
*&amp;amp;gamma; der Winkel, den der Unterschenkel mit dem Boden einnimmt&lt;br /&gt;
*r ist der resultierende Radius des Fußpunktes um die Schulter&lt;br /&gt;
*M der Schwerpunkt unseres Roboters &lt;br /&gt;
*br der Abstand des Schwerpunkts bis zur Schulter&lt;br /&gt;
&lt;br /&gt;
==Variante &amp;quot;Lynxmotion&amp;quot;==&lt;br /&gt;
[[Bild:Podlynx.jpg]]&lt;br /&gt;
&lt;br /&gt;
Hier ist der Oberschenkel gewissermaßen geteilt. Der vertikal bewegliche Teil davon ist sehr kurz und als Parallelogramm ausgeführt, um den Unterschenkel senkrecht halten zu können. Dieser kann aktiv nur gehoben und gesenkt werden, durch Federn hat er aber ein gewisses seitliches Spiel.&lt;br /&gt;
&lt;br /&gt;
Der Zweck dieser Konstruktion ist es, das Schultergelenk mit nur einem Freiheitsgrad sehr robust ausführen zu können.&lt;br /&gt;
Diese Variante der Beine hat also insgesammt nur 2 Freiheitsgrade (Schulter und heben, senken) und wird oft auch als DOF2 bezeichnet.&lt;br /&gt;
&lt;br /&gt;
==Ein (linkes) Bein von oben==&lt;br /&gt;
&lt;br /&gt;
[[Bild:Podlegtop.jpg]]&lt;br /&gt;
&lt;br /&gt;
man findet die Werte aus der seitlichen Ansicht&lt;br /&gt;
*Z die vertikale Drehachse der Schulter (bleiben wir mal bei &amp;quot;Schulter&amp;quot;)&lt;br /&gt;
*r&amp;lt;sup&amp;gt;min&amp;lt;/sup&amp;gt; als kleinstmöglicher Radius, den der Fußpunkt beschreiben kann (wenn der Unterschenkel maximal angezogen ist = kleines &amp;amp;alpha;)&lt;br /&gt;
*r&amp;lt;sup&amp;gt;max&amp;lt;/sup&amp;gt; als größtmöglicher Radius (= großes &amp;amp;alpha;)&lt;br /&gt;
*&amp;amp;delta;&amp;lt;sup&amp;gt;max&amp;lt;/sup&amp;gt; das ist der größtmögliche Drehwinkel des Schultergelenks&lt;br /&gt;
&lt;br /&gt;
schraffiert ist der Bereich, in dem sich die &amp;quot;Fußspitze&amp;quot; bewegen kann. &lt;br /&gt;
&lt;br /&gt;
 '''s''' ist somit die größtmögliche Schrittweite (bei gerader Fortbewegung)&lt;br /&gt;
&lt;br /&gt;
und dann noch&lt;br /&gt;
*M ist der Schwerpunkt (oder Mittelpunkt) des gesamten Fahrzeuges&lt;br /&gt;
*br die halbe Breite&lt;br /&gt;
*f der Abstand dieses Beines von der Querachse&lt;br /&gt;
&lt;br /&gt;
==Beinbewegung==&lt;br /&gt;
===Geradeaus===&lt;br /&gt;
Wird das Bein nun für einen Schritt von vorne nach hinten gedreht (durch Drehung des &amp;quot;Schulter&amp;quot;-Servos), würde sich die Fußspitze in einem Kreisbogen bewegen. Unterwegs würde allerdings die Fußspitze nach außen wegrutschen. Am schlimmsten daran ist der Verlust der Haftreibung, von der noch zu sprechen ist.&lt;br /&gt;
&lt;br /&gt;
Das Bein muß also unterwegs so verkürzt werden, daß sich die Fußspitze entlang der geraden Sehne '''s''' bewegt. Und dann muss noch die Winkelgeschwindigkeit des Schultergelenks angepasst werden, da ja auch der Radius kontinuierlich verändert wird.&lt;br /&gt;
===In einer Kurve===&lt;br /&gt;
Um irgendein Fahrzeug in eine Kurve nach rechts zu bringen, kann man z.B. die Räder links schneller drehen lassen. Sowas geht bei Beinen natürlich nicht. Hier muß die Schrittweite variiert werden. &lt;br /&gt;
Und noch eine Tücke in der Kurve: Der Schreitweg '''s''' muss um den Kurvenradius-Mittelpunkt einen Bogen machen. &lt;br /&gt;
&lt;br /&gt;
[[Bild:Podtopc.jpg]]&lt;br /&gt;
&lt;br /&gt;
*P Kurven-Mittelpunkt&lt;br /&gt;
*M Fahrzeugmittelpunkt&lt;br /&gt;
*r&amp;lt;sub&amp;gt;fzg&amp;lt;/sub&amp;gt;Radius des Fahrzeuges um P&lt;br /&gt;
&lt;br /&gt;
==Anordnung der Beine==&lt;br /&gt;
===Hexapods===&lt;br /&gt;
[[Bild:Hextop1.jpg]]&lt;br /&gt;
[[Bild:Hextop2.jpg]]&lt;br /&gt;
&lt;br /&gt;
das sind zwei Möglichkeiten, bei einem Hexpod die Beine anzuordnen. Die linke Variante hat den Vorteil, dass beim Geradeauslauf die Bewegungen der Beine identisch sein können, allerdings den Nachteil, dass der Rumpf länger sein muss (damit sich die Beine nicht in die Quere kommen). Die rechte Bauart hat diesen Nachteil nicht, aber dafür sind die erforderlichen Schrittbewegungen komplizierter.&lt;br /&gt;
&lt;br /&gt;
==Schrittfolge==&lt;br /&gt;
Es ist ja klar, daß wir nicht alle sechs Beine gleichzeitig bewegen können. Man braucht also eine Schrittfolge.&lt;br /&gt;
Hier können mehrere Varianten unterschieden werden. Da ein Spinnenroboter 6 Beine hat und zum stehen 3 Stück (ein Dreieck bildend) ausreichen gibt es: 3:3. Wir können aber auch nur 2 Beine bewegen und 4 auf dem Boden stehen lassen also 2:4 oder alternativ nur ein Bein bewegen und mit den restlichen 5 auf dem Boden stehen, also 5:1. In Kurven ist das ganze noch etwas komplizierter daher beschäftigen wir uns als erstes mit: &lt;br /&gt;
&lt;br /&gt;
===geradeaus 3:3===&lt;br /&gt;
Die folgende Methode wird gerne angewandt, weil sie recht einfach und auch rein mechanisch gemacht werden kann, allerdings ist die Belastung für die Servos bei dieser Variante am grössten, denn nur 3 Beine teilen sich das gesamte Gewicht des Roboters. Die Beine 1, 4 u. 5  bzw. 2, 3 u. 6  werden jeweils gleich angesteuert, phasenmäßig aber um 180 Grad versetzt. &lt;br /&gt;
&lt;br /&gt;
Im linken Bild sind die Beine 2, 3 u. 6 gerade ganz vorne, die anderen Beine 1, 4 u. 5 ganz hinten&lt;br /&gt;
&lt;br /&gt;
[[Bild:Podstp1.jpg]]&lt;br /&gt;
[[Bild:Podstp2.jpg]]&lt;br /&gt;
&lt;br /&gt;
Im rechten Bild sind 2, 3 u. 6 mit ihrer Bewegung fertig, sie haben das Fahrzeug fortbewegt, jetzt kehrt sich die Sache um&lt;br /&gt;
&lt;br /&gt;
'''Schwerpunkt ?'''&lt;br /&gt;
&lt;br /&gt;
Unterstützt wird das ganze Gerät immer an den Fußpunkten der Beine. Verbindet man diese jeweils drei Punkte, ergeben sich zwei Dreiecke, die in den beiden Zeichnungen strichliert angedeutet sind. Teilweise überlappen sie sich, das ist der Bereich, wo sich der Schwerpunkt des ganzen Fahrzeuges befinden darf.&lt;br /&gt;
&lt;br /&gt;
 Und man sieht, dass diese Fläche bemerkenswert klein ist.&lt;br /&gt;
&lt;br /&gt;
Für 3:3 laufen benötigt jedes Bein 2 Stellungen einmal vorn (A) und einmal hinten (B). Zuerst befinden sich die Beine 2,3 u 6 in Stellung A und werden auf dem Boden gleichzeitig in Stellung B bewegt. Dadurch schiebt sich der Roboter um das Stück A zu B nach vorn. Die Beine 1, 4 u 5 bewegen sich in der selben Zeit von Stellung B nach A, jedoch ohne Bodenkontakt. Wird nun diese Sequenz, im wechsel mit 1, 4 u 5 am Boden und 2, 3 u 6 in der Luft, zyklisch ausgeführt, hat man schon ein passables Laufprogramm für gerade aus. &lt;br /&gt;
&lt;br /&gt;
===geradeaus 2:4===&lt;br /&gt;
Bei dieser Variante wird jeweils ein Beinpaar gleichzeitig bewegt. Diese sind günstigerweise:&lt;br /&gt;
1 und 4 (Paar 1); 3 und 6 (Paar 2); 2 und 5 (Paar 3)&lt;br /&gt;
Jedes Beinpaar benötigt jedoch 3 Stellungen: A, B, C. Der Algoritmus teilt sich daher auch in drei Schritte auf I, II und III. &lt;br /&gt;
&lt;br /&gt;
Für Schritt I bringen wir Paar 1 in Stellung A, Paar 2 in Stellung C und Paar 3 in Stellung B. &lt;br /&gt;
Für Schritt II bewegt sich Paar 1 in Stellung B, Paar 2 in Stellung A (diese Bewegung muss ohne Bodenkontakt erfolgen) und Paar 3 in Stellung C. &lt;br /&gt;
Für Schritt III bewegt sich Paar 1 in Stellung C, Paar 2 in Stellung B und Paar 3 in Stellung A (auch wieder in der Luft) &lt;br /&gt;
Ab hier wiederholt sich das Programm&lt;br /&gt;
&lt;br /&gt;
Fazit: Die Bewegungn sind etwas aufwendiger sich zu überlegen und zu programmieren, der Roboter gewinnt aber insgesammt an Stabilität und ist nur etwas langsamer als bei 3:3. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===geradeaus 1:5===&lt;br /&gt;
Diese Variante ist die langsamste, aber dafür am stabilsten, denn das Gewicht verteilt sich auf 5 Standbeine. &lt;br /&gt;
Es werden 6 Stellungen pro Bein benötigt (A, B, C, D, E, F) und 6 Schritte. &lt;br /&gt;
Es gibt mehrere Möglichkeiten der Startaufstellung ich will hier eine kurz Darstellen: &lt;br /&gt;
Bein 1: A -&amp;gt; B  -&amp;gt; C  usw. &amp;lt;br&amp;gt;&lt;br /&gt;
Bein 2: D -&amp;gt; E  -&amp;gt; F &amp;lt;br&amp;gt;&lt;br /&gt;
Bein 3: E -&amp;gt; F  --&amp;gt; A &amp;lt;br&amp;gt;&lt;br /&gt;
Bein 4: B -&amp;gt; C  -&amp;gt; D &amp;lt;br&amp;gt;&lt;br /&gt;
Bein 5: C -&amp;gt; D  -&amp;gt; E &amp;lt;br&amp;gt;&lt;br /&gt;
Bein 6: F --&amp;gt; A -&amp;gt; B &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Pfeile geben an in Welche Stellung sich die Beine als nächstes bewegen, Bein 6 wird sich in die Stellung A bewegen. Dieser Rückstellvorgang muss immer in der Luft erfolgen. So wird sich der Roboter kontinuierlich vorwärts bewegen.&lt;br /&gt;
&lt;br /&gt;
==Hexapods in der Kurve==&lt;br /&gt;
&lt;br /&gt;
Nochmals das Bild von oben &lt;br /&gt;
&lt;br /&gt;
[[Bild:Hextop1.jpg]]&lt;br /&gt;
&lt;br /&gt;
Die effektiven Beinwege '''s''' können auch wie die Räder von einem sechsrädrigen Fahrzeug verstanden werden.&lt;br /&gt;
&lt;br /&gt;
Wenn wir nun eine Kurve beschreiben wollen, verkürzen wir die Wege '''s''' auf einer Seite, dadurch ergibt sich ein Drehpunkt '''P'''&lt;br /&gt;
&lt;br /&gt;
[[Bild:Hexcurv1.jpg]]&lt;br /&gt;
&lt;br /&gt;
Was man sieht: Es muss eigentlich jedes Bein eine individuelle Bewegung machen.&lt;br /&gt;
UND: jedes Bein muss seinen eigenen [[Spinnenbeine#Beinbewegung|Kurvenradius einhalten]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Hexapods drehen===&lt;br /&gt;
Alternativ, etwas einfacher zu programmieren, weil die Stellungen von Oben weiter verwendet werden können ist das Panzer Modell. &lt;br /&gt;
Konkret heisst es, die rechte Seite der Beine bewegt sich weiter nach oben, wärend die linke Seite der Beine sich nach unten bewegt. Dadurch wird der Roboter auf der Stelle gedreht. D.h. die Bewegungsrichtung der Beine ist insgesammt links zu rechts gegenläufig.&lt;br /&gt;
&lt;br /&gt;
==Kräfte am Spinnenbein==&lt;br /&gt;
Da eine genaue Berechnung recht aufwendig ist und von vielen Faktoren zusätzlich stark beeinflusst wird (Dynamik und äußere Einflüsse), soll hier nur eine qualifizierende Betrachtung erfolgen. &lt;br /&gt;
&lt;br /&gt;
Für Beine gibt es zwei völlig unterschiedliche Situationen: &lt;br /&gt;
===Ohne Bodenhaftung===&lt;br /&gt;
(Glatteis)&lt;br /&gt;
[[Bild:Podvec1.jpg]]&lt;br /&gt;
&lt;br /&gt;
Die Beine werden auseinandergedrückt. Das Kniegelenk muß versuchen, Ober- und Unterschenkel beisammenzuhalten, und in der Schulter muss das anteilige Gewicht des Fahrzeuges getragen werden. Durch die langen Hebel wird da, je nach Beinstellung, eine beachtliche Kraft erforderlich.&lt;br /&gt;
&lt;br /&gt;
===Mit Bodenhaftung===&lt;br /&gt;
(Teppich)&lt;br /&gt;
[[Bild:Podvec2.jpg]]&lt;br /&gt;
&lt;br /&gt;
Ganz anders bei ausreichender Haftung: Da die Füße ja nicht wegrutschen, zieht das Gewicht des Fahrzeuges über die Oberschenkel die Knie nach innen. Hier müssen die Oberschenkel nach außen stemmen, um dem entgegenzuwirken. &lt;br /&gt;
&lt;br /&gt;
''TextBitte beachten, die Beine können auch günstiger als auf dem Bild dargestellt, eingerichtet werden. Wenn der Oberschenkel waagrecht zum Roboterkörper ist. Muss das Schultergelenk zwar das gesammte Gewicht des Roboters tragen, aber das Kniegelenk wird praktisch vollständig entlastet. Auch bei Eis als Untergrund würde ein Wegrutschen der Beine so verhindert werden. ''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Ein Rechenbeispiel====&lt;br /&gt;
Des weiteren ist es wichtig zu erwähnen, dass je nach Bauart des Beines, also welche die sich weiter an der Seite vom Bot befinden, enorme Hebelkräfte auftreten. Um die passenden Servos für seinen Roboter heraus zu suchen hier ein Rechenbeispiel: &lt;br /&gt;
&lt;br /&gt;
[[Bild:Beine65.jpg]]&lt;br /&gt;
&lt;br /&gt;
Gegeben sei &amp;quot;a&amp;quot; als größtmöglicher Abstand zum Körper (blau).&lt;br /&gt;
Je nach Bauart des Roboters und der Wahl der Bewegung sind entweder 3 oder 4 oder gar 5 Beine gleichzeit am Boden. Auf diese wird das gesammte Gewicht des Roboter verteilt. Uns interessiert an dieser Stelle wieviel Ncm im Schultergelenk notwendig sind um den Roboter hochzudrücken. Aus der Zeichnung wird wieder deutlich warum es sinnvoll ist den Unterschenkel möglichst senkrecht zu halten und den Oberschenkel waagrecht. Unter dieser Positionierung muss das Kniegelenk nämlich kein Drehmoment übertragen. &lt;br /&gt;
&lt;br /&gt;
Aber zurück zur Rechnung. &lt;br /&gt;
&lt;br /&gt;
das Drehmoment in der Schulter wird wie folgt berechnet: &lt;br /&gt;
(Gewicht /Anzahl der Beine)* Hebelarm = Drehmoment in der Schulter&lt;br /&gt;
&lt;br /&gt;
in unserem Beispielt &lt;br /&gt;
a=10cm; G=1kg=10N; 3Beine am Boden&lt;br /&gt;
&lt;br /&gt;
(10N / 3)* 10cm = 33,3Ncm&lt;br /&gt;
    &lt;br /&gt;
Wir benötigen also in der Schulter Servos welche mindestens 33,3Ncm schaffen, zur Sicherheit wären 35Ncm sinnvoller. &lt;br /&gt;
Die Rechnung lässt sich natürlich auch so umstellen, dass anhand der Servos das Gesamtgewicht ermittelt werden kann: &lt;br /&gt;
&lt;br /&gt;
(Drehmoment der Servos / Hebelarm)* Anzahl der Beine = Gewicht des Roboters&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dasselbe gilt natürlich auch für Quadrobots. Nur muss man die Faktoren der Anzahl der Beine ändern&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[Servos]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Mechanik]]&lt;br /&gt;
[[Kategorie:Praxis]]&lt;br /&gt;
&lt;br /&gt;
[http://www.lynxmotion.com Lynxmotion, Referenz für Roboter mit Beinen]&lt;/div&gt;</summary>
		<author><name>HannoHupmann</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Spinnenbeine_(Hexapods)&amp;diff=8697</id>
		<title>Spinnenbeine (Hexapods)</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Spinnenbeine_(Hexapods)&amp;diff=8697"/>
				<updated>2006-09-14T17:16:53Z</updated>
		
		<summary type="html">&lt;p&gt;HannoHupmann: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Spinnenbeine, Hexabots, Quadrobots und Polybots==&lt;br /&gt;
&lt;br /&gt;
Wenn man sich erstmal nicht damit zufriedengibt, einfach mit den Beinen irgendwie herumzurudern (&amp;quot;Hauptsache, es bewegt sich&amp;quot;), sind Beinbewegungen gar nicht so ohne. &lt;br /&gt;
&lt;br /&gt;
Schauen wir uns mal die häufigste Variante an, das sind die echsen- oder spinnenartigen Bauformen. Hauptmerkmal ist, dass die Beine seitlich am Körper angebracht sind.&lt;br /&gt;
&lt;br /&gt;
Dabei können folgende Anordnungen und Beine unterschieden werden: &lt;br /&gt;
Die auf dem Bild gezeigte anordnung von 3 Beinen links so wie rechts ist die gängigste für Hexabots. Alternativ können die Beine auch in einem Sechseck angeordnet werden (siehe auch Bild weiter unten). Diese Anordnung hat den Vorteil, dass sie etwas wendiger ist, dies erkauft man sich durch eine etwas komplizierte Programmierung. Denn die Beinstellungen sind hier aufwendiger. &lt;br /&gt;
&lt;br /&gt;
Roboter mit nur 4 Beinen werden gemeinhin als Quadrobots bezeichnet. &lt;br /&gt;
Roboter mit mehr als 6 Beinen werden als Polybot bezeichnet.&lt;br /&gt;
&lt;br /&gt;
==Ein Beinpaar im Querschnitt==&lt;br /&gt;
Das hier dargestellte Bein hat 3 Gelenke (jedoch sind nur 2 sichtbar). Einmal ein Gelenk an der Schulter und eines am Knie, das nicht sichtbare ist in der ansicht von Oben dafür verantwortlich das Bein vor und zurück zu bewegen. &lt;br /&gt;
Somit hat diese Bein 3 Freiheitsgrade (1x Knie, 1x Schulter (auf und ab) und 1x Schulter (vor zurück) dies wird oft auch als 3DOF (Degree of Freedom) bezeichnet. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:Podlegside.jpg]]&lt;br /&gt;
&lt;br /&gt;
(Die Beinhaltung ist hier ganz allgemein gehalten, tatsächlich sind da große Unterschiede, je nach Bauart.)&lt;br /&gt;
*Z ist die vertikale Drehachse des &amp;quot;Schulter&amp;quot;-Gelenks&lt;br /&gt;
*h ist die Höhe des Körpers über dem Boden&lt;br /&gt;
*a ist der Oberschenkel&lt;br /&gt;
*&amp;amp;beta; der Winkel des Oberschenkels&lt;br /&gt;
*K ist das Knie&lt;br /&gt;
*b ist der Unterschenkel &lt;br /&gt;
*&amp;amp;alpha; der Winkel im Knie &lt;br /&gt;
*F ist der Fußpunkt&lt;br /&gt;
*&amp;amp;gamma; der Winkel, den der Unterschenkel mit dem Boden einnimmt&lt;br /&gt;
*r ist der resultierende Radius des Fußpunktes um die Schulter&lt;br /&gt;
*M der Schwerpunkt unseres Roboters &lt;br /&gt;
*br der Abstand des Schwerpunkts bis zur Schulter&lt;br /&gt;
&lt;br /&gt;
==Variante &amp;quot;Lynxmotion&amp;quot;==&lt;br /&gt;
[[Bild:Podlynx.jpg]]&lt;br /&gt;
&lt;br /&gt;
Hier ist der Oberschenkel gewissermaßen geteilt. Der vertikal bewegliche Teil davon ist sehr kurz und als Parallelogramm ausgeführt, um den Unterschenkel senkrecht halten zu können. Dieser kann aktiv nur gehoben und gesenkt werden, durch Federn hat er aber ein gewisses seitliches Spiel.&lt;br /&gt;
&lt;br /&gt;
Der Zweck dieser Konstruktion ist es, das Schultergelenk mit nur einem Freiheitsgrad sehr robust ausführen zu können.&lt;br /&gt;
Diese Variante der Beine hat also insgesammt nur 2 Freiheitsgrade (Schulter und heben, senken) und wird oft auch als DOF2 bezeichnet.&lt;br /&gt;
&lt;br /&gt;
==Ein (linkes) Bein von oben==&lt;br /&gt;
&lt;br /&gt;
[[Bild:Podlegtop.jpg]]&lt;br /&gt;
&lt;br /&gt;
man findet die Werte aus der seitlichen Ansicht&lt;br /&gt;
*Z die vertikale Drehachse der Schulter (bleiben wir mal bei &amp;quot;Schulter&amp;quot;)&lt;br /&gt;
*r&amp;lt;sup&amp;gt;min&amp;lt;/sup&amp;gt; als kleinstmöglicher Radius, den der Fußpunkt beschreiben kann (wenn der Unterschenkel maximal angezogen ist = kleines &amp;amp;alpha;)&lt;br /&gt;
*r&amp;lt;sup&amp;gt;max&amp;lt;/sup&amp;gt; als größtmöglicher Radius (= großes &amp;amp;alpha;)&lt;br /&gt;
*&amp;amp;delta;&amp;lt;sup&amp;gt;max&amp;lt;/sup&amp;gt; das ist der größtmögliche Drehwinkel des Schultergelenks&lt;br /&gt;
&lt;br /&gt;
schraffiert ist der Bereich, in dem sich die &amp;quot;Fußspitze&amp;quot; bewegen kann. &lt;br /&gt;
&lt;br /&gt;
 '''s''' ist somit die größtmögliche Schrittweite (bei gerader Fortbewegung)&lt;br /&gt;
&lt;br /&gt;
und dann noch&lt;br /&gt;
*M ist der Schwerpunkt (oder Mittelpunkt) des gesamten Fahrzeuges&lt;br /&gt;
*br die halbe Breite&lt;br /&gt;
*f der Abstand dieses Beines von der Querachse&lt;br /&gt;
&lt;br /&gt;
==Beinbewegung==&lt;br /&gt;
===Geradeaus===&lt;br /&gt;
Wird das Bein nun für einen Schritt von vorne nach hinten gedreht (durch Drehung des &amp;quot;Schulter&amp;quot;-Servos), würde sich die Fußspitze in einem Kreisbogen bewegen. Unterwegs würde allerdings die Fußspitze nach außen wegrutschen. Am schlimmsten daran ist der Verlust der Haftreibung, von der noch zu sprechen ist.&lt;br /&gt;
&lt;br /&gt;
Das Bein muß also unterwegs so verkürzt werden, daß sich die Fußspitze entlang der geraden Sehne '''s''' bewegt. Und dann muss noch die Winkelgeschwindigkeit des Schultergelenks angepasst werden, da ja auch der Radius kontinuierlich verändert wird.&lt;br /&gt;
===In einer Kurve===&lt;br /&gt;
Um irgendein Fahrzeug in eine Kurve nach rechts zu bringen, kann man z.B. die Räder links schneller drehen lassen. Sowas geht bei Beinen natürlich nicht. Hier muß die Schrittweite variiert werden. &lt;br /&gt;
Und noch eine Tücke in der Kurve: Der Schreitweg '''s''' muss um den Kurvenradius-Mittelpunkt einen Bogen machen. &lt;br /&gt;
&lt;br /&gt;
[[Bild:Podtopc.jpg]]&lt;br /&gt;
&lt;br /&gt;
*P Kurven-Mittelpunkt&lt;br /&gt;
*M Fahrzeugmittelpunkt&lt;br /&gt;
*r&amp;lt;sub&amp;gt;fzg&amp;lt;/sub&amp;gt;Radius des Fahrzeuges um P&lt;br /&gt;
&lt;br /&gt;
==Anordnung der Beine==&lt;br /&gt;
===Hexapods===&lt;br /&gt;
[[Bild:Hextop1.jpg]]&lt;br /&gt;
[[Bild:Hextop2.jpg]]&lt;br /&gt;
&lt;br /&gt;
das sind zwei Möglichkeiten, bei einem Hexpod die Beine anzuordnen. Die linke Variante hat den Vorteil, dass beim Geradeauslauf die Bewegungen der Beine identisch sein können, allerdings den Nachteil, dass der Rumpf länger sein muss (damit sich die Beine nicht in die Quere kommen). Die rechte Bauart hat diesen Nachteil nicht, aber dafür sind die erforderlichen Schrittbewegungen komplizierter.&lt;br /&gt;
&lt;br /&gt;
==Schrittfolge==&lt;br /&gt;
Es ist ja klar, daß wir nicht alle sechs Beine gleichzeitig bewegen können. Man braucht also eine Schrittfolge.&lt;br /&gt;
Hier können mehrere Varianten unterschieden werden. Da ein Spinnenroboter 6 Beine hat und zum stehen 3 Stück (ein Dreieck bildend) ausreichen gibt es: 3:3. Wir können aber auch nur 2 Beine bewegen und 4 auf dem Boden stehen lassen also 2:4 oder alternativ nur ein Bein bewegen und mit den restlichen 5 auf dem Boden stehen, also 5:1. In Kurven ist das ganze noch etwas komplizierter daher beschäftigen wir uns als erstes mit: &lt;br /&gt;
&lt;br /&gt;
===geradeaus 3:3===&lt;br /&gt;
Die folgende Methode wird gerne angewandt, weil sie recht einfach und auch rein mechanisch gemacht werden kann, allerdings ist die Belastung für die Servos bei dieser Variante am grössten, denn nur 3 Beine teilen sich das gesamte Gewicht des Roboters. Die Beine 1, 4 u. 5  bzw. 2, 3 u. 6  werden jeweils gleich angesteuert, phasenmäßig aber um 180 Grad versetzt. &lt;br /&gt;
&lt;br /&gt;
Im linken Bild sind die Beine 2, 3 u. 6 gerade ganz vorne, die anderen Beine 1, 4 u. 5 ganz hinten&lt;br /&gt;
&lt;br /&gt;
[[Bild:Podstp1.jpg]]&lt;br /&gt;
[[Bild:Podstp2.jpg]]&lt;br /&gt;
&lt;br /&gt;
Im rechten Bild sind 2, 3 u. 6 mit ihrer Bewegung fertig, sie haben das Fahrzeug fortbewegt, jetzt kehrt sich die Sache um&lt;br /&gt;
&lt;br /&gt;
'''Schwerpunkt ?'''&lt;br /&gt;
&lt;br /&gt;
Unterstützt wird das ganze Gerät immer an den Fußpunkten der Beine. Verbindet man diese jeweils drei Punkte, ergeben sich zwei Dreiecke, die in den beiden Zeichnungen strichliert angedeutet sind. Teilweise überlappen sie sich, das ist der Bereich, wo sich der Schwerpunkt des ganzen Fahrzeuges befinden darf.&lt;br /&gt;
&lt;br /&gt;
 Und man sieht, dass diese Fläche bemerkenswert klein ist.&lt;br /&gt;
&lt;br /&gt;
Für 3:3 laufen benötigt jedes Bein 2 Stellungen einmal vorn (A) und einmal hinten (B). Zuerst befinden sich die Beine 2,3 u 6 in Stellung A und werden auf dem Boden gleichzeitig in Stellung B bewegt. Dadurch schiebt sich der Roboter um das Stück A zu B nach vorn. Die Beine 1, 4 u 5 bewegen sich in der selben Zeit von Stellung B nach A, jedoch ohne Bodenkontakt. Wird nun diese Sequenz, im wechsel mit 1, 4 u 5 am Boden und 2, 3 u 6 in der Luft, zyklisch ausgeführt, hat man schon ein passables Laufprogramm für gerade aus. &lt;br /&gt;
&lt;br /&gt;
===geradeaus 2:4===&lt;br /&gt;
Bei dieser Variante wird jeweils ein Beinpaar gleichzeitig bewegt. Diese sind günstigerweise:&lt;br /&gt;
1 und 4 (Paar 1); 3 und 6 (Paar 2); 2 und 5 (Paar 3)&lt;br /&gt;
Jedes Beinpaar benötigt jedoch 3 Stellungen: A, B, C. Der Algoritmus teilt sich daher auch in drei Schritte auf I, II und III. &lt;br /&gt;
&lt;br /&gt;
Für Schritt I bringen wir Paar 1 in Stellung A, Paar 2 in Stellung C und Paar 3 in Stellung B. &lt;br /&gt;
Für Schritt II bewegt sich Paar 1 in Stellung B, Paar 2 in Stellung A (diese Bewegung muss ohne Bodenkontakt erfolgen) und Paar 3 in Stellung C. &lt;br /&gt;
Für Schritt III bewegt sich Paar 1 in Stellung C, Paar 2 in Stellung B und Paar 3 in Stellung A (auch wieder in der Luft) &lt;br /&gt;
Ab hier wiederholt sich das Programm&lt;br /&gt;
&lt;br /&gt;
Fazit: Die Bewegungn sind etwas aufwendiger sich zu überlegen und zu programmieren, der Roboter gewinnt aber insgesammt an Stabilität und ist nur etwas langsamer als bei 3:3. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===geradeaus 1:5===&lt;br /&gt;
Diese Variante ist die langsamste, aber dafür am stabilsten, denn das Gewicht verteilt sich auf 5 Standbeine. &lt;br /&gt;
Es werden 6 Stellungen pro Bein benötigt (A, B, C, D, E, F) und 6 Schritte. &lt;br /&gt;
Es gibt mehrere Möglichkeiten der Startaufstellung ich will hier eine kurz Darstellen: &lt;br /&gt;
Bein 1: A -&amp;gt; B  -&amp;gt; C  usw. &amp;lt;br&amp;gt;&lt;br /&gt;
Bein 2: D -&amp;gt; E  -&amp;gt; F &amp;lt;br&amp;gt;&lt;br /&gt;
Bein 3: E -&amp;gt; F  --&amp;gt; A &amp;lt;br&amp;gt;&lt;br /&gt;
Bein 4: B -&amp;gt; C  -&amp;gt; D &amp;lt;br&amp;gt;&lt;br /&gt;
Bein 5: C -&amp;gt; D  -&amp;gt; E &amp;lt;br&amp;gt;&lt;br /&gt;
Bein 6: F --&amp;gt; A -&amp;gt; B &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Pfeile geben an in Welche Stellung sich die Beine als nächstes bewegen, Bein 6 wird sich in die Stellung A bewegen. Dieser Rückstellvorgang muss immer in der Luft erfolgen. So wird sich der Roboter kontinuierlich vorwärts bewegen.&lt;br /&gt;
&lt;br /&gt;
==Hexapods in der Kurve==&lt;br /&gt;
&lt;br /&gt;
Nochmals das Bild von oben &lt;br /&gt;
&lt;br /&gt;
[[Bild:Hextop1.jpg]]&lt;br /&gt;
&lt;br /&gt;
Die effektiven Beinwege '''s''' können auch wie die Räder von einem sechsrädrigen Fahrzeug verstanden werden.&lt;br /&gt;
&lt;br /&gt;
Wenn wir nun eine Kurve beschreiben wollen, verkürzen wir die Wege '''s''' auf einer Seite, dadurch ergibt sich ein Drehpunkt '''P'''&lt;br /&gt;
&lt;br /&gt;
[[Bild:Hexcurv1.jpg]]&lt;br /&gt;
&lt;br /&gt;
Was man sieht: Es muss eigentlich jedes Bein eine individuelle Bewegung machen.&lt;br /&gt;
UND: jedes Bein muss seinen eigenen [[Spinnenbeine#Beinbewegung|Kurvenradius einhalten]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Hexapods drehen===&lt;br /&gt;
Alternativ, etwas einfacher zu programmieren, weil die Stellungen von Oben weiter verwendet werden können ist das Panzer Modell. &lt;br /&gt;
Konkret heisst es, die rechte Seite der Beine bewegt sich weiter nach oben, wärend die linke Seite der Beine sich nach unten bewegt. Dadurch wird der Roboter auf der Stelle gedreht. D.h. die Bewegungsrichtung der Beine ist insgesammt links zu rechts gegenläufig.&lt;br /&gt;
&lt;br /&gt;
==Kräfte am Spinnenbein==&lt;br /&gt;
Da eine genaue Berechnung recht aufwendig ist und von vielen Faktoren zusätzlich stark beeinflusst wird (Dynamik und äußere Einflüsse), soll hier nur eine qualifizierende Betrachtung erfolgen. &lt;br /&gt;
&lt;br /&gt;
Für Beine gibt es zwei völlig unterschiedliche Situationen: &lt;br /&gt;
===Ohne Bodenhaftung===&lt;br /&gt;
(Glatteis)&lt;br /&gt;
[[Bild:Podvec1.jpg]]&lt;br /&gt;
&lt;br /&gt;
Die Beine werden auseinandergedrückt. Das Kniegelenk muß versuchen, Ober- und Unterschenkel beisammenzuhalten, und in der Schulter muss das anteilige Gewicht des Fahrzeuges getragen werden. Durch die langen Hebel wird da, je nach Beinstellung, eine beachtliche Kraft erforderlich.&lt;br /&gt;
&lt;br /&gt;
===Mit Bodenhaftung===&lt;br /&gt;
(Teppich)&lt;br /&gt;
[[Bild:Podvec2.jpg]]&lt;br /&gt;
&lt;br /&gt;
Ganz anders bei ausreichender Haftung: Da die Füße ja nicht wegrutschen, zieht das Gewicht des Fahrzeuges über die Oberschenkel die Knie nach innen. Hier müssen die Oberschenkel nach außen stemmen, um dem entgegenzuwirken. &lt;br /&gt;
&lt;br /&gt;
''TextBitte beachten, die Beine können auch günstiger als auf dem Bild dargestellt, eingerichtet werden. Wenn der Oberschenkel waagrecht zum Roboterkörper ist. Muss das Schultergelenk zwar das gesammte Gewicht des Roboters tragen, aber das Kniegelenk wird praktisch vollständig entlastet. Auch bei Eis als Untergrund würde ein Wegrutschen der Beine so verhindert werden. ''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Ein Rechenbeispiel====&lt;br /&gt;
Des weiteren ist es wichtig zu erwähnen, dass je nach Bauart des Beines, also welche die sich weiter an der Seite vom Bot befinden, enorme Hebelkräfte auftreten. Um die passenden Servos für seinen Roboter heraus zu suchen hier ein Rechenbeispiel: &lt;br /&gt;
&lt;br /&gt;
[[Bild:Beine65.jpg]]&lt;br /&gt;
&lt;br /&gt;
Gegeben sei &amp;quot;a&amp;quot; als größtmöglicher Abstand zum Körper (blau).&lt;br /&gt;
Je nach Bauart des Roboters und der Wahl der Bewegung sind entweder 3 oder 4 oder gar 5 Beine gleichzeit am Boden. Auf diese wird das gesammte Gewicht des Roboter verteilt. Uns interessiert an dieser Stelle wieviel Ncm im Schultergelenk notwendig sind um den Roboter hochzudrücken. Aus der Zeichnung wird wieder deutlich warum es sinnvoll ist den Unterschenkel möglichst senkrecht zu halten und den Oberschenkel waagrecht. Unter dieser Positionierung muss das Kniegelenk nämlich kein Drehmoment übertragen. &lt;br /&gt;
&lt;br /&gt;
Aber zurück zur Rechnung. &lt;br /&gt;
&lt;br /&gt;
das Drehmoment in der Schulter wird wie folgt berechnet: &lt;br /&gt;
(Gewicht /Anzahl der Beine)* Hebelarm = Drehmoment in der Schulter&lt;br /&gt;
&lt;br /&gt;
in unserem Beispielt &lt;br /&gt;
a=10cm; G=1kg=10N; 3Beine am Boden&lt;br /&gt;
&lt;br /&gt;
(10N / 3)* 10cm = 33,3Ncm&lt;br /&gt;
    &lt;br /&gt;
Wir benötigen also in der Schulter Servos welche mindestens 33,3Ncm schaffen, zur Sicherheit wären 35Ncm sinnvoller. &lt;br /&gt;
Die Rechnung lässt sich natürlich auch so umstellen, dass anhand der Servos das Gesamtgewicht ermittelt werden kann: &lt;br /&gt;
&lt;br /&gt;
(Drehmoment der Servos / Hebelarm)* Anzahl der Beine = Gewicht des Roboters&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dasselbe gilt natürlich auch für Quadrobots. Nur muss man die Faktoren der Anzahl der Beine ändern&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[Servos]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Mechanik]]&lt;br /&gt;
[[Kategorie:Praxis]]&lt;/div&gt;</summary>
		<author><name>HannoHupmann</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Spinnenbeine_(Hexapods)&amp;diff=8696</id>
		<title>Spinnenbeine (Hexapods)</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Spinnenbeine_(Hexapods)&amp;diff=8696"/>
				<updated>2006-09-14T17:11:26Z</updated>
		
		<summary type="html">&lt;p&gt;HannoHupmann: /* Ein Rechenbeispiel */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Spinnenbeine==&lt;br /&gt;
&lt;br /&gt;
Wenn man sich erstmal nicht damit zufriedengibt, einfach mit den Beinen irgendwie herumzurudern (&amp;quot;Hauptsache, es bewegt sich&amp;quot;), sind Beinbewegungen gar nicht so ohne. &lt;br /&gt;
&lt;br /&gt;
Schauen wir uns mal die häufigste Variante an, das sind die echsen- oder spinnenartigen Bauformen. Hauptmerkmal ist, dass die Beine seitlich am Körper angebracht sind.&lt;br /&gt;
&lt;br /&gt;
Dabei können folgende Anordnungen und Beine unterschieden werden: &lt;br /&gt;
Die auf dem Bild gezeigte anordnung von 3 Beinen links so wie rechts ist die gängigste für Hexabots. Alternativ können die Beine auch in einem Sechseck angeordnet werden (siehe auch Bild weiter unten). Diese Anordnung hat den Vorteil, dass sie etwas wendiger ist, dies erkauft man sich durch eine etwas komplizierte Programmierung. Denn die Beinstellungen sind hier aufwendiger. &lt;br /&gt;
&lt;br /&gt;
Roboter mit nur 4 Beinen werden gemeinhin als Quadrobots bezeichnet. &lt;br /&gt;
Roboter mit mehr als 6 Beinen werden als Polybot bezeichnet.&lt;br /&gt;
&lt;br /&gt;
==Ein Beinpaar im Querschnitt==&lt;br /&gt;
Das hier dargestellte Bein hat 3 Gelenke (jedoch sind nur 2 sichtbar). Einmal ein Gelenk an der Schulter und eines am Knie, das nicht sichtbare ist in der ansicht von Oben dafür verantwortlich das Bein vor und zurück zu bewegen. &lt;br /&gt;
Somit hat diese Bein 3 Freiheitsgrade (1x Knie, 1x Schulter (auf und ab) und 1x Schulter (vor zurück) dies wird oft auch als 3DOF (Degree of Freedom) bezeichnet. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:Podlegside.jpg]]&lt;br /&gt;
&lt;br /&gt;
(Die Beinhaltung ist hier ganz allgemein gehalten, tatsächlich sind da große Unterschiede, je nach Bauart.)&lt;br /&gt;
*Z ist die vertikale Drehachse des &amp;quot;Schulter&amp;quot;-Gelenks&lt;br /&gt;
*h ist die Höhe des Körpers über dem Boden&lt;br /&gt;
*a ist der Oberschenkel&lt;br /&gt;
*&amp;amp;beta; der Winkel des Oberschenkels&lt;br /&gt;
*K ist das Knie&lt;br /&gt;
*b ist der Unterschenkel &lt;br /&gt;
*&amp;amp;alpha; der Winkel im Knie &lt;br /&gt;
*F ist der Fußpunkt&lt;br /&gt;
*&amp;amp;gamma; der Winkel, den der Unterschenkel mit dem Boden einnimmt&lt;br /&gt;
*r ist der resultierende Radius des Fußpunktes um die Schulter&lt;br /&gt;
*M der Schwerpunkt unseres Roboters &lt;br /&gt;
*br der Abstand des Schwerpunkts bis zur Schulter&lt;br /&gt;
&lt;br /&gt;
==Variante &amp;quot;Lynxmotion&amp;quot;==&lt;br /&gt;
[[Bild:Podlynx.jpg]]&lt;br /&gt;
&lt;br /&gt;
Hier ist der Oberschenkel gewissermaßen geteilt. Der vertikal bewegliche Teil davon ist sehr kurz und als Parallelogramm ausgeführt, um den Unterschenkel senkrecht halten zu können. Dieser kann aktiv nur gehoben und gesenkt werden, durch Federn hat er aber ein gewisses seitliches Spiel.&lt;br /&gt;
&lt;br /&gt;
Der Zweck dieser Konstruktion ist es, das Schultergelenk mit nur einem Freiheitsgrad sehr robust ausführen zu können.&lt;br /&gt;
Diese Variante der Beine hat also insgesammt nur 2 Freiheitsgrade (Schulter und heben, senken) und wird oft auch als DOF2 bezeichnet.&lt;br /&gt;
&lt;br /&gt;
==Ein (linkes) Bein von oben==&lt;br /&gt;
&lt;br /&gt;
[[Bild:Podlegtop.jpg]]&lt;br /&gt;
&lt;br /&gt;
man findet die Werte aus der seitlichen Ansicht&lt;br /&gt;
*Z die vertikale Drehachse der Schulter (bleiben wir mal bei &amp;quot;Schulter&amp;quot;)&lt;br /&gt;
*r&amp;lt;sup&amp;gt;min&amp;lt;/sup&amp;gt; als kleinstmöglicher Radius, den der Fußpunkt beschreiben kann (wenn der Unterschenkel maximal angezogen ist = kleines &amp;amp;alpha;)&lt;br /&gt;
*r&amp;lt;sup&amp;gt;max&amp;lt;/sup&amp;gt; als größtmöglicher Radius (= großes &amp;amp;alpha;)&lt;br /&gt;
*&amp;amp;delta;&amp;lt;sup&amp;gt;max&amp;lt;/sup&amp;gt; das ist der größtmögliche Drehwinkel des Schultergelenks&lt;br /&gt;
&lt;br /&gt;
schraffiert ist der Bereich, in dem sich die &amp;quot;Fußspitze&amp;quot; bewegen kann. &lt;br /&gt;
&lt;br /&gt;
 '''s''' ist somit die größtmögliche Schrittweite (bei gerader Fortbewegung)&lt;br /&gt;
&lt;br /&gt;
und dann noch&lt;br /&gt;
*M ist der Schwerpunkt (oder Mittelpunkt) des gesamten Fahrzeuges&lt;br /&gt;
*br die halbe Breite&lt;br /&gt;
*f der Abstand dieses Beines von der Querachse&lt;br /&gt;
&lt;br /&gt;
==Beinbewegung==&lt;br /&gt;
===Geradeaus===&lt;br /&gt;
Wird das Bein nun für einen Schritt von vorne nach hinten gedreht (durch Drehung des &amp;quot;Schulter&amp;quot;-Servos), würde sich die Fußspitze in einem Kreisbogen bewegen. Unterwegs würde allerdings die Fußspitze nach außen wegrutschen. Am schlimmsten daran ist der Verlust der Haftreibung, von der noch zu sprechen ist.&lt;br /&gt;
&lt;br /&gt;
Das Bein muß also unterwegs so verkürzt werden, daß sich die Fußspitze entlang der geraden Sehne '''s''' bewegt. Und dann muss noch die Winkelgeschwindigkeit des Schultergelenks angepasst werden, da ja auch der Radius kontinuierlich verändert wird.&lt;br /&gt;
===In einer Kurve===&lt;br /&gt;
Um irgendein Fahrzeug in eine Kurve nach rechts zu bringen, kann man z.B. die Räder links schneller drehen lassen. Sowas geht bei Beinen natürlich nicht. Hier muß die Schrittweite variiert werden. &lt;br /&gt;
Und noch eine Tücke in der Kurve: Der Schreitweg '''s''' muss um den Kurvenradius-Mittelpunkt einen Bogen machen. &lt;br /&gt;
&lt;br /&gt;
[[Bild:Podtopc.jpg]]&lt;br /&gt;
&lt;br /&gt;
*P Kurven-Mittelpunkt&lt;br /&gt;
*M Fahrzeugmittelpunkt&lt;br /&gt;
*r&amp;lt;sub&amp;gt;fzg&amp;lt;/sub&amp;gt;Radius des Fahrzeuges um P&lt;br /&gt;
&lt;br /&gt;
==Anordnung der Beine==&lt;br /&gt;
===Hexapods===&lt;br /&gt;
[[Bild:Hextop1.jpg]]&lt;br /&gt;
[[Bild:Hextop2.jpg]]&lt;br /&gt;
&lt;br /&gt;
das sind zwei Möglichkeiten, bei einem Hexpod die Beine anzuordnen. Die linke Variante hat den Vorteil, dass beim Geradeauslauf die Bewegungen der Beine identisch sein können, allerdings den Nachteil, dass der Rumpf länger sein muss (damit sich die Beine nicht in die Quere kommen). Die rechte Bauart hat diesen Nachteil nicht, aber dafür sind die erforderlichen Schrittbewegungen komplizierter.&lt;br /&gt;
&lt;br /&gt;
==Schrittfolge==&lt;br /&gt;
Es ist ja klar, daß wir nicht alle sechs Beine gleichzeitig bewegen können. Man braucht also eine Schrittfolge.&lt;br /&gt;
Hier können mehrere Varianten unterschieden werden. Da ein Spinnenroboter 6 Beine hat und zum stehen 3 Stück (ein Dreieck bildend) ausreichen gibt es: 3:3. Wir können aber auch nur 2 Beine bewegen und 4 auf dem Boden stehen lassen also 2:4 oder alternativ nur ein Bein bewegen und mit den restlichen 5 auf dem Boden stehen, also 5:1. In Kurven ist das ganze noch etwas komplizierter daher beschäftigen wir uns als erstes mit: &lt;br /&gt;
&lt;br /&gt;
===geradeaus 3:3===&lt;br /&gt;
Die folgende Methode wird gerne angewandt, weil sie recht einfach und auch rein mechanisch gemacht werden kann, allerdings ist die Belastung für die Servos bei dieser Variante am grössten, denn nur 3 Beine teilen sich das gesamte Gewicht des Roboters. Die Beine 1, 4 u. 5  bzw. 2, 3 u. 6  werden jeweils gleich angesteuert, phasenmäßig aber um 180 Grad versetzt. &lt;br /&gt;
&lt;br /&gt;
Im linken Bild sind die Beine 2, 3 u. 6 gerade ganz vorne, die anderen Beine 1, 4 u. 5 ganz hinten&lt;br /&gt;
&lt;br /&gt;
[[Bild:Podstp1.jpg]]&lt;br /&gt;
[[Bild:Podstp2.jpg]]&lt;br /&gt;
&lt;br /&gt;
Im rechten Bild sind 2, 3 u. 6 mit ihrer Bewegung fertig, sie haben das Fahrzeug fortbewegt, jetzt kehrt sich die Sache um&lt;br /&gt;
&lt;br /&gt;
'''Schwerpunkt ?'''&lt;br /&gt;
&lt;br /&gt;
Unterstützt wird das ganze Gerät immer an den Fußpunkten der Beine. Verbindet man diese jeweils drei Punkte, ergeben sich zwei Dreiecke, die in den beiden Zeichnungen strichliert angedeutet sind. Teilweise überlappen sie sich, das ist der Bereich, wo sich der Schwerpunkt des ganzen Fahrzeuges befinden darf.&lt;br /&gt;
&lt;br /&gt;
 Und man sieht, dass diese Fläche bemerkenswert klein ist.&lt;br /&gt;
&lt;br /&gt;
Für 3:3 laufen benötigt jedes Bein 2 Stellungen einmal vorn (A) und einmal hinten (B). Zuerst befinden sich die Beine 2,3 u 6 in Stellung A und werden auf dem Boden gleichzeitig in Stellung B bewegt. Dadurch schiebt sich der Roboter um das Stück A zu B nach vorn. Die Beine 1, 4 u 5 bewegen sich in der selben Zeit von Stellung B nach A, jedoch ohne Bodenkontakt. Wird nun diese Sequenz, im wechsel mit 1, 4 u 5 am Boden und 2, 3 u 6 in der Luft, zyklisch ausgeführt, hat man schon ein passables Laufprogramm für gerade aus. &lt;br /&gt;
&lt;br /&gt;
===geradeaus 2:4===&lt;br /&gt;
Bei dieser Variante wird jeweils ein Beinpaar gleichzeitig bewegt. Diese sind günstigerweise:&lt;br /&gt;
1 und 4 (Paar 1); 3 und 6 (Paar 2); 2 und 5 (Paar 3)&lt;br /&gt;
Jedes Beinpaar benötigt jedoch 3 Stellungen: A, B, C. Der Algoritmus teilt sich daher auch in drei Schritte auf I, II und III. &lt;br /&gt;
&lt;br /&gt;
Für Schritt I bringen wir Paar 1 in Stellung A, Paar 2 in Stellung C und Paar 3 in Stellung B. &lt;br /&gt;
Für Schritt II bewegt sich Paar 1 in Stellung B, Paar 2 in Stellung A (diese Bewegung muss ohne Bodenkontakt erfolgen) und Paar 3 in Stellung C. &lt;br /&gt;
Für Schritt III bewegt sich Paar 1 in Stellung C, Paar 2 in Stellung B und Paar 3 in Stellung A (auch wieder in der Luft) &lt;br /&gt;
Ab hier wiederholt sich das Programm&lt;br /&gt;
&lt;br /&gt;
Fazit: Die Bewegungn sind etwas aufwendiger sich zu überlegen und zu programmieren, der Roboter gewinnt aber insgesammt an Stabilität und ist nur etwas langsamer als bei 3:3. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===geradeaus 1:5===&lt;br /&gt;
Diese Variante ist die langsamste, aber dafür am stabilsten, denn das Gewicht verteilt sich auf 5 Standbeine. &lt;br /&gt;
Es werden 6 Stellungen pro Bein benötigt (A, B, C, D, E, F) und 6 Schritte. &lt;br /&gt;
Es gibt mehrere Möglichkeiten der Startaufstellung ich will hier eine kurz Darstellen: &lt;br /&gt;
Bein 1: A -&amp;gt; B  -&amp;gt; C  usw. &amp;lt;br&amp;gt;&lt;br /&gt;
Bein 2: D -&amp;gt; E  -&amp;gt; F &amp;lt;br&amp;gt;&lt;br /&gt;
Bein 3: E -&amp;gt; F  --&amp;gt; A &amp;lt;br&amp;gt;&lt;br /&gt;
Bein 4: B -&amp;gt; C  -&amp;gt; D &amp;lt;br&amp;gt;&lt;br /&gt;
Bein 5: C -&amp;gt; D  -&amp;gt; E &amp;lt;br&amp;gt;&lt;br /&gt;
Bein 6: F --&amp;gt; A -&amp;gt; B &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Pfeile geben an in Welche Stellung sich die Beine als nächstes bewegen, Bein 6 wird sich in die Stellung A bewegen. Dieser Rückstellvorgang muss immer in der Luft erfolgen. So wird sich der Roboter kontinuierlich vorwärts bewegen.&lt;br /&gt;
&lt;br /&gt;
==Hexapods in der Kurve==&lt;br /&gt;
&lt;br /&gt;
Nochmals das Bild von oben &lt;br /&gt;
&lt;br /&gt;
[[Bild:Hextop1.jpg]]&lt;br /&gt;
&lt;br /&gt;
Die effektiven Beinwege '''s''' können auch wie die Räder von einem sechsrädrigen Fahrzeug verstanden werden.&lt;br /&gt;
&lt;br /&gt;
Wenn wir nun eine Kurve beschreiben wollen, verkürzen wir die Wege '''s''' auf einer Seite, dadurch ergibt sich ein Drehpunkt '''P'''&lt;br /&gt;
&lt;br /&gt;
[[Bild:Hexcurv1.jpg]]&lt;br /&gt;
&lt;br /&gt;
Was man sieht: Es muss eigentlich jedes Bein eine individuelle Bewegung machen.&lt;br /&gt;
UND: jedes Bein muss seinen eigenen [[Spinnenbeine#Beinbewegung|Kurvenradius einhalten]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Hexapods drehen===&lt;br /&gt;
Alternativ, etwas einfacher zu programmieren, weil die Stellungen von Oben weiter verwendet werden können ist das Panzer Modell. &lt;br /&gt;
Konkret heisst es, die rechte Seite der Beine bewegt sich weiter nach oben, wärend die linke Seite der Beine sich nach unten bewegt. Dadurch wird der Roboter auf der Stelle gedreht. D.h. die Bewegungsrichtung der Beine ist insgesammt links zu rechts gegenläufig.&lt;br /&gt;
&lt;br /&gt;
==Kräfte am Spinnenbein==&lt;br /&gt;
Da eine genaue Berechnung recht aufwendig ist und von vielen Faktoren zusätzlich stark beeinflusst wird (Dynamik und äußere Einflüsse), soll hier nur eine qualifizierende Betrachtung erfolgen. &lt;br /&gt;
&lt;br /&gt;
Für Beine gibt es zwei völlig unterschiedliche Situationen: &lt;br /&gt;
===Ohne Bodenhaftung===&lt;br /&gt;
(Glatteis)&lt;br /&gt;
[[Bild:Podvec1.jpg]]&lt;br /&gt;
&lt;br /&gt;
Die Beine werden auseinandergedrückt. Das Kniegelenk muß versuchen, Ober- und Unterschenkel beisammenzuhalten, und in der Schulter muss das anteilige Gewicht des Fahrzeuges getragen werden. Durch die langen Hebel wird da, je nach Beinstellung, eine beachtliche Kraft erforderlich.&lt;br /&gt;
&lt;br /&gt;
===Mit Bodenhaftung===&lt;br /&gt;
(Teppich)&lt;br /&gt;
[[Bild:Podvec2.jpg]]&lt;br /&gt;
&lt;br /&gt;
Ganz anders bei ausreichender Haftung: Da die Füße ja nicht wegrutschen, zieht das Gewicht des Fahrzeuges über die Oberschenkel die Knie nach innen. Hier müssen die Oberschenkel nach außen stemmen, um dem entgegenzuwirken. &lt;br /&gt;
&lt;br /&gt;
''TextBitte beachten, die Beine können auch günstiger als auf dem Bild dargestellt, eingerichtet werden. Wenn der Oberschenkel waagrecht zum Roboterkörper ist. Muss das Schultergelenk zwar das gesammte Gewicht des Roboters tragen, aber das Kniegelenk wird praktisch vollständig entlastet. Auch bei Eis als Untergrund würde ein Wegrutschen der Beine so verhindert werden. ''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Ein Rechenbeispiel====&lt;br /&gt;
Des weiteren ist es wichtig zu erwähnen, dass je nach Bauart des Beines, also welche die sich weiter an der Seite vom Bot befinden, enorme Hebelkräfte auftreten. Um die passenden Servos für seinen Roboter heraus zu suchen hier ein Rechenbeispiel: &lt;br /&gt;
&lt;br /&gt;
[[Bild:Beine65.jpg]]&lt;br /&gt;
&lt;br /&gt;
Gegeben sei &amp;quot;a&amp;quot; als größtmöglicher Abstand zum Körper (blau).&lt;br /&gt;
Je nach Bauart des Roboters und der Wahl der Bewegung sind entweder 3 oder 4 oder gar 5 Beine gleichzeit am Boden. Auf diese wird das gesammte Gewicht des Roboter verteilt. Uns interessiert an dieser Stelle wieviel Ncm im Schultergelenk notwendig sind um den Roboter hochzudrücken. Aus der Zeichnung wird wieder deutlich warum es sinnvoll ist den Unterschenkel möglichst senkrecht zu halten und den Oberschenkel waagrecht. Unter dieser Positionierung muss das Kniegelenk nämlich kein Drehmoment übertragen. &lt;br /&gt;
&lt;br /&gt;
Aber zurück zur Rechnung. &lt;br /&gt;
&lt;br /&gt;
das Drehmoment in der Schulter wird wie folgt berechnet: &lt;br /&gt;
(Gewicht /Anzahl der Beine)* Hebelarm = Drehmoment in der Schulter&lt;br /&gt;
&lt;br /&gt;
in unserem Beispielt &lt;br /&gt;
a=10cm; G=1kg=10N; 3Beine am Boden&lt;br /&gt;
&lt;br /&gt;
(10N / 3)* 10cm = 33,3Ncm&lt;br /&gt;
    &lt;br /&gt;
Wir benötigen also in der Schulter Servos welche mindestens 33,3Ncm schaffen, zur Sicherheit wären 35Ncm sinnvoller. &lt;br /&gt;
Die Rechnung lässt sich natürlich auch so umstellen, dass anhand der Servos das Gesamtgewicht ermittelt werden kann: &lt;br /&gt;
&lt;br /&gt;
(Drehmoment der Servos / Hebelarm)* Anzahl der Beine = Gewicht des Roboters&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dasselbe gilt natürlich auch für Quadrobots. Nur muss man die Faktoren der Anzahl der Beine ändern&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[Servos]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Mechanik]]&lt;br /&gt;
[[Kategorie:Praxis]]&lt;/div&gt;</summary>
		<author><name>HannoHupmann</name></author>	</entry>

	</feed>