<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://www.mikrocontroller.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Mknot9</id>
	<title>Mikrocontroller.net - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="https://www.mikrocontroller.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Mknot9"/>
	<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/articles/Spezial:Beitr%C3%A4ge/Mknot9"/>
	<updated>2026-04-20T12:48:55Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.39.7</generator>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:SC_4AOS1.JPG&amp;diff=76610</id>
		<title>Datei:SC 4AOS1.JPG</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:SC_4AOS1.JPG&amp;diff=76610"/>
		<updated>2013-06-22T21:53:39Z</updated>

		<summary type="html">&lt;p&gt;Mknot9: hat eine neue Version von „Datei:SC 4AOS1.JPG“ hochgeladen:&amp;amp;#32;smaller file&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;picture of arduino running 4aOS, using the command line to navigate through the folders&lt;/div&gt;</summary>
		<author><name>Mknot9</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:SC_4AOS1.JPG&amp;diff=76608</id>
		<title>Datei:SC 4AOS1.JPG</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:SC_4AOS1.JPG&amp;diff=76608"/>
		<updated>2013-06-22T20:14:07Z</updated>

		<summary type="html">&lt;p&gt;Mknot9: picture of arduino running 4aOS, using the command line to navigate through the folders&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;picture of arduino running 4aOS, using the command line to navigate through the folders&lt;/div&gt;</summary>
		<author><name>Mknot9</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Arduino&amp;diff=74803</id>
		<title>Arduino</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Arduino&amp;diff=74803"/>
		<updated>2013-03-25T00:34:34Z</updated>

		<summary type="html">&lt;p&gt;Mknot9: /* 8-bit LCD-Shield mit Touch-Controller ohne IRQ-Pin */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
Das Arduino-Projekt ist ein 2006 gestartetes Projekt aus Italien. Arduino&lt;br /&gt;
ist eine Zusammenstellung aus verschiedenen Boards und einer IDE. Die Boards basieren auf der Atmel-AVR Serie. Die einzige ausnahme bildet der Arduino Due, dieser basiert auf einem ARM-Chip von Atmel. Das Gesamt Projekt ist quelloffen,&lt;br /&gt;
also Open-Source. Der Unterschied zu anderen Atmel-Boards sind der Bootloader und die IDE. Der Bootloader wird durch das Arduino-Projekt entwickelt und ist für die einzelnen Boards spezifisch.&lt;br /&gt;
&lt;br /&gt;
==Die IDE==&lt;br /&gt;
Die Arduino-IDE ist eine in JAVA programmierte grafische Obrfläche. Dadurch das sie in JAVA programiert wurde, ist sie plattfomunabhägig und auf Windows, Linux, MacOS X und Solaris verfügbar.&lt;br /&gt;
Die Grafischeoberfläche compiliert die Sketche(so heißt ein Arduino-Programm offiziel) nicht, sondern ruft verschiedene Programme auf. Dies sind in der Regel der Compiler avr-g++(und zugehörige Programme, z.B. ein Linker) und avrdude,&lt;br /&gt;
ein Programm zum übertragen des compilierten Sketch als *.hex File auf den Flashspeicher des Arduino. Die IDE basiert auf der Processing IDE und Wiring.&lt;br /&gt;
&lt;br /&gt;
==Die Boards==&lt;br /&gt;
Die Arduino-Boards sind Atmel AVR/ARM Chips basierende Mikrocontrollerplatinen,&lt;br /&gt;
welche zur Steuerung von I/O-Pins gedacht sind. Im Gegensatz zu anderen Boards sind die Arduino-Boards nicht gedacht um als &amp;quot;Computer&amp;quot; mit Betriebssystem zu dienen, wie etwa der Raspberry Pi, sondern um die I/O Pins zu steuern. Es gibt insgesamt 14 Boards mit 13 - 70 I/O Pins. Die Platinen besitzen meisten ein USB-Aschluß(USB-B bzw. USB-Mini) oder eine Schnitstelle für einen USB-Serial-Konverterchip. Die Platinen mit USB-Anschluß haben einen solchen Chip intigriert,&lt;br /&gt;
meist ein FTDI-Chip bei älteren Boards oder ein 8U2/16U2 bei neueren Boards.Eine Ausnahme bildet hier der Arduino Leonardo: Dieser besitzt einen Atmel-AVR 32U4 Mikrocontroller, welcher auch die Funktionen eines FTDI-Chips besitzt. Es ist also kein weiterer Konverter nötig.&lt;br /&gt;
&lt;br /&gt;
===Arduino Uno===&lt;br /&gt;
Der Arduino Uno R3 ist der Standard-Arduino. In den meisten Anfänger-Bücher und Tutorials wird dieser Arduino verwendet. Auch sind die meisten Libaries für ihn geschrieben. Er ist der neuste der am längsten weiterentwickleten Arduino-Reihe.&lt;br /&gt;
So ist eine frühere Version des Arduino Uno (Arduino USB) das Board gewesen, welches als erstes &#039;&#039;Arduino&#039;&#039; gennant wurde. In der aktuellen Revision (Version) 3 besitzt der Uno 14 Digitale I/O Pins sowie 6 analoge Eingänge. Er wird bei 5V betrieben und besitzt folgende Speicherkapazitäten:&lt;br /&gt;
* 32K Flash(0,5 werden vom Bootloader verwendet.)&lt;br /&gt;
* 2K SRAM&lt;br /&gt;
* 1K EEPROM&lt;br /&gt;
* 16 MHz (Prozessortakt)&lt;br /&gt;
Neben dem USB-B Anschluß verfügt der Uno noch über folgende Anschlüsse:&lt;br /&gt;
* Klinkenbuchse (2.1mm , 6-20 V möglich)&lt;br /&gt;
* SPI&lt;br /&gt;
* I²C&lt;br /&gt;
* ICSP&lt;br /&gt;
&lt;br /&gt;
====Arduino Duemilanove====&lt;br /&gt;
Der Arduino Duemilanove ist der Vorgänger des Arduino Uno. Er besitzt den&lt;br /&gt;
ATmega168 (seit 2009 328p) statt dem 328 wie beim Uno. Als Konverter verwendet der Duemilianove eine FTDI-Chip anstelle eines 16U2. Sonst ist von der Pin anzahlen und den Maßen des Boards identisch mit denen des Uno.&lt;br /&gt;
&lt;br /&gt;
====Arduino Diecimila====&lt;br /&gt;
====Arduino NG====&lt;br /&gt;
====Arduino Usb====&lt;br /&gt;
&lt;br /&gt;
===Arduino Mega===&lt;br /&gt;
====Arduino Mega ADK====&lt;br /&gt;
===Arduino Due===&lt;br /&gt;
&lt;br /&gt;
===Arduino Ethernet===&lt;br /&gt;
===Arduino LilyPad===&lt;br /&gt;
===Arduino Leonardo===  &lt;br /&gt;
===Arduino Nano===&lt;br /&gt;
===Arduino Micro===&lt;br /&gt;
===Arduino Fio===&lt;br /&gt;
===Arduino Pro Mini===&lt;br /&gt;
====Arduino Mini====&lt;br /&gt;
===Arduino Pro===&lt;br /&gt;
&lt;br /&gt;
==Shields(Erweiterungsplatinen)==&lt;br /&gt;
Sogennante Shields sind Erweiterungsplatinen, die die Funktionen eines Arduino-Boards um neue Funktionen erweitern. So gibt es z.B. Shields die den Arduino um eine Ethernet-Schnittstelle erweitern, einen VGA-Aschluß besitzen oder einfach leere Platinen sind, auf die eine Chip eingesetzt werden kann, ohne zu Löten. Für das letztere Bsp. wäre eine solche Platine die XBEE-Antenne.&lt;br /&gt;
&lt;br /&gt;
===8-bit LCD-Shield mit Touch-Controller ohne IRQ-Pin===&lt;br /&gt;
&lt;br /&gt;
Seit ca. Herbst 2012 werden einige LCD-Shields mit Touch-Controller angeboten, die den IRQ-Pin nicht mehr durchschleifen.&lt;br /&gt;
&lt;br /&gt;
Damit läuft auch die U-Touch Bibliothek von Henning Carlsen nicht mehr. Alle Sample-Codes im Web funktionieren auch nicht. Das Problem besteht darin herauszufinden, mit welchem Arduino-Pin das CS-Signal verbunden ist. Hier hilft nur: Sheets studieren.&lt;br /&gt;
&lt;br /&gt;
Beim Austesten des Touch-Shields ergab sich bei mir zusätzlich ein y-Basiswert des Touchcontrollers von 4095 (&#039;kein Touch&#039;)  und eine Differenz der Widerstandswerte zwischen &#039;Touch&#039; und &#039;keine Touch&#039; von 180 (x) bzw. 240 (y), siehe Code-Kommentare.   &lt;br /&gt;
&lt;br /&gt;
Bei mir lief schließlich folgender Code (das CS-Signal lag auf Pin 10):&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#define LCD_RS   19         &lt;br /&gt;
#define LCD_WR   18     &lt;br /&gt;
#define LCD_CS   17       &lt;br /&gt;
#define LCD_REST 16&lt;br /&gt;
&lt;br /&gt;
#define DCLK     15&lt;br /&gt;
#define DIN      14 &lt;br /&gt;
#define CS       10  &lt;br /&gt;
#define DOUT     8&lt;br /&gt;
&lt;br /&gt;
//#define IRQ      7    &lt;br /&gt;
 &lt;br /&gt;
unsigned int TP_X,TP_Y,x0,y0;    &lt;br /&gt;
unsigned int l3=0;&lt;br /&gt;
int lx,ly, l2, ry,rx,x3=65,y3=318;&lt;br /&gt;
int  k=3, vh2=0x84,vl2=0xFF;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
void spistar()                                     //SPI Start&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(CS,LOW);&lt;br /&gt;
  digitalWrite(DCLK,HIGH);&lt;br /&gt;
  digitalWrite(DIN,HIGH);&lt;br /&gt;
  digitalWrite(DCLK,HIGH);&lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
//**********************************************************&lt;br /&gt;
void WriteCharTo7843(unsigned char num)          //SPI Write Data&lt;br /&gt;
{&lt;br /&gt;
  unsigned char count=0;&lt;br /&gt;
  unsigned char temp;&lt;br /&gt;
  unsigned nop;&lt;br /&gt;
  temp=num;&lt;br /&gt;
  digitalWrite(DCLK,LOW);&lt;br /&gt;
  for(count=0;count&amp;lt;8;count++)&lt;br /&gt;
  {&lt;br /&gt;
    if(temp&amp;amp;0x80)&lt;br /&gt;
      digitalWrite(DIN,HIGH);&lt;br /&gt;
    else&lt;br /&gt;
      digitalWrite(DIN,LOW);&lt;br /&gt;
 &lt;br /&gt;
    temp=temp&amp;lt;&amp;lt;1; &lt;br /&gt;
 &lt;br /&gt;
    digitalWrite(DCLK,LOW);                &lt;br /&gt;
    nop++;&lt;br /&gt;
    nop++;&lt;br /&gt;
    digitalWrite(DCLK,HIGH);&lt;br /&gt;
    nop++;&lt;br /&gt;
    nop++;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//**********************************************************&lt;br /&gt;
unsigned int ReadFromCharFrom7843()             //SPI Read Data&lt;br /&gt;
{ &lt;br /&gt;
  unsigned nop;&lt;br /&gt;
  unsigned char count=0;&lt;br /&gt;
  unsigned int Num=0;&lt;br /&gt;
  for(count=0;count&amp;lt;12;count++)&lt;br /&gt;
  {&lt;br /&gt;
    Num&amp;lt;&amp;lt;=1;&lt;br /&gt;
    digitalWrite(DCLK,HIGH);//DCLK=1; _nop_();_nop_();_nop_();                &lt;br /&gt;
    nop++;&lt;br /&gt;
    digitalWrite(DCLK,LOW);//DCLK=0; _nop_();_nop_();_nop_();&lt;br /&gt;
    nop++;&lt;br /&gt;
    if(digitalRead(DOUT)) Num++;&lt;br /&gt;
  }&lt;br /&gt;
  return(Num);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
void LCD_Writ_Bus(char VH,char VL)   &lt;br /&gt;
{   &lt;br /&gt;
  PORTD = VH;&lt;br /&gt;
  digitalWrite(LCD_WR,LOW);&lt;br /&gt;
  digitalWrite(LCD_WR,HIGH);&lt;br /&gt;
  PORTD = VL;&lt;br /&gt;
  digitalWrite(LCD_WR,LOW);&lt;br /&gt;
  digitalWrite(LCD_WR,HIGH);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
void LCD_Write_COM(char VH,char VL)  &lt;br /&gt;
{   &lt;br /&gt;
  digitalWrite(LCD_RS,LOW);&lt;br /&gt;
  LCD_Writ_Bus(VH,VL);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
void LCD_Write_DATA(char VH,char VL)    &lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(LCD_RS,HIGH);&lt;br /&gt;
  LCD_Writ_Bus(VH,VL);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void Lcd_Write_Com_Data(int com,int val)&lt;br /&gt;
{&lt;br /&gt;
    LCD_Write_COM(com&amp;gt;&amp;gt;8,com);&lt;br /&gt;
    LCD_Write_DATA(val&amp;gt;&amp;gt;8,val);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void Address_set(unsigned int x1,unsigned int y1,unsigned int x2,unsigned int y2)&lt;br /&gt;
{&lt;br /&gt;
  LCD_Write_COM(0x00,0x46);LCD_Write_DATA(x2,x1);	  &lt;br /&gt;
  LCD_Write_COM(0x00,0x47);LCD_Write_DATA(y2&amp;gt;&amp;gt;8,y2);  &lt;br /&gt;
  LCD_Write_COM(0x00,0x48);LCD_Write_DATA(y1&amp;gt;&amp;gt;8,y1);&lt;br /&gt;
  LCD_Write_COM(0x00,0x20);LCD_Write_DATA(x1&amp;gt;&amp;gt;8,x1);	  &lt;br /&gt;
  LCD_Write_COM(0x00,0x21);LCD_Write_DATA(y1&amp;gt;&amp;gt;8,y1); &lt;br /&gt;
  LCD_Write_COM(0x00,0x22);		         				 &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void LCD_Init(void)&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
  digitalWrite(LCD_REST,HIGH);&lt;br /&gt;
  delay(5); &lt;br /&gt;
  digitalWrite(LCD_REST,LOW);&lt;br /&gt;
  delay(5);&lt;br /&gt;
  digitalWrite(LCD_REST,HIGH);&lt;br /&gt;
  delay(5);&lt;br /&gt;
 &lt;br /&gt;
  digitalWrite(LCD_CS,LOW);  &lt;br /&gt;
        Lcd_Write_Com_Data(0x11,0x2004);		&lt;br /&gt;
        Lcd_Write_Com_Data(0x13,0xCC00);		&lt;br /&gt;
        Lcd_Write_Com_Data(0x15,0x2600);	&lt;br /&gt;
	Lcd_Write_Com_Data(0x14,0x252A);			&lt;br /&gt;
	Lcd_Write_Com_Data(0x12,0x0033);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x13,0xCC04);		&lt;br /&gt;
	delay(1); &lt;br /&gt;
	Lcd_Write_Com_Data(0x13,0xCC06);		&lt;br /&gt;
	delay(1); &lt;br /&gt;
	Lcd_Write_Com_Data(0x13,0xCC4F);		&lt;br /&gt;
	delay(1); &lt;br /&gt;
	Lcd_Write_Com_Data(0x13,0x674F);&lt;br /&gt;
	Lcd_Write_Com_Data(0x11,0x2003);&lt;br /&gt;
	delay(1); 	&lt;br /&gt;
	Lcd_Write_Com_Data(0x30,0x2609);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x31,0x242C);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x32,0x1F23);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x33,0x2425);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x34,0x2226);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x35,0x2523);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x36,0x1C1A);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x37,0x131D);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x38,0x0B11);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x39,0x1210);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x3A,0x1315);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x3B,0x3619);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x3C,0x0D00);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x3D,0x000D);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x16,0x0007);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x02,0x0013);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x03,0x0003);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x01,0x0127);		&lt;br /&gt;
	delay(1); &lt;br /&gt;
	Lcd_Write_Com_Data(0x08,0x0303);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x0A,0x000B);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x0B,0x0003);   &lt;br /&gt;
	Lcd_Write_Com_Data(0x0C,0x0000);   &lt;br /&gt;
	Lcd_Write_Com_Data(0x41,0x0000);    &lt;br /&gt;
	Lcd_Write_Com_Data(0x50,0x0000);   &lt;br /&gt;
	Lcd_Write_Com_Data(0x60,0x0005);    &lt;br /&gt;
        Lcd_Write_Com_Data(0x70,0x000B);    &lt;br /&gt;
	Lcd_Write_Com_Data(0x71,0x0000);    &lt;br /&gt;
	Lcd_Write_Com_Data(0x78,0x0000);    &lt;br /&gt;
	Lcd_Write_Com_Data(0x7A,0x0000);   &lt;br /&gt;
	Lcd_Write_Com_Data(0x79,0x0007);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x07,0x0051);   &lt;br /&gt;
	delay(1); 	&lt;br /&gt;
	Lcd_Write_Com_Data(0x07,0x0053);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x79,0x0000);&lt;br /&gt;
 &lt;br /&gt;
	LCD_Write_COM(0x00,0x22);&lt;br /&gt;
  digitalWrite(LCD_CS,HIGH);  &lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void Pant(char VH,char VL)&lt;br /&gt;
{&lt;br /&gt;
  int i,j;&lt;br /&gt;
  Address_set(0,0,240,320);&lt;br /&gt;
  for(i=0;i&amp;lt;=320;i++)&lt;br /&gt;
  {&lt;br /&gt;
    for (j=0;j&amp;lt;=240;j++)&lt;br /&gt;
    {&lt;br /&gt;
      LCD_Write_DATA(VH,VL);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void digi(int z3)&lt;br /&gt;
{&lt;br /&gt;
  unsigned char p;&lt;br /&gt;
  int x2, y2, z2, i,h2=1000;&lt;br /&gt;
  digitalWrite(LCD_CS,LOW); &lt;br /&gt;
  for(i=0;i&amp;lt;3;i++)&lt;br /&gt;
  {&lt;br /&gt;
  y2=y3;&lt;br /&gt;
  x2=x3+(10*i);&lt;br /&gt;
  Address_set(x2+6,y2-15,x2+7,y2);&lt;br /&gt;
  for(p=0; p&amp;lt;32; p++)  LCD_Write_DATA(0xFF,0xFF);&lt;br /&gt;
  Address_set(x2,y2-15,x2+7,y2-14);&lt;br /&gt;
  for(p=0; p&amp;lt;16; p++)  LCD_Write_DATA(0xFF,0xFF);&lt;br /&gt;
  Address_set(x2,y2-1,x2+7,y2);&lt;br /&gt;
  for(p=0; p&amp;lt;16; p++)  LCD_Write_DATA(0xFF,0xFF);&lt;br /&gt;
  Address_set(x2,y2-8,x2+7,y2-7);&lt;br /&gt;
  for(p=0; p&amp;lt;16; p++)  LCD_Write_DATA(0xFF,0xFF);&lt;br /&gt;
  Address_set(x2,y2-15,x2+1,y2);&lt;br /&gt;
  for(p=0; p&amp;lt;32; p++)  LCD_Write_DATA(0xFF,0xFF);&lt;br /&gt;
 &lt;br /&gt;
    h2=h2/10;&lt;br /&gt;
    z2=z3/h2; &lt;br /&gt;
    z3=z3-z2*h2;&lt;br /&gt;
    if (z2==0)  {&lt;br /&gt;
      Address_set(x2+2,y2-8,x2+5,y2-7);&lt;br /&gt;
      for(p=0; p&amp;lt;8; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
    }&lt;br /&gt;
    if (z2==1)  {&lt;br /&gt;
      Address_set(x2,y2-15,x2+5,y2);&lt;br /&gt;
      for(p=0; p&amp;lt;96; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
    }&lt;br /&gt;
   if (z2==2)  {&lt;br /&gt;
      Address_set(x2,y2-13,x2+1,y2-9);&lt;br /&gt;
      for(p=0; p&amp;lt;10; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
      Address_set(x2+6,y2-6,x2+7,y2-2);&lt;br /&gt;
      for(p=0; p&amp;lt;10; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
    }&lt;br /&gt;
   if (z2==3)  {&lt;br /&gt;
      Address_set(x2,y2-13,x2+1,y2-9);&lt;br /&gt;
      for(p=0; p&amp;lt;10; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
      Address_set(x2,y2-6,x2+1,y2-2);&lt;br /&gt;
      for(p=0; p&amp;lt;10; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
    }&lt;br /&gt;
   if (z2==4)  {&lt;br /&gt;
      Address_set(x2,y2-6,x2+5,y2);&lt;br /&gt;
      for(p=0; p&amp;lt;42; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
      Address_set(x2+2,y2-15,x2+5,y2-14);&lt;br /&gt;
      for(p=0; p&amp;lt;8; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
    }&lt;br /&gt;
   if (z2==5)  {&lt;br /&gt;
      Address_set(x2+6,y2-13,x2+7,y2-9);&lt;br /&gt;
      for(p=0; p&amp;lt;10; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
     Address_set(x2,y2-6,x2+1,y2-2);&lt;br /&gt;
      for(p=0; p&amp;lt;10; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
    }&lt;br /&gt;
   if (z2==6)  {&lt;br /&gt;
      Address_set(x2+6,y2-13,x2+7,y2-9);&lt;br /&gt;
      for(p=0; p&amp;lt;10; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
    }&lt;br /&gt;
   if (z2==7)  {&lt;br /&gt;
      Address_set(x2,y2-13,x2+5,y2);&lt;br /&gt;
      for(p=0; p&amp;lt;84; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
    }&lt;br /&gt;
   if (z2==9)  {&lt;br /&gt;
      Address_set(x2,y2-6,x2+1,y2-2);&lt;br /&gt;
      for(p=0; p&amp;lt;10; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(LCD_CS,HIGH); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void newpa(void)&lt;br /&gt;
{&lt;br /&gt;
  unsigned char p;&lt;br /&gt;
  digitalWrite(LCD_CS,LOW); &lt;br /&gt;
  Pant(0x00,0x00);   &lt;br /&gt;
&lt;br /&gt;
  Address_set(0,319,240,319);&lt;br /&gt;
  for(p=0; p&amp;lt;240; p++)  LCD_Write_DATA(0xF8,0x00);&lt;br /&gt;
  Address_set(0,0,240,0);&lt;br /&gt;
  for(p=0; p&amp;lt;240; p++)  LCD_Write_DATA(0xFF,0xFF);&lt;br /&gt;
  Address_set(0,300,240,300);&lt;br /&gt;
  for(p=0; p&amp;lt;240; p++)  LCD_Write_DATA(0xFF,0xFF);&lt;br /&gt;
  Address_set(0,0,0,255);&lt;br /&gt;
  for(p=0; p&amp;lt;255; p++)  LCD_Write_DATA(0xF8,0x00);&lt;br /&gt;
  Address_set(0,255,0,300);&lt;br /&gt;
  for(p=0; p&amp;lt;45; p++)  LCD_Write_DATA(0xF8,0x00);&lt;br /&gt;
  Address_set(239,0,239,255);&lt;br /&gt;
  for(p=0; p&amp;lt;255; p++)  LCD_Write_DATA(0xF8,0x00);&lt;br /&gt;
  Address_set(239,255,239,300);&lt;br /&gt;
  for(p=0; p&amp;lt;45; p++)  LCD_Write_DATA(0xF8,0x00);&lt;br /&gt;
Address_set(50,308,59,311);&lt;br /&gt;
  for(p=0; p&amp;lt;40; p++)  LCD_Write_DATA(0x07,0xE0);&lt;br /&gt;
Address_set(53,305,56,314);&lt;br /&gt;
  for(p=0; p&amp;lt;40; p++)  LCD_Write_DATA(0x07,0xE0);&lt;br /&gt;
Address_set(215,305,239,314);&lt;br /&gt;
  for(p=0; p&amp;lt;250; p++)  LCD_Write_DATA(0xF8,0x00);&lt;br /&gt;
 digitalWrite(LCD_CS,HIGH); &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
 void recan(void)&lt;br /&gt;
{&lt;br /&gt;
  int i,j;&lt;br /&gt;
//  unsigned int m;&lt;br /&gt;
 digitalWrite(LCD_CS,LOW); &lt;br /&gt;
  for(i=0;i&amp;lt;7;i++)&lt;br /&gt;
  {&lt;br /&gt;
//    m=i*3;&lt;br /&gt;
    Address_set(i*5,305,i*5+3,314);&lt;br /&gt;
    for(j=0; j&amp;lt;40; j++)&lt;br /&gt;
    {&lt;br /&gt;
      if (1+i*2&amp;lt;= k) LCD_Write_DATA(0xFF,0xE0); else LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
Address_set(100,305,124,314);&lt;br /&gt;
  for(i=0; i&amp;lt;250; i++)  LCD_Write_DATA(vh2,vl2);&lt;br /&gt;
Address_set(125,305,149,314);&lt;br /&gt;
  for(i=0; i&amp;lt;250; i++)  LCD_Write_DATA(vh2,vl2);&lt;br /&gt;
 digitalWrite(LCD_CS,HIGH); &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
void AD7843(void)              &lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(CS,LOW);                    &lt;br /&gt;
  WriteCharTo7843(0x90);        &lt;br /&gt;
  digitalWrite(DCLK,HIGH);&lt;br /&gt;
  digitalWrite(DCLK,LOW); &lt;br /&gt;
  TP_Y=ReadFromCharFrom7843();&lt;br /&gt;
  WriteCharTo7843(0xD0);      &lt;br /&gt;
  digitalWrite(DCLK,HIGH);&lt;br /&gt;
  digitalWrite(DCLK,LOW);&lt;br /&gt;
  TP_X=ReadFromCharFrom7843();&lt;br /&gt;
  digitalWrite(CS,HIGH);&lt;br /&gt;
 &lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void setup()&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
  unsigned char p;&lt;br /&gt;
&lt;br /&gt;
  for(p=0;p&amp;lt;20;p++)&lt;br /&gt;
  {&lt;br /&gt;
    pinMode(p,OUTPUT);&lt;br /&gt;
  }&lt;br /&gt;
  pinMode(DOUT,INPUT);&lt;br /&gt;
      x0=1;&lt;br /&gt;
      y0=1;&lt;br /&gt;
 &lt;br /&gt;
  LCD_Init();  &lt;br /&gt;
  newpa();&lt;br /&gt;
  recan();&lt;br /&gt;
  digi(vh2);&lt;br /&gt;
  x3=x3+90;&lt;br /&gt;
  digi(vl2);&lt;br /&gt;
  spistar();  &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void loop()&lt;br /&gt;
{  &lt;br /&gt;
  rx=0;&lt;br /&gt;
  ry=0;&lt;br /&gt;
   &lt;br /&gt;
  for(l3=0;l3&amp;lt;8;l3++)&lt;br /&gt;
    {&lt;br /&gt;
      AD7843();&lt;br /&gt;
&lt;br /&gt;
      lx=0;&lt;br /&gt;
      ly=-1*TP_Y;&lt;br /&gt;
      ly=4095+ly;              //4095=Basiswert y-Signal&lt;br /&gt;
      if(ly &amp;gt; 0) lx=1*TP_X; else {lx=0;ly=0;rx=0;ry=0;l3=9; }&lt;br /&gt;
      rx=rx+lx;&lt;br /&gt;
      ry=ry+ly;&lt;br /&gt;
    }&lt;br /&gt;
      lx=(rx/8-180)/15;        //180=Minimaler x-Wert bei &#039;Touch&#039;&lt;br /&gt;
      ly=(ry/8-240)/11;        //240=Minimaler (über 4095) y-Wert bei &#039;Touch&#039;&lt;br /&gt;
      if(ly &amp;lt; 1) {lx=0;ly=0; }&lt;br /&gt;
      if(lx &amp;lt; 1) lx=0;&lt;br /&gt;
 &lt;br /&gt;
      if(ly &amp;gt; 309-k)&lt;br /&gt;
      {&lt;br /&gt;
        ly=0;&lt;br /&gt;
        if(lx &amp;gt; 200) k=k-2; else if (lx &amp;gt; 160) k=k+2;else&lt;br /&gt;
            if (lx &amp;gt; 100) vh2++; else if (lx &amp;gt; 40) vl2++; else newpa();&lt;br /&gt;
        lx=0;&lt;br /&gt;
        if (k&amp;lt;1) k=1;&lt;br /&gt;
        if (k&amp;gt;13) k=13;&lt;br /&gt;
        if (vh2&amp;gt;255) vh2=0;&lt;br /&gt;
        if (vl2&amp;gt;255) vl2=0;&lt;br /&gt;
        x3=65;&lt;br /&gt;
        digi(vh2);&lt;br /&gt;
        x3=x3+90;&lt;br /&gt;
        digi(vl2);&lt;br /&gt;
        recan();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if(ly &amp;gt; 299-k) ly=299-k;&lt;br /&gt;
      if(ly &amp;gt; 0)&lt;br /&gt;
      {&lt;br /&gt;
        x0=240-lx;&lt;br /&gt;
        if(x0 &amp;gt; 240-k) x0=240-k;&lt;br /&gt;
        y0=ly;&lt;br /&gt;
        l2=(k+1)*(k+1);&lt;br /&gt;
        digitalWrite(LCD_CS,LOW); &lt;br /&gt;
        Address_set(x0,y0,x0+k,y0+k);&lt;br /&gt;
        for (l3=0; l3&amp;lt;l2; l3++) LCD_Write_DATA(vh2,vl2);&lt;br /&gt;
        digitalWrite(LCD_CS,HIGH); &lt;br /&gt;
    }&lt;br /&gt;
    delay (50);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Derivate==&lt;br /&gt;
Es gibt viele Derivate die auf dem Arduino basieren, weil&lt;br /&gt;
* Alle Layouts quelloffen im Internet stehen&lt;br /&gt;
* Der Bootloader sowohl als Quellocde und schon compillert zum Download im Internet stehen&lt;br /&gt;
*Man die IDE für alle Atmel-Chips verwenden kann, die einen Arduino-Bootloader besitzen&lt;br /&gt;
*Man auch eine Arduino-Derivat auf dem Steckbrett zusammbauen kann  &lt;br /&gt;
&lt;br /&gt;
==Tutorial==&lt;br /&gt;
===Ein erster Sketch: Blinkende LED===&lt;br /&gt;
Die meisten aktuellen Arduino-Boards habe einen fest verlötete&lt;br /&gt;
SMD-LED, welche an Pin 13 angeschloßen ist. Diese LED kann von jedem&lt;br /&gt;
Sketch angesteuert werden. Da diese LED meistens vorhanden ist und immer an Pin 13 ageschloßen ist, ist dieses Programm auf den meisten Boards gleich.&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//Blinkende LED&lt;br /&gt;
void setup() {&lt;br /&gt;
pinMode(13,OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
delay(1000);&lt;br /&gt;
digitalWrite(13,HIGH);&lt;br /&gt;
delay(1000);&lt;br /&gt;
digitalWrite(13,LOW);&lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
* [http://www.arduino.cc/en/Main/Software Download der IDE] &lt;br /&gt;
* [http://www.mikrocontroller.net/articles/AVR Artikel zur AVR Prozessor-Serie]&lt;br /&gt;
&lt;br /&gt;
==Literatur==&lt;br /&gt;
* Erik Bartmann: &#039;&#039;Die elektronische Welt mit Arduino entdecken&#039;&#039;, O&#039;Reilly Verlag, 2011, ISBN 978-3-89721-319-7&lt;br /&gt;
* Thomas Brühlmann: &#039;&#039;Arduino: Praxiseinstieg&#039;&#039;, mitp Verlag, 2010, ISBN 978-3-8266-5605-7&lt;br /&gt;
&lt;br /&gt;
==Bezugsquellen(Auswahl)==&lt;br /&gt;
&lt;br /&gt;
===Offiziele Boards===&lt;br /&gt;
* [http://www.watterott.com/de/Boards-Kits/Arduino Watterott.com] &lt;br /&gt;
* [http://www.reichelt.de/ Reichelt.de]&lt;br /&gt;
* [http://www.conrad.de/ Conrad.de]&lt;br /&gt;
* [http://www.tigal.com/ TIGAL.com]&lt;br /&gt;
&lt;br /&gt;
===Lernpakete===&lt;br /&gt;
* [http://www.franzis.de/ Franzis Verlag(Lernpakete)]&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [http://www.arduino.cc/ Website des Arduino-Projekt] &lt;br /&gt;
* [http://arduino.cc/forum/index.php/board,31.0.html Deutsches Arduino-Forum(offiziel)]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AVR-Boards]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Mknot9</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Arduino&amp;diff=74802</id>
		<title>Arduino</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Arduino&amp;diff=74802"/>
		<updated>2013-03-25T00:30:57Z</updated>

		<summary type="html">&lt;p&gt;Mknot9: /* 8-bit LCD-Shield mit Touch-Controller ohne IRQ-Pin */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
Das Arduino-Projekt ist ein 2006 gestartetes Projekt aus Italien. Arduino&lt;br /&gt;
ist eine Zusammenstellung aus verschiedenen Boards und einer IDE. Die Boards basieren auf der Atmel-AVR Serie. Die einzige ausnahme bildet der Arduino Due, dieser basiert auf einem ARM-Chip von Atmel. Das Gesamt Projekt ist quelloffen,&lt;br /&gt;
also Open-Source. Der Unterschied zu anderen Atmel-Boards sind der Bootloader und die IDE. Der Bootloader wird durch das Arduino-Projekt entwickelt und ist für die einzelnen Boards spezifisch.&lt;br /&gt;
&lt;br /&gt;
==Die IDE==&lt;br /&gt;
Die Arduino-IDE ist eine in JAVA programmierte grafische Obrfläche. Dadurch das sie in JAVA programiert wurde, ist sie plattfomunabhägig und auf Windows, Linux, MacOS X und Solaris verfügbar.&lt;br /&gt;
Die Grafischeoberfläche compiliert die Sketche(so heißt ein Arduino-Programm offiziel) nicht, sondern ruft verschiedene Programme auf. Dies sind in der Regel der Compiler avr-g++(und zugehörige Programme, z.B. ein Linker) und avrdude,&lt;br /&gt;
ein Programm zum übertragen des compilierten Sketch als *.hex File auf den Flashspeicher des Arduino. Die IDE basiert auf der Processing IDE und Wiring.&lt;br /&gt;
&lt;br /&gt;
==Die Boards==&lt;br /&gt;
Die Arduino-Boards sind Atmel AVR/ARM Chips basierende Mikrocontrollerplatinen,&lt;br /&gt;
welche zur Steuerung von I/O-Pins gedacht sind. Im Gegensatz zu anderen Boards sind die Arduino-Boards nicht gedacht um als &amp;quot;Computer&amp;quot; mit Betriebssystem zu dienen, wie etwa der Raspberry Pi, sondern um die I/O Pins zu steuern. Es gibt insgesamt 14 Boards mit 13 - 70 I/O Pins. Die Platinen besitzen meisten ein USB-Aschluß(USB-B bzw. USB-Mini) oder eine Schnitstelle für einen USB-Serial-Konverterchip. Die Platinen mit USB-Anschluß haben einen solchen Chip intigriert,&lt;br /&gt;
meist ein FTDI-Chip bei älteren Boards oder ein 8U2/16U2 bei neueren Boards.Eine Ausnahme bildet hier der Arduino Leonardo: Dieser besitzt einen Atmel-AVR 32U4 Mikrocontroller, welcher auch die Funktionen eines FTDI-Chips besitzt. Es ist also kein weiterer Konverter nötig.&lt;br /&gt;
&lt;br /&gt;
===Arduino Uno===&lt;br /&gt;
Der Arduino Uno R3 ist der Standard-Arduino. In den meisten Anfänger-Bücher und Tutorials wird dieser Arduino verwendet. Auch sind die meisten Libaries für ihn geschrieben. Er ist der neuste der am längsten weiterentwickleten Arduino-Reihe.&lt;br /&gt;
So ist eine frühere Version des Arduino Uno (Arduino USB) das Board gewesen, welches als erstes &#039;&#039;Arduino&#039;&#039; gennant wurde. In der aktuellen Revision (Version) 3 besitzt der Uno 14 Digitale I/O Pins sowie 6 analoge Eingänge. Er wird bei 5V betrieben und besitzt folgende Speicherkapazitäten:&lt;br /&gt;
* 32K Flash(0,5 werden vom Bootloader verwendet.)&lt;br /&gt;
* 2K SRAM&lt;br /&gt;
* 1K EEPROM&lt;br /&gt;
* 16 MHz (Prozessortakt)&lt;br /&gt;
Neben dem USB-B Anschluß verfügt der Uno noch über folgende Anschlüsse:&lt;br /&gt;
* Klinkenbuchse (2.1mm , 6-20 V möglich)&lt;br /&gt;
* SPI&lt;br /&gt;
* I²C&lt;br /&gt;
* ICSP&lt;br /&gt;
&lt;br /&gt;
====Arduino Duemilanove====&lt;br /&gt;
Der Arduino Duemilanove ist der Vorgänger des Arduino Uno. Er besitzt den&lt;br /&gt;
ATmega168 (seit 2009 328p) statt dem 328 wie beim Uno. Als Konverter verwendet der Duemilianove eine FTDI-Chip anstelle eines 16U2. Sonst ist von der Pin anzahlen und den Maßen des Boards identisch mit denen des Uno.&lt;br /&gt;
&lt;br /&gt;
====Arduino Diecimila====&lt;br /&gt;
====Arduino NG====&lt;br /&gt;
====Arduino Usb====&lt;br /&gt;
&lt;br /&gt;
===Arduino Mega===&lt;br /&gt;
====Arduino Mega ADK====&lt;br /&gt;
===Arduino Due===&lt;br /&gt;
&lt;br /&gt;
===Arduino Ethernet===&lt;br /&gt;
===Arduino LilyPad===&lt;br /&gt;
===Arduino Leonardo===  &lt;br /&gt;
===Arduino Nano===&lt;br /&gt;
===Arduino Micro===&lt;br /&gt;
===Arduino Fio===&lt;br /&gt;
===Arduino Pro Mini===&lt;br /&gt;
====Arduino Mini====&lt;br /&gt;
===Arduino Pro===&lt;br /&gt;
&lt;br /&gt;
==Shields(Erweiterungsplatinen)==&lt;br /&gt;
Sogennante Shields sind Erweiterungsplatinen, die die Funktionen eines Arduino-Boards um neue Funktionen erweitern. So gibt es z.B. Shields die den Arduino um eine Ethernet-Schnittstelle erweitern, einen VGA-Aschluß besitzen oder einfach leere Platinen sind, auf die eine Chip eingesetzt werden kann, ohne zu Löten. Für das letztere Bsp. wäre eine solche Platine die XBEE-Antenne.&lt;br /&gt;
&lt;br /&gt;
===8-bit LCD-Shield mit Touch-Controller ohne IRQ-Pin===&lt;br /&gt;
&lt;br /&gt;
Seit ca. Herbst 2012 werden einige LCD-Shields mit Touch-Controller angeboten, die den IRQ-Pin nicht mehr durchschleifen.&lt;br /&gt;
&lt;br /&gt;
Damit läuft auch die U-Touch Bibliothek von Henning Carlsen nicht mehr. Alle Sample-Codes im Web funktionieren auch nicht. Das Problem besteht darin herauszufinden, mit welchem Arduino-Pin das CS-Signal verbunden ist. Hier hilft nur Sheets studieren. Beim Austesten des Touch-Shields ergab sich bei mir eine y-Basiswert des Touchcontrollers von 4095 und eine Differenz der Widerstandswerte zwischen &#039;Touch&#039; und &#039;keine Touch&#039; von 180 (x) bzw. 240 (y), siehe Code-Kommentare.   &lt;br /&gt;
&lt;br /&gt;
Bei mir lief schließlich folgender Code (das CS-Signal lag auf Pin 10):&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#define LCD_RS   19         &lt;br /&gt;
#define LCD_WR   18     &lt;br /&gt;
#define LCD_CS   17       &lt;br /&gt;
#define LCD_REST 16&lt;br /&gt;
&lt;br /&gt;
#define DCLK     15&lt;br /&gt;
#define DIN      14 &lt;br /&gt;
#define CS       10  &lt;br /&gt;
#define DOUT     8&lt;br /&gt;
&lt;br /&gt;
//#define IRQ      7    &lt;br /&gt;
 &lt;br /&gt;
unsigned int TP_X,TP_Y,x0,y0;    &lt;br /&gt;
unsigned int l3=0;&lt;br /&gt;
int lx,ly, l2, ry,rx,x3=65,y3=318;&lt;br /&gt;
int  k=3, vh2=0x84,vl2=0xFF;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
void spistar()                                     //SPI Start&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(CS,LOW);&lt;br /&gt;
  digitalWrite(DCLK,HIGH);&lt;br /&gt;
  digitalWrite(DIN,HIGH);&lt;br /&gt;
  digitalWrite(DCLK,HIGH);&lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
//**********************************************************&lt;br /&gt;
void WriteCharTo7843(unsigned char num)          //SPI Write Data&lt;br /&gt;
{&lt;br /&gt;
  unsigned char count=0;&lt;br /&gt;
  unsigned char temp;&lt;br /&gt;
  unsigned nop;&lt;br /&gt;
  temp=num;&lt;br /&gt;
  digitalWrite(DCLK,LOW);&lt;br /&gt;
  for(count=0;count&amp;lt;8;count++)&lt;br /&gt;
  {&lt;br /&gt;
    if(temp&amp;amp;0x80)&lt;br /&gt;
      digitalWrite(DIN,HIGH);&lt;br /&gt;
    else&lt;br /&gt;
      digitalWrite(DIN,LOW);&lt;br /&gt;
 &lt;br /&gt;
    temp=temp&amp;lt;&amp;lt;1; &lt;br /&gt;
 &lt;br /&gt;
    digitalWrite(DCLK,LOW);                &lt;br /&gt;
    nop++;&lt;br /&gt;
    nop++;&lt;br /&gt;
    digitalWrite(DCLK,HIGH);&lt;br /&gt;
    nop++;&lt;br /&gt;
    nop++;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//**********************************************************&lt;br /&gt;
unsigned int ReadFromCharFrom7843()             //SPI Read Data&lt;br /&gt;
{ &lt;br /&gt;
  unsigned nop;&lt;br /&gt;
  unsigned char count=0;&lt;br /&gt;
  unsigned int Num=0;&lt;br /&gt;
  for(count=0;count&amp;lt;12;count++)&lt;br /&gt;
  {&lt;br /&gt;
    Num&amp;lt;&amp;lt;=1;&lt;br /&gt;
    digitalWrite(DCLK,HIGH);//DCLK=1; _nop_();_nop_();_nop_();                &lt;br /&gt;
    nop++;&lt;br /&gt;
    digitalWrite(DCLK,LOW);//DCLK=0; _nop_();_nop_();_nop_();&lt;br /&gt;
    nop++;&lt;br /&gt;
    if(digitalRead(DOUT)) Num++;&lt;br /&gt;
  }&lt;br /&gt;
  return(Num);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
void LCD_Writ_Bus(char VH,char VL)   &lt;br /&gt;
{   &lt;br /&gt;
  PORTD = VH;&lt;br /&gt;
  digitalWrite(LCD_WR,LOW);&lt;br /&gt;
  digitalWrite(LCD_WR,HIGH);&lt;br /&gt;
  PORTD = VL;&lt;br /&gt;
  digitalWrite(LCD_WR,LOW);&lt;br /&gt;
  digitalWrite(LCD_WR,HIGH);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
void LCD_Write_COM(char VH,char VL)  &lt;br /&gt;
{   &lt;br /&gt;
  digitalWrite(LCD_RS,LOW);&lt;br /&gt;
  LCD_Writ_Bus(VH,VL);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
void LCD_Write_DATA(char VH,char VL)    &lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(LCD_RS,HIGH);&lt;br /&gt;
  LCD_Writ_Bus(VH,VL);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void Lcd_Write_Com_Data(int com,int val)&lt;br /&gt;
{&lt;br /&gt;
    LCD_Write_COM(com&amp;gt;&amp;gt;8,com);&lt;br /&gt;
    LCD_Write_DATA(val&amp;gt;&amp;gt;8,val);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void Address_set(unsigned int x1,unsigned int y1,unsigned int x2,unsigned int y2)&lt;br /&gt;
{&lt;br /&gt;
  LCD_Write_COM(0x00,0x46);LCD_Write_DATA(x2,x1);	  &lt;br /&gt;
  LCD_Write_COM(0x00,0x47);LCD_Write_DATA(y2&amp;gt;&amp;gt;8,y2);  &lt;br /&gt;
  LCD_Write_COM(0x00,0x48);LCD_Write_DATA(y1&amp;gt;&amp;gt;8,y1);&lt;br /&gt;
  LCD_Write_COM(0x00,0x20);LCD_Write_DATA(x1&amp;gt;&amp;gt;8,x1);	  &lt;br /&gt;
  LCD_Write_COM(0x00,0x21);LCD_Write_DATA(y1&amp;gt;&amp;gt;8,y1); &lt;br /&gt;
  LCD_Write_COM(0x00,0x22);		         				 &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void LCD_Init(void)&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
  digitalWrite(LCD_REST,HIGH);&lt;br /&gt;
  delay(5); &lt;br /&gt;
  digitalWrite(LCD_REST,LOW);&lt;br /&gt;
  delay(5);&lt;br /&gt;
  digitalWrite(LCD_REST,HIGH);&lt;br /&gt;
  delay(5);&lt;br /&gt;
 &lt;br /&gt;
  digitalWrite(LCD_CS,LOW);  &lt;br /&gt;
        Lcd_Write_Com_Data(0x11,0x2004);		&lt;br /&gt;
        Lcd_Write_Com_Data(0x13,0xCC00);		&lt;br /&gt;
        Lcd_Write_Com_Data(0x15,0x2600);	&lt;br /&gt;
	Lcd_Write_Com_Data(0x14,0x252A);			&lt;br /&gt;
	Lcd_Write_Com_Data(0x12,0x0033);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x13,0xCC04);		&lt;br /&gt;
	delay(1); &lt;br /&gt;
	Lcd_Write_Com_Data(0x13,0xCC06);		&lt;br /&gt;
	delay(1); &lt;br /&gt;
	Lcd_Write_Com_Data(0x13,0xCC4F);		&lt;br /&gt;
	delay(1); &lt;br /&gt;
	Lcd_Write_Com_Data(0x13,0x674F);&lt;br /&gt;
	Lcd_Write_Com_Data(0x11,0x2003);&lt;br /&gt;
	delay(1); 	&lt;br /&gt;
	Lcd_Write_Com_Data(0x30,0x2609);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x31,0x242C);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x32,0x1F23);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x33,0x2425);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x34,0x2226);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x35,0x2523);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x36,0x1C1A);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x37,0x131D);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x38,0x0B11);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x39,0x1210);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x3A,0x1315);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x3B,0x3619);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x3C,0x0D00);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x3D,0x000D);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x16,0x0007);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x02,0x0013);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x03,0x0003);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x01,0x0127);		&lt;br /&gt;
	delay(1); &lt;br /&gt;
	Lcd_Write_Com_Data(0x08,0x0303);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x0A,0x000B);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x0B,0x0003);   &lt;br /&gt;
	Lcd_Write_Com_Data(0x0C,0x0000);   &lt;br /&gt;
	Lcd_Write_Com_Data(0x41,0x0000);    &lt;br /&gt;
	Lcd_Write_Com_Data(0x50,0x0000);   &lt;br /&gt;
	Lcd_Write_Com_Data(0x60,0x0005);    &lt;br /&gt;
        Lcd_Write_Com_Data(0x70,0x000B);    &lt;br /&gt;
	Lcd_Write_Com_Data(0x71,0x0000);    &lt;br /&gt;
	Lcd_Write_Com_Data(0x78,0x0000);    &lt;br /&gt;
	Lcd_Write_Com_Data(0x7A,0x0000);   &lt;br /&gt;
	Lcd_Write_Com_Data(0x79,0x0007);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x07,0x0051);   &lt;br /&gt;
	delay(1); 	&lt;br /&gt;
	Lcd_Write_Com_Data(0x07,0x0053);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x79,0x0000);&lt;br /&gt;
 &lt;br /&gt;
	LCD_Write_COM(0x00,0x22);&lt;br /&gt;
  digitalWrite(LCD_CS,HIGH);  &lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void Pant(char VH,char VL)&lt;br /&gt;
{&lt;br /&gt;
  int i,j;&lt;br /&gt;
  Address_set(0,0,240,320);&lt;br /&gt;
  for(i=0;i&amp;lt;=320;i++)&lt;br /&gt;
  {&lt;br /&gt;
    for (j=0;j&amp;lt;=240;j++)&lt;br /&gt;
    {&lt;br /&gt;
      LCD_Write_DATA(VH,VL);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void digi(int z3)&lt;br /&gt;
{&lt;br /&gt;
  unsigned char p;&lt;br /&gt;
  int x2, y2, z2, i,h2=1000;&lt;br /&gt;
  digitalWrite(LCD_CS,LOW); &lt;br /&gt;
  for(i=0;i&amp;lt;3;i++)&lt;br /&gt;
  {&lt;br /&gt;
  y2=y3;&lt;br /&gt;
  x2=x3+(10*i);&lt;br /&gt;
  Address_set(x2+6,y2-15,x2+7,y2);&lt;br /&gt;
  for(p=0; p&amp;lt;32; p++)  LCD_Write_DATA(0xFF,0xFF);&lt;br /&gt;
  Address_set(x2,y2-15,x2+7,y2-14);&lt;br /&gt;
  for(p=0; p&amp;lt;16; p++)  LCD_Write_DATA(0xFF,0xFF);&lt;br /&gt;
  Address_set(x2,y2-1,x2+7,y2);&lt;br /&gt;
  for(p=0; p&amp;lt;16; p++)  LCD_Write_DATA(0xFF,0xFF);&lt;br /&gt;
  Address_set(x2,y2-8,x2+7,y2-7);&lt;br /&gt;
  for(p=0; p&amp;lt;16; p++)  LCD_Write_DATA(0xFF,0xFF);&lt;br /&gt;
  Address_set(x2,y2-15,x2+1,y2);&lt;br /&gt;
  for(p=0; p&amp;lt;32; p++)  LCD_Write_DATA(0xFF,0xFF);&lt;br /&gt;
 &lt;br /&gt;
    h2=h2/10;&lt;br /&gt;
    z2=z3/h2; &lt;br /&gt;
    z3=z3-z2*h2;&lt;br /&gt;
    if (z2==0)  {&lt;br /&gt;
      Address_set(x2+2,y2-8,x2+5,y2-7);&lt;br /&gt;
      for(p=0; p&amp;lt;8; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
    }&lt;br /&gt;
    if (z2==1)  {&lt;br /&gt;
      Address_set(x2,y2-15,x2+5,y2);&lt;br /&gt;
      for(p=0; p&amp;lt;96; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
    }&lt;br /&gt;
   if (z2==2)  {&lt;br /&gt;
      Address_set(x2,y2-13,x2+1,y2-9);&lt;br /&gt;
      for(p=0; p&amp;lt;10; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
      Address_set(x2+6,y2-6,x2+7,y2-2);&lt;br /&gt;
      for(p=0; p&amp;lt;10; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
    }&lt;br /&gt;
   if (z2==3)  {&lt;br /&gt;
      Address_set(x2,y2-13,x2+1,y2-9);&lt;br /&gt;
      for(p=0; p&amp;lt;10; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
      Address_set(x2,y2-6,x2+1,y2-2);&lt;br /&gt;
      for(p=0; p&amp;lt;10; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
    }&lt;br /&gt;
   if (z2==4)  {&lt;br /&gt;
      Address_set(x2,y2-6,x2+5,y2);&lt;br /&gt;
      for(p=0; p&amp;lt;42; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
      Address_set(x2+2,y2-15,x2+5,y2-14);&lt;br /&gt;
      for(p=0; p&amp;lt;8; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
    }&lt;br /&gt;
   if (z2==5)  {&lt;br /&gt;
      Address_set(x2+6,y2-13,x2+7,y2-9);&lt;br /&gt;
      for(p=0; p&amp;lt;10; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
     Address_set(x2,y2-6,x2+1,y2-2);&lt;br /&gt;
      for(p=0; p&amp;lt;10; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
    }&lt;br /&gt;
   if (z2==6)  {&lt;br /&gt;
      Address_set(x2+6,y2-13,x2+7,y2-9);&lt;br /&gt;
      for(p=0; p&amp;lt;10; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
    }&lt;br /&gt;
   if (z2==7)  {&lt;br /&gt;
      Address_set(x2,y2-13,x2+5,y2);&lt;br /&gt;
      for(p=0; p&amp;lt;84; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
    }&lt;br /&gt;
   if (z2==9)  {&lt;br /&gt;
      Address_set(x2,y2-6,x2+1,y2-2);&lt;br /&gt;
      for(p=0; p&amp;lt;10; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(LCD_CS,HIGH); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void newpa(void)&lt;br /&gt;
{&lt;br /&gt;
  unsigned char p;&lt;br /&gt;
  digitalWrite(LCD_CS,LOW); &lt;br /&gt;
  Pant(0x00,0x00);   &lt;br /&gt;
&lt;br /&gt;
  Address_set(0,319,240,319);&lt;br /&gt;
  for(p=0; p&amp;lt;240; p++)  LCD_Write_DATA(0xF8,0x00);&lt;br /&gt;
  Address_set(0,0,240,0);&lt;br /&gt;
  for(p=0; p&amp;lt;240; p++)  LCD_Write_DATA(0xFF,0xFF);&lt;br /&gt;
  Address_set(0,300,240,300);&lt;br /&gt;
  for(p=0; p&amp;lt;240; p++)  LCD_Write_DATA(0xFF,0xFF);&lt;br /&gt;
  Address_set(0,0,0,255);&lt;br /&gt;
  for(p=0; p&amp;lt;255; p++)  LCD_Write_DATA(0xF8,0x00);&lt;br /&gt;
  Address_set(0,255,0,300);&lt;br /&gt;
  for(p=0; p&amp;lt;45; p++)  LCD_Write_DATA(0xF8,0x00);&lt;br /&gt;
  Address_set(239,0,239,255);&lt;br /&gt;
  for(p=0; p&amp;lt;255; p++)  LCD_Write_DATA(0xF8,0x00);&lt;br /&gt;
  Address_set(239,255,239,300);&lt;br /&gt;
  for(p=0; p&amp;lt;45; p++)  LCD_Write_DATA(0xF8,0x00);&lt;br /&gt;
Address_set(50,308,59,311);&lt;br /&gt;
  for(p=0; p&amp;lt;40; p++)  LCD_Write_DATA(0x07,0xE0);&lt;br /&gt;
Address_set(53,305,56,314);&lt;br /&gt;
  for(p=0; p&amp;lt;40; p++)  LCD_Write_DATA(0x07,0xE0);&lt;br /&gt;
Address_set(215,305,239,314);&lt;br /&gt;
  for(p=0; p&amp;lt;250; p++)  LCD_Write_DATA(0xF8,0x00);&lt;br /&gt;
 digitalWrite(LCD_CS,HIGH); &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
 void recan(void)&lt;br /&gt;
{&lt;br /&gt;
  int i,j;&lt;br /&gt;
//  unsigned int m;&lt;br /&gt;
 digitalWrite(LCD_CS,LOW); &lt;br /&gt;
  for(i=0;i&amp;lt;7;i++)&lt;br /&gt;
  {&lt;br /&gt;
//    m=i*3;&lt;br /&gt;
    Address_set(i*5,305,i*5+3,314);&lt;br /&gt;
    for(j=0; j&amp;lt;40; j++)&lt;br /&gt;
    {&lt;br /&gt;
      if (1+i*2&amp;lt;= k) LCD_Write_DATA(0xFF,0xE0); else LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
Address_set(100,305,124,314);&lt;br /&gt;
  for(i=0; i&amp;lt;250; i++)  LCD_Write_DATA(vh2,vl2);&lt;br /&gt;
Address_set(125,305,149,314);&lt;br /&gt;
  for(i=0; i&amp;lt;250; i++)  LCD_Write_DATA(vh2,vl2);&lt;br /&gt;
 digitalWrite(LCD_CS,HIGH); &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
void AD7843(void)              &lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(CS,LOW);                    &lt;br /&gt;
  WriteCharTo7843(0x90);        &lt;br /&gt;
  digitalWrite(DCLK,HIGH);&lt;br /&gt;
  digitalWrite(DCLK,LOW); &lt;br /&gt;
  TP_Y=ReadFromCharFrom7843();&lt;br /&gt;
  WriteCharTo7843(0xD0);      &lt;br /&gt;
  digitalWrite(DCLK,HIGH);&lt;br /&gt;
  digitalWrite(DCLK,LOW);&lt;br /&gt;
  TP_X=ReadFromCharFrom7843();&lt;br /&gt;
  digitalWrite(CS,HIGH);&lt;br /&gt;
 &lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void setup()&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
  unsigned char p;&lt;br /&gt;
&lt;br /&gt;
  for(p=0;p&amp;lt;20;p++)&lt;br /&gt;
  {&lt;br /&gt;
    pinMode(p,OUTPUT);&lt;br /&gt;
  }&lt;br /&gt;
  pinMode(DOUT,INPUT);&lt;br /&gt;
      x0=1;&lt;br /&gt;
      y0=1;&lt;br /&gt;
 &lt;br /&gt;
  LCD_Init();  &lt;br /&gt;
  newpa();&lt;br /&gt;
  recan();&lt;br /&gt;
  digi(vh2);&lt;br /&gt;
  x3=x3+90;&lt;br /&gt;
  digi(vl2);&lt;br /&gt;
  spistar();  &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void loop()&lt;br /&gt;
{  &lt;br /&gt;
  rx=0;&lt;br /&gt;
  ry=0;&lt;br /&gt;
   &lt;br /&gt;
  for(l3=0;l3&amp;lt;8;l3++)&lt;br /&gt;
    {&lt;br /&gt;
      AD7843();&lt;br /&gt;
&lt;br /&gt;
      lx=0;&lt;br /&gt;
      ly=-1*TP_Y;&lt;br /&gt;
      ly=4095+ly;              //4095=Basiswert y-Signal&lt;br /&gt;
      if(ly &amp;gt; 0) lx=1*TP_X; else {lx=0;ly=0;rx=0;ry=0;l3=9; }&lt;br /&gt;
      rx=rx+lx;&lt;br /&gt;
      ry=ry+ly;&lt;br /&gt;
    }&lt;br /&gt;
      lx=(rx/8-180)/15;        //180=Minimaler x-Wert bei &#039;Touch&#039;&lt;br /&gt;
      ly=(ry/8-240)/11;        //240=Minimaler (über 4095) y-Wert bei &#039;Touch&#039;&lt;br /&gt;
      if(ly &amp;lt; 1) {lx=0;ly=0; }&lt;br /&gt;
      if(lx &amp;lt; 1) lx=0;&lt;br /&gt;
 &lt;br /&gt;
      if(ly &amp;gt; 309-k)&lt;br /&gt;
      {&lt;br /&gt;
        ly=0;&lt;br /&gt;
        if(lx &amp;gt; 200) k=k-2; else if (lx &amp;gt; 160) k=k+2;else&lt;br /&gt;
            if (lx &amp;gt; 100) vh2++; else if (lx &amp;gt; 40) vl2++; else newpa();&lt;br /&gt;
        lx=0;&lt;br /&gt;
        if (k&amp;lt;1) k=1;&lt;br /&gt;
        if (k&amp;gt;13) k=13;&lt;br /&gt;
        if (vh2&amp;gt;255) vh2=0;&lt;br /&gt;
        if (vl2&amp;gt;255) vl2=0;&lt;br /&gt;
        x3=65;&lt;br /&gt;
        digi(vh2);&lt;br /&gt;
        x3=x3+90;&lt;br /&gt;
        digi(vl2);&lt;br /&gt;
        recan();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if(ly &amp;gt; 299-k) ly=299-k;&lt;br /&gt;
      if(ly &amp;gt; 0)&lt;br /&gt;
      {&lt;br /&gt;
        x0=240-lx;&lt;br /&gt;
        if(x0 &amp;gt; 240-k) x0=240-k;&lt;br /&gt;
        y0=ly;&lt;br /&gt;
        l2=(k+1)*(k+1);&lt;br /&gt;
        digitalWrite(LCD_CS,LOW); &lt;br /&gt;
        Address_set(x0,y0,x0+k,y0+k);&lt;br /&gt;
        for (l3=0; l3&amp;lt;l2; l3++) LCD_Write_DATA(vh2,vl2);&lt;br /&gt;
        digitalWrite(LCD_CS,HIGH); &lt;br /&gt;
    }&lt;br /&gt;
    delay (50);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Derivate==&lt;br /&gt;
Es gibt viele Derivate die auf dem Arduino basieren, weil&lt;br /&gt;
* Alle Layouts quelloffen im Internet stehen&lt;br /&gt;
* Der Bootloader sowohl als Quellocde und schon compillert zum Download im Internet stehen&lt;br /&gt;
*Man die IDE für alle Atmel-Chips verwenden kann, die einen Arduino-Bootloader besitzen&lt;br /&gt;
*Man auch eine Arduino-Derivat auf dem Steckbrett zusammbauen kann  &lt;br /&gt;
&lt;br /&gt;
==Tutorial==&lt;br /&gt;
===Ein erster Sketch: Blinkende LED===&lt;br /&gt;
Die meisten aktuellen Arduino-Boards habe einen fest verlötete&lt;br /&gt;
SMD-LED, welche an Pin 13 angeschloßen ist. Diese LED kann von jedem&lt;br /&gt;
Sketch angesteuert werden. Da diese LED meistens vorhanden ist und immer an Pin 13 ageschloßen ist, ist dieses Programm auf den meisten Boards gleich.&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//Blinkende LED&lt;br /&gt;
void setup() {&lt;br /&gt;
pinMode(13,OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
delay(1000);&lt;br /&gt;
digitalWrite(13,HIGH);&lt;br /&gt;
delay(1000);&lt;br /&gt;
digitalWrite(13,LOW);&lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
* [http://www.arduino.cc/en/Main/Software Download der IDE] &lt;br /&gt;
* [http://www.mikrocontroller.net/articles/AVR Artikel zur AVR Prozessor-Serie]&lt;br /&gt;
&lt;br /&gt;
==Literatur==&lt;br /&gt;
* Erik Bartmann: &#039;&#039;Die elektronische Welt mit Arduino entdecken&#039;&#039;, O&#039;Reilly Verlag, 2011, ISBN 978-3-89721-319-7&lt;br /&gt;
* Thomas Brühlmann: &#039;&#039;Arduino: Praxiseinstieg&#039;&#039;, mitp Verlag, 2010, ISBN 978-3-8266-5605-7&lt;br /&gt;
&lt;br /&gt;
==Bezugsquellen(Auswahl)==&lt;br /&gt;
&lt;br /&gt;
===Offiziele Boards===&lt;br /&gt;
* [http://www.watterott.com/de/Boards-Kits/Arduino Watterott.com] &lt;br /&gt;
* [http://www.reichelt.de/ Reichelt.de]&lt;br /&gt;
* [http://www.conrad.de/ Conrad.de]&lt;br /&gt;
* [http://www.tigal.com/ TIGAL.com]&lt;br /&gt;
&lt;br /&gt;
===Lernpakete===&lt;br /&gt;
* [http://www.franzis.de/ Franzis Verlag(Lernpakete)]&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [http://www.arduino.cc/ Website des Arduino-Projekt] &lt;br /&gt;
* [http://arduino.cc/forum/index.php/board,31.0.html Deutsches Arduino-Forum(offiziel)]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AVR-Boards]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Mknot9</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Arduino&amp;diff=74801</id>
		<title>Arduino</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Arduino&amp;diff=74801"/>
		<updated>2013-03-25T00:28:38Z</updated>

		<summary type="html">&lt;p&gt;Mknot9: /* 8-bit LCD-Shield mit Touch-Controller ohne IRQ-Pin */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
Das Arduino-Projekt ist ein 2006 gestartetes Projekt aus Italien. Arduino&lt;br /&gt;
ist eine Zusammenstellung aus verschiedenen Boards und einer IDE. Die Boards basieren auf der Atmel-AVR Serie. Die einzige ausnahme bildet der Arduino Due, dieser basiert auf einem ARM-Chip von Atmel. Das Gesamt Projekt ist quelloffen,&lt;br /&gt;
also Open-Source. Der Unterschied zu anderen Atmel-Boards sind der Bootloader und die IDE. Der Bootloader wird durch das Arduino-Projekt entwickelt und ist für die einzelnen Boards spezifisch.&lt;br /&gt;
&lt;br /&gt;
==Die IDE==&lt;br /&gt;
Die Arduino-IDE ist eine in JAVA programmierte grafische Obrfläche. Dadurch das sie in JAVA programiert wurde, ist sie plattfomunabhägig und auf Windows, Linux, MacOS X und Solaris verfügbar.&lt;br /&gt;
Die Grafischeoberfläche compiliert die Sketche(so heißt ein Arduino-Programm offiziel) nicht, sondern ruft verschiedene Programme auf. Dies sind in der Regel der Compiler avr-g++(und zugehörige Programme, z.B. ein Linker) und avrdude,&lt;br /&gt;
ein Programm zum übertragen des compilierten Sketch als *.hex File auf den Flashspeicher des Arduino. Die IDE basiert auf der Processing IDE und Wiring.&lt;br /&gt;
&lt;br /&gt;
==Die Boards==&lt;br /&gt;
Die Arduino-Boards sind Atmel AVR/ARM Chips basierende Mikrocontrollerplatinen,&lt;br /&gt;
welche zur Steuerung von I/O-Pins gedacht sind. Im Gegensatz zu anderen Boards sind die Arduino-Boards nicht gedacht um als &amp;quot;Computer&amp;quot; mit Betriebssystem zu dienen, wie etwa der Raspberry Pi, sondern um die I/O Pins zu steuern. Es gibt insgesamt 14 Boards mit 13 - 70 I/O Pins. Die Platinen besitzen meisten ein USB-Aschluß(USB-B bzw. USB-Mini) oder eine Schnitstelle für einen USB-Serial-Konverterchip. Die Platinen mit USB-Anschluß haben einen solchen Chip intigriert,&lt;br /&gt;
meist ein FTDI-Chip bei älteren Boards oder ein 8U2/16U2 bei neueren Boards.Eine Ausnahme bildet hier der Arduino Leonardo: Dieser besitzt einen Atmel-AVR 32U4 Mikrocontroller, welcher auch die Funktionen eines FTDI-Chips besitzt. Es ist also kein weiterer Konverter nötig.&lt;br /&gt;
&lt;br /&gt;
===Arduino Uno===&lt;br /&gt;
Der Arduino Uno R3 ist der Standard-Arduino. In den meisten Anfänger-Bücher und Tutorials wird dieser Arduino verwendet. Auch sind die meisten Libaries für ihn geschrieben. Er ist der neuste der am längsten weiterentwickleten Arduino-Reihe.&lt;br /&gt;
So ist eine frühere Version des Arduino Uno (Arduino USB) das Board gewesen, welches als erstes &#039;&#039;Arduino&#039;&#039; gennant wurde. In der aktuellen Revision (Version) 3 besitzt der Uno 14 Digitale I/O Pins sowie 6 analoge Eingänge. Er wird bei 5V betrieben und besitzt folgende Speicherkapazitäten:&lt;br /&gt;
* 32K Flash(0,5 werden vom Bootloader verwendet.)&lt;br /&gt;
* 2K SRAM&lt;br /&gt;
* 1K EEPROM&lt;br /&gt;
* 16 MHz (Prozessortakt)&lt;br /&gt;
Neben dem USB-B Anschluß verfügt der Uno noch über folgende Anschlüsse:&lt;br /&gt;
* Klinkenbuchse (2.1mm , 6-20 V möglich)&lt;br /&gt;
* SPI&lt;br /&gt;
* I²C&lt;br /&gt;
* ICSP&lt;br /&gt;
&lt;br /&gt;
====Arduino Duemilanove====&lt;br /&gt;
Der Arduino Duemilanove ist der Vorgänger des Arduino Uno. Er besitzt den&lt;br /&gt;
ATmega168 (seit 2009 328p) statt dem 328 wie beim Uno. Als Konverter verwendet der Duemilianove eine FTDI-Chip anstelle eines 16U2. Sonst ist von der Pin anzahlen und den Maßen des Boards identisch mit denen des Uno.&lt;br /&gt;
&lt;br /&gt;
====Arduino Diecimila====&lt;br /&gt;
====Arduino NG====&lt;br /&gt;
====Arduino Usb====&lt;br /&gt;
&lt;br /&gt;
===Arduino Mega===&lt;br /&gt;
====Arduino Mega ADK====&lt;br /&gt;
===Arduino Due===&lt;br /&gt;
&lt;br /&gt;
===Arduino Ethernet===&lt;br /&gt;
===Arduino LilyPad===&lt;br /&gt;
===Arduino Leonardo===  &lt;br /&gt;
===Arduino Nano===&lt;br /&gt;
===Arduino Micro===&lt;br /&gt;
===Arduino Fio===&lt;br /&gt;
===Arduino Pro Mini===&lt;br /&gt;
====Arduino Mini====&lt;br /&gt;
===Arduino Pro===&lt;br /&gt;
&lt;br /&gt;
==Shields(Erweiterungsplatinen)==&lt;br /&gt;
Sogennante Shields sind Erweiterungsplatinen, die die Funktionen eines Arduino-Boards um neue Funktionen erweitern. So gibt es z.B. Shields die den Arduino um eine Ethernet-Schnittstelle erweitern, einen VGA-Aschluß besitzen oder einfach leere Platinen sind, auf die eine Chip eingesetzt werden kann, ohne zu Löten. Für das letztere Bsp. wäre eine solche Platine die XBEE-Antenne.&lt;br /&gt;
&lt;br /&gt;
===8-bit LCD-Shield mit Touch-Controller ohne IRQ-Pin===&lt;br /&gt;
&lt;br /&gt;
Seit ca. Herbst 2012 werden einige LCD-Shields mit Touch-Controller angeboten, die den IRQ-Pin nicht mehr durchschleifen.&lt;br /&gt;
&lt;br /&gt;
Damit läuft auch die U-Touch Bibliothek von Henning Carlsen nicht mehr. Alle Sample-Codes im Web funktionieren auch nicht. Das Problem besteht darin herauszufinden, an welchen Arduino-Pin die das CS-Signal geleitet wird. Hier hilft nur Sheets studieren. Beim Austesten des Touch-Shields ergab sich bei mir eine y-Basiswert des Touchcontrollers von 4095 und eine Differenz der Widerstandswerte zwischen &#039;Touch&#039; und &#039;keine Touch&#039; von 180 (x) bzw. 240 (y), siehe Code-Kommentare.   &lt;br /&gt;
&lt;br /&gt;
Bei mir lief schließlich folgender Code (das CS-Signal lag auf Pin 10):&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#define LCD_RS   19         &lt;br /&gt;
#define LCD_WR   18     &lt;br /&gt;
#define LCD_CS   17       &lt;br /&gt;
#define LCD_REST 16&lt;br /&gt;
&lt;br /&gt;
#define DCLK     15&lt;br /&gt;
#define DIN      14 &lt;br /&gt;
#define CS       10  &lt;br /&gt;
#define DOUT     8&lt;br /&gt;
&lt;br /&gt;
//#define IRQ      7    &lt;br /&gt;
 &lt;br /&gt;
unsigned int TP_X,TP_Y,x0,y0;    &lt;br /&gt;
unsigned int l3=0;&lt;br /&gt;
int lx,ly, l2, ry,rx,x3=65,y3=318;&lt;br /&gt;
int  k=3, vh2=0x84,vl2=0xFF;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
void spistar()                                     //SPI Start&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(CS,LOW);&lt;br /&gt;
  digitalWrite(DCLK,HIGH);&lt;br /&gt;
  digitalWrite(DIN,HIGH);&lt;br /&gt;
  digitalWrite(DCLK,HIGH);&lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
//**********************************************************&lt;br /&gt;
void WriteCharTo7843(unsigned char num)          //SPI Write Data&lt;br /&gt;
{&lt;br /&gt;
  unsigned char count=0;&lt;br /&gt;
  unsigned char temp;&lt;br /&gt;
  unsigned nop;&lt;br /&gt;
  temp=num;&lt;br /&gt;
  digitalWrite(DCLK,LOW);&lt;br /&gt;
  for(count=0;count&amp;lt;8;count++)&lt;br /&gt;
  {&lt;br /&gt;
    if(temp&amp;amp;0x80)&lt;br /&gt;
      digitalWrite(DIN,HIGH);&lt;br /&gt;
    else&lt;br /&gt;
      digitalWrite(DIN,LOW);&lt;br /&gt;
 &lt;br /&gt;
    temp=temp&amp;lt;&amp;lt;1; &lt;br /&gt;
 &lt;br /&gt;
    digitalWrite(DCLK,LOW);                &lt;br /&gt;
    nop++;&lt;br /&gt;
    nop++;&lt;br /&gt;
    digitalWrite(DCLK,HIGH);&lt;br /&gt;
    nop++;&lt;br /&gt;
    nop++;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//**********************************************************&lt;br /&gt;
unsigned int ReadFromCharFrom7843()             //SPI Read Data&lt;br /&gt;
{ &lt;br /&gt;
  unsigned nop;&lt;br /&gt;
  unsigned char count=0;&lt;br /&gt;
  unsigned int Num=0;&lt;br /&gt;
  for(count=0;count&amp;lt;12;count++)&lt;br /&gt;
  {&lt;br /&gt;
    Num&amp;lt;&amp;lt;=1;&lt;br /&gt;
    digitalWrite(DCLK,HIGH);//DCLK=1; _nop_();_nop_();_nop_();                &lt;br /&gt;
    nop++;&lt;br /&gt;
    digitalWrite(DCLK,LOW);//DCLK=0; _nop_();_nop_();_nop_();&lt;br /&gt;
    nop++;&lt;br /&gt;
    if(digitalRead(DOUT)) Num++;&lt;br /&gt;
  }&lt;br /&gt;
  return(Num);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
void LCD_Writ_Bus(char VH,char VL)   &lt;br /&gt;
{   &lt;br /&gt;
  PORTD = VH;&lt;br /&gt;
  digitalWrite(LCD_WR,LOW);&lt;br /&gt;
  digitalWrite(LCD_WR,HIGH);&lt;br /&gt;
  PORTD = VL;&lt;br /&gt;
  digitalWrite(LCD_WR,LOW);&lt;br /&gt;
  digitalWrite(LCD_WR,HIGH);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
void LCD_Write_COM(char VH,char VL)  &lt;br /&gt;
{   &lt;br /&gt;
  digitalWrite(LCD_RS,LOW);&lt;br /&gt;
  LCD_Writ_Bus(VH,VL);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
void LCD_Write_DATA(char VH,char VL)    &lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(LCD_RS,HIGH);&lt;br /&gt;
  LCD_Writ_Bus(VH,VL);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void Lcd_Write_Com_Data(int com,int val)&lt;br /&gt;
{&lt;br /&gt;
    LCD_Write_COM(com&amp;gt;&amp;gt;8,com);&lt;br /&gt;
    LCD_Write_DATA(val&amp;gt;&amp;gt;8,val);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void Address_set(unsigned int x1,unsigned int y1,unsigned int x2,unsigned int y2)&lt;br /&gt;
{&lt;br /&gt;
  LCD_Write_COM(0x00,0x46);LCD_Write_DATA(x2,x1);	  &lt;br /&gt;
  LCD_Write_COM(0x00,0x47);LCD_Write_DATA(y2&amp;gt;&amp;gt;8,y2);  &lt;br /&gt;
  LCD_Write_COM(0x00,0x48);LCD_Write_DATA(y1&amp;gt;&amp;gt;8,y1);&lt;br /&gt;
  LCD_Write_COM(0x00,0x20);LCD_Write_DATA(x1&amp;gt;&amp;gt;8,x1);	  &lt;br /&gt;
  LCD_Write_COM(0x00,0x21);LCD_Write_DATA(y1&amp;gt;&amp;gt;8,y1); &lt;br /&gt;
  LCD_Write_COM(0x00,0x22);		         				 &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void LCD_Init(void)&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
  digitalWrite(LCD_REST,HIGH);&lt;br /&gt;
  delay(5); &lt;br /&gt;
  digitalWrite(LCD_REST,LOW);&lt;br /&gt;
  delay(5);&lt;br /&gt;
  digitalWrite(LCD_REST,HIGH);&lt;br /&gt;
  delay(5);&lt;br /&gt;
 &lt;br /&gt;
  digitalWrite(LCD_CS,LOW);  &lt;br /&gt;
        Lcd_Write_Com_Data(0x11,0x2004);		&lt;br /&gt;
        Lcd_Write_Com_Data(0x13,0xCC00);		&lt;br /&gt;
        Lcd_Write_Com_Data(0x15,0x2600);	&lt;br /&gt;
	Lcd_Write_Com_Data(0x14,0x252A);			&lt;br /&gt;
	Lcd_Write_Com_Data(0x12,0x0033);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x13,0xCC04);		&lt;br /&gt;
	delay(1); &lt;br /&gt;
	Lcd_Write_Com_Data(0x13,0xCC06);		&lt;br /&gt;
	delay(1); &lt;br /&gt;
	Lcd_Write_Com_Data(0x13,0xCC4F);		&lt;br /&gt;
	delay(1); &lt;br /&gt;
	Lcd_Write_Com_Data(0x13,0x674F);&lt;br /&gt;
	Lcd_Write_Com_Data(0x11,0x2003);&lt;br /&gt;
	delay(1); 	&lt;br /&gt;
	Lcd_Write_Com_Data(0x30,0x2609);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x31,0x242C);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x32,0x1F23);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x33,0x2425);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x34,0x2226);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x35,0x2523);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x36,0x1C1A);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x37,0x131D);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x38,0x0B11);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x39,0x1210);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x3A,0x1315);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x3B,0x3619);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x3C,0x0D00);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x3D,0x000D);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x16,0x0007);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x02,0x0013);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x03,0x0003);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x01,0x0127);		&lt;br /&gt;
	delay(1); &lt;br /&gt;
	Lcd_Write_Com_Data(0x08,0x0303);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x0A,0x000B);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x0B,0x0003);   &lt;br /&gt;
	Lcd_Write_Com_Data(0x0C,0x0000);   &lt;br /&gt;
	Lcd_Write_Com_Data(0x41,0x0000);    &lt;br /&gt;
	Lcd_Write_Com_Data(0x50,0x0000);   &lt;br /&gt;
	Lcd_Write_Com_Data(0x60,0x0005);    &lt;br /&gt;
        Lcd_Write_Com_Data(0x70,0x000B);    &lt;br /&gt;
	Lcd_Write_Com_Data(0x71,0x0000);    &lt;br /&gt;
	Lcd_Write_Com_Data(0x78,0x0000);    &lt;br /&gt;
	Lcd_Write_Com_Data(0x7A,0x0000);   &lt;br /&gt;
	Lcd_Write_Com_Data(0x79,0x0007);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x07,0x0051);   &lt;br /&gt;
	delay(1); 	&lt;br /&gt;
	Lcd_Write_Com_Data(0x07,0x0053);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x79,0x0000);&lt;br /&gt;
 &lt;br /&gt;
	LCD_Write_COM(0x00,0x22);&lt;br /&gt;
  digitalWrite(LCD_CS,HIGH);  &lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void Pant(char VH,char VL)&lt;br /&gt;
{&lt;br /&gt;
  int i,j;&lt;br /&gt;
  Address_set(0,0,240,320);&lt;br /&gt;
  for(i=0;i&amp;lt;=320;i++)&lt;br /&gt;
  {&lt;br /&gt;
    for (j=0;j&amp;lt;=240;j++)&lt;br /&gt;
    {&lt;br /&gt;
      LCD_Write_DATA(VH,VL);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void digi(int z3)&lt;br /&gt;
{&lt;br /&gt;
  unsigned char p;&lt;br /&gt;
  int x2, y2, z2, i,h2=1000;&lt;br /&gt;
  digitalWrite(LCD_CS,LOW); &lt;br /&gt;
  for(i=0;i&amp;lt;3;i++)&lt;br /&gt;
  {&lt;br /&gt;
  y2=y3;&lt;br /&gt;
  x2=x3+(10*i);&lt;br /&gt;
  Address_set(x2+6,y2-15,x2+7,y2);&lt;br /&gt;
  for(p=0; p&amp;lt;32; p++)  LCD_Write_DATA(0xFF,0xFF);&lt;br /&gt;
  Address_set(x2,y2-15,x2+7,y2-14);&lt;br /&gt;
  for(p=0; p&amp;lt;16; p++)  LCD_Write_DATA(0xFF,0xFF);&lt;br /&gt;
  Address_set(x2,y2-1,x2+7,y2);&lt;br /&gt;
  for(p=0; p&amp;lt;16; p++)  LCD_Write_DATA(0xFF,0xFF);&lt;br /&gt;
  Address_set(x2,y2-8,x2+7,y2-7);&lt;br /&gt;
  for(p=0; p&amp;lt;16; p++)  LCD_Write_DATA(0xFF,0xFF);&lt;br /&gt;
  Address_set(x2,y2-15,x2+1,y2);&lt;br /&gt;
  for(p=0; p&amp;lt;32; p++)  LCD_Write_DATA(0xFF,0xFF);&lt;br /&gt;
 &lt;br /&gt;
    h2=h2/10;&lt;br /&gt;
    z2=z3/h2; &lt;br /&gt;
    z3=z3-z2*h2;&lt;br /&gt;
    if (z2==0)  {&lt;br /&gt;
      Address_set(x2+2,y2-8,x2+5,y2-7);&lt;br /&gt;
      for(p=0; p&amp;lt;8; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
    }&lt;br /&gt;
    if (z2==1)  {&lt;br /&gt;
      Address_set(x2,y2-15,x2+5,y2);&lt;br /&gt;
      for(p=0; p&amp;lt;96; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
    }&lt;br /&gt;
   if (z2==2)  {&lt;br /&gt;
      Address_set(x2,y2-13,x2+1,y2-9);&lt;br /&gt;
      for(p=0; p&amp;lt;10; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
      Address_set(x2+6,y2-6,x2+7,y2-2);&lt;br /&gt;
      for(p=0; p&amp;lt;10; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
    }&lt;br /&gt;
   if (z2==3)  {&lt;br /&gt;
      Address_set(x2,y2-13,x2+1,y2-9);&lt;br /&gt;
      for(p=0; p&amp;lt;10; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
      Address_set(x2,y2-6,x2+1,y2-2);&lt;br /&gt;
      for(p=0; p&amp;lt;10; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
    }&lt;br /&gt;
   if (z2==4)  {&lt;br /&gt;
      Address_set(x2,y2-6,x2+5,y2);&lt;br /&gt;
      for(p=0; p&amp;lt;42; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
      Address_set(x2+2,y2-15,x2+5,y2-14);&lt;br /&gt;
      for(p=0; p&amp;lt;8; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
    }&lt;br /&gt;
   if (z2==5)  {&lt;br /&gt;
      Address_set(x2+6,y2-13,x2+7,y2-9);&lt;br /&gt;
      for(p=0; p&amp;lt;10; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
     Address_set(x2,y2-6,x2+1,y2-2);&lt;br /&gt;
      for(p=0; p&amp;lt;10; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
    }&lt;br /&gt;
   if (z2==6)  {&lt;br /&gt;
      Address_set(x2+6,y2-13,x2+7,y2-9);&lt;br /&gt;
      for(p=0; p&amp;lt;10; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
    }&lt;br /&gt;
   if (z2==7)  {&lt;br /&gt;
      Address_set(x2,y2-13,x2+5,y2);&lt;br /&gt;
      for(p=0; p&amp;lt;84; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
    }&lt;br /&gt;
   if (z2==9)  {&lt;br /&gt;
      Address_set(x2,y2-6,x2+1,y2-2);&lt;br /&gt;
      for(p=0; p&amp;lt;10; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(LCD_CS,HIGH); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void newpa(void)&lt;br /&gt;
{&lt;br /&gt;
  unsigned char p;&lt;br /&gt;
  digitalWrite(LCD_CS,LOW); &lt;br /&gt;
  Pant(0x00,0x00);   &lt;br /&gt;
&lt;br /&gt;
  Address_set(0,319,240,319);&lt;br /&gt;
  for(p=0; p&amp;lt;240; p++)  LCD_Write_DATA(0xF8,0x00);&lt;br /&gt;
  Address_set(0,0,240,0);&lt;br /&gt;
  for(p=0; p&amp;lt;240; p++)  LCD_Write_DATA(0xFF,0xFF);&lt;br /&gt;
  Address_set(0,300,240,300);&lt;br /&gt;
  for(p=0; p&amp;lt;240; p++)  LCD_Write_DATA(0xFF,0xFF);&lt;br /&gt;
  Address_set(0,0,0,255);&lt;br /&gt;
  for(p=0; p&amp;lt;255; p++)  LCD_Write_DATA(0xF8,0x00);&lt;br /&gt;
  Address_set(0,255,0,300);&lt;br /&gt;
  for(p=0; p&amp;lt;45; p++)  LCD_Write_DATA(0xF8,0x00);&lt;br /&gt;
  Address_set(239,0,239,255);&lt;br /&gt;
  for(p=0; p&amp;lt;255; p++)  LCD_Write_DATA(0xF8,0x00);&lt;br /&gt;
  Address_set(239,255,239,300);&lt;br /&gt;
  for(p=0; p&amp;lt;45; p++)  LCD_Write_DATA(0xF8,0x00);&lt;br /&gt;
Address_set(50,308,59,311);&lt;br /&gt;
  for(p=0; p&amp;lt;40; p++)  LCD_Write_DATA(0x07,0xE0);&lt;br /&gt;
Address_set(53,305,56,314);&lt;br /&gt;
  for(p=0; p&amp;lt;40; p++)  LCD_Write_DATA(0x07,0xE0);&lt;br /&gt;
Address_set(215,305,239,314);&lt;br /&gt;
  for(p=0; p&amp;lt;250; p++)  LCD_Write_DATA(0xF8,0x00);&lt;br /&gt;
 digitalWrite(LCD_CS,HIGH); &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
 void recan(void)&lt;br /&gt;
{&lt;br /&gt;
  int i,j;&lt;br /&gt;
//  unsigned int m;&lt;br /&gt;
 digitalWrite(LCD_CS,LOW); &lt;br /&gt;
  for(i=0;i&amp;lt;7;i++)&lt;br /&gt;
  {&lt;br /&gt;
//    m=i*3;&lt;br /&gt;
    Address_set(i*5,305,i*5+3,314);&lt;br /&gt;
    for(j=0; j&amp;lt;40; j++)&lt;br /&gt;
    {&lt;br /&gt;
      if (1+i*2&amp;lt;= k) LCD_Write_DATA(0xFF,0xE0); else LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
Address_set(100,305,124,314);&lt;br /&gt;
  for(i=0; i&amp;lt;250; i++)  LCD_Write_DATA(vh2,vl2);&lt;br /&gt;
Address_set(125,305,149,314);&lt;br /&gt;
  for(i=0; i&amp;lt;250; i++)  LCD_Write_DATA(vh2,vl2);&lt;br /&gt;
 digitalWrite(LCD_CS,HIGH); &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
void AD7843(void)              &lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(CS,LOW);                    &lt;br /&gt;
  WriteCharTo7843(0x90);        &lt;br /&gt;
  digitalWrite(DCLK,HIGH);&lt;br /&gt;
  digitalWrite(DCLK,LOW); &lt;br /&gt;
  TP_Y=ReadFromCharFrom7843();&lt;br /&gt;
  WriteCharTo7843(0xD0);      &lt;br /&gt;
  digitalWrite(DCLK,HIGH);&lt;br /&gt;
  digitalWrite(DCLK,LOW);&lt;br /&gt;
  TP_X=ReadFromCharFrom7843();&lt;br /&gt;
  digitalWrite(CS,HIGH);&lt;br /&gt;
 &lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void setup()&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
  unsigned char p;&lt;br /&gt;
&lt;br /&gt;
  for(p=0;p&amp;lt;20;p++)&lt;br /&gt;
  {&lt;br /&gt;
    pinMode(p,OUTPUT);&lt;br /&gt;
  }&lt;br /&gt;
  pinMode(DOUT,INPUT);&lt;br /&gt;
      x0=1;&lt;br /&gt;
      y0=1;&lt;br /&gt;
 &lt;br /&gt;
  LCD_Init();  &lt;br /&gt;
  newpa();&lt;br /&gt;
  recan();&lt;br /&gt;
  digi(vh2);&lt;br /&gt;
  x3=x3+90;&lt;br /&gt;
  digi(vl2);&lt;br /&gt;
  spistar();  &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void loop()&lt;br /&gt;
{  &lt;br /&gt;
  rx=0;&lt;br /&gt;
  ry=0;&lt;br /&gt;
   &lt;br /&gt;
  for(l3=0;l3&amp;lt;8;l3++)&lt;br /&gt;
    {&lt;br /&gt;
      AD7843();&lt;br /&gt;
&lt;br /&gt;
      lx=0;&lt;br /&gt;
      ly=-1*TP_Y;&lt;br /&gt;
      ly=4095+ly;              //4095=Basiswert y-Signal&lt;br /&gt;
      if(ly &amp;gt; 0) lx=1*TP_X; else {lx=0;ly=0;rx=0;ry=0;l3=9; }&lt;br /&gt;
      rx=rx+lx;&lt;br /&gt;
      ry=ry+ly;&lt;br /&gt;
    }&lt;br /&gt;
      lx=(rx/8-180)/15;        //180=Minimaler x-Wert bei &#039;Touch&#039;&lt;br /&gt;
      ly=(ry/8-240)/11;        //240=Minimaler (über 4095) y-Wert bei &#039;Touch&#039;&lt;br /&gt;
      if(ly &amp;lt; 1) {lx=0;ly=0; }&lt;br /&gt;
      if(lx &amp;lt; 1) lx=0;&lt;br /&gt;
 &lt;br /&gt;
      if(ly &amp;gt; 309-k)&lt;br /&gt;
      {&lt;br /&gt;
        ly=0;&lt;br /&gt;
        if(lx &amp;gt; 200) k=k-2; else if (lx &amp;gt; 160) k=k+2;else&lt;br /&gt;
            if (lx &amp;gt; 100) vh2++; else if (lx &amp;gt; 40) vl2++; else newpa();&lt;br /&gt;
        lx=0;&lt;br /&gt;
        if (k&amp;lt;1) k=1;&lt;br /&gt;
        if (k&amp;gt;13) k=13;&lt;br /&gt;
        if (vh2&amp;gt;255) vh2=0;&lt;br /&gt;
        if (vl2&amp;gt;255) vl2=0;&lt;br /&gt;
        x3=65;&lt;br /&gt;
        digi(vh2);&lt;br /&gt;
        x3=x3+90;&lt;br /&gt;
        digi(vl2);&lt;br /&gt;
        recan();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if(ly &amp;gt; 299-k) ly=299-k;&lt;br /&gt;
      if(ly &amp;gt; 0)&lt;br /&gt;
      {&lt;br /&gt;
        x0=240-lx;&lt;br /&gt;
        if(x0 &amp;gt; 240-k) x0=240-k;&lt;br /&gt;
        y0=ly;&lt;br /&gt;
        l2=(k+1)*(k+1);&lt;br /&gt;
        digitalWrite(LCD_CS,LOW); &lt;br /&gt;
        Address_set(x0,y0,x0+k,y0+k);&lt;br /&gt;
        for (l3=0; l3&amp;lt;l2; l3++) LCD_Write_DATA(vh2,vl2);&lt;br /&gt;
        digitalWrite(LCD_CS,HIGH); &lt;br /&gt;
    }&lt;br /&gt;
    delay (50);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Derivate==&lt;br /&gt;
Es gibt viele Derivate die auf dem Arduino basieren, weil&lt;br /&gt;
* Alle Layouts quelloffen im Internet stehen&lt;br /&gt;
* Der Bootloader sowohl als Quellocde und schon compillert zum Download im Internet stehen&lt;br /&gt;
*Man die IDE für alle Atmel-Chips verwenden kann, die einen Arduino-Bootloader besitzen&lt;br /&gt;
*Man auch eine Arduino-Derivat auf dem Steckbrett zusammbauen kann  &lt;br /&gt;
&lt;br /&gt;
==Tutorial==&lt;br /&gt;
===Ein erster Sketch: Blinkende LED===&lt;br /&gt;
Die meisten aktuellen Arduino-Boards habe einen fest verlötete&lt;br /&gt;
SMD-LED, welche an Pin 13 angeschloßen ist. Diese LED kann von jedem&lt;br /&gt;
Sketch angesteuert werden. Da diese LED meistens vorhanden ist und immer an Pin 13 ageschloßen ist, ist dieses Programm auf den meisten Boards gleich.&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//Blinkende LED&lt;br /&gt;
void setup() {&lt;br /&gt;
pinMode(13,OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
delay(1000);&lt;br /&gt;
digitalWrite(13,HIGH);&lt;br /&gt;
delay(1000);&lt;br /&gt;
digitalWrite(13,LOW);&lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
* [http://www.arduino.cc/en/Main/Software Download der IDE] &lt;br /&gt;
* [http://www.mikrocontroller.net/articles/AVR Artikel zur AVR Prozessor-Serie]&lt;br /&gt;
&lt;br /&gt;
==Literatur==&lt;br /&gt;
* Erik Bartmann: &#039;&#039;Die elektronische Welt mit Arduino entdecken&#039;&#039;, O&#039;Reilly Verlag, 2011, ISBN 978-3-89721-319-7&lt;br /&gt;
* Thomas Brühlmann: &#039;&#039;Arduino: Praxiseinstieg&#039;&#039;, mitp Verlag, 2010, ISBN 978-3-8266-5605-7&lt;br /&gt;
&lt;br /&gt;
==Bezugsquellen(Auswahl)==&lt;br /&gt;
&lt;br /&gt;
===Offiziele Boards===&lt;br /&gt;
* [http://www.watterott.com/de/Boards-Kits/Arduino Watterott.com] &lt;br /&gt;
* [http://www.reichelt.de/ Reichelt.de]&lt;br /&gt;
* [http://www.conrad.de/ Conrad.de]&lt;br /&gt;
* [http://www.tigal.com/ TIGAL.com]&lt;br /&gt;
&lt;br /&gt;
===Lernpakete===&lt;br /&gt;
* [http://www.franzis.de/ Franzis Verlag(Lernpakete)]&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [http://www.arduino.cc/ Website des Arduino-Projekt] &lt;br /&gt;
* [http://arduino.cc/forum/index.php/board,31.0.html Deutsches Arduino-Forum(offiziel)]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AVR-Boards]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Mknot9</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Arduino&amp;diff=74800</id>
		<title>Arduino</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Arduino&amp;diff=74800"/>
		<updated>2013-03-25T00:21:21Z</updated>

		<summary type="html">&lt;p&gt;Mknot9: /* 8-bit LCD-Shield mit Touch-Controller ohne IRQ-Pin */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
Das Arduino-Projekt ist ein 2006 gestartetes Projekt aus Italien. Arduino&lt;br /&gt;
ist eine Zusammenstellung aus verschiedenen Boards und einer IDE. Die Boards basieren auf der Atmel-AVR Serie. Die einzige ausnahme bildet der Arduino Due, dieser basiert auf einem ARM-Chip von Atmel. Das Gesamt Projekt ist quelloffen,&lt;br /&gt;
also Open-Source. Der Unterschied zu anderen Atmel-Boards sind der Bootloader und die IDE. Der Bootloader wird durch das Arduino-Projekt entwickelt und ist für die einzelnen Boards spezifisch.&lt;br /&gt;
&lt;br /&gt;
==Die IDE==&lt;br /&gt;
Die Arduino-IDE ist eine in JAVA programmierte grafische Obrfläche. Dadurch das sie in JAVA programiert wurde, ist sie plattfomunabhägig und auf Windows, Linux, MacOS X und Solaris verfügbar.&lt;br /&gt;
Die Grafischeoberfläche compiliert die Sketche(so heißt ein Arduino-Programm offiziel) nicht, sondern ruft verschiedene Programme auf. Dies sind in der Regel der Compiler avr-g++(und zugehörige Programme, z.B. ein Linker) und avrdude,&lt;br /&gt;
ein Programm zum übertragen des compilierten Sketch als *.hex File auf den Flashspeicher des Arduino. Die IDE basiert auf der Processing IDE und Wiring.&lt;br /&gt;
&lt;br /&gt;
==Die Boards==&lt;br /&gt;
Die Arduino-Boards sind Atmel AVR/ARM Chips basierende Mikrocontrollerplatinen,&lt;br /&gt;
welche zur Steuerung von I/O-Pins gedacht sind. Im Gegensatz zu anderen Boards sind die Arduino-Boards nicht gedacht um als &amp;quot;Computer&amp;quot; mit Betriebssystem zu dienen, wie etwa der Raspberry Pi, sondern um die I/O Pins zu steuern. Es gibt insgesamt 14 Boards mit 13 - 70 I/O Pins. Die Platinen besitzen meisten ein USB-Aschluß(USB-B bzw. USB-Mini) oder eine Schnitstelle für einen USB-Serial-Konverterchip. Die Platinen mit USB-Anschluß haben einen solchen Chip intigriert,&lt;br /&gt;
meist ein FTDI-Chip bei älteren Boards oder ein 8U2/16U2 bei neueren Boards.Eine Ausnahme bildet hier der Arduino Leonardo: Dieser besitzt einen Atmel-AVR 32U4 Mikrocontroller, welcher auch die Funktionen eines FTDI-Chips besitzt. Es ist also kein weiterer Konverter nötig.&lt;br /&gt;
&lt;br /&gt;
===Arduino Uno===&lt;br /&gt;
Der Arduino Uno R3 ist der Standard-Arduino. In den meisten Anfänger-Bücher und Tutorials wird dieser Arduino verwendet. Auch sind die meisten Libaries für ihn geschrieben. Er ist der neuste der am längsten weiterentwickleten Arduino-Reihe.&lt;br /&gt;
So ist eine frühere Version des Arduino Uno (Arduino USB) das Board gewesen, welches als erstes &#039;&#039;Arduino&#039;&#039; gennant wurde. In der aktuellen Revision (Version) 3 besitzt der Uno 14 Digitale I/O Pins sowie 6 analoge Eingänge. Er wird bei 5V betrieben und besitzt folgende Speicherkapazitäten:&lt;br /&gt;
* 32K Flash(0,5 werden vom Bootloader verwendet.)&lt;br /&gt;
* 2K SRAM&lt;br /&gt;
* 1K EEPROM&lt;br /&gt;
* 16 MHz (Prozessortakt)&lt;br /&gt;
Neben dem USB-B Anschluß verfügt der Uno noch über folgende Anschlüsse:&lt;br /&gt;
* Klinkenbuchse (2.1mm , 6-20 V möglich)&lt;br /&gt;
* SPI&lt;br /&gt;
* I²C&lt;br /&gt;
* ICSP&lt;br /&gt;
&lt;br /&gt;
====Arduino Duemilanove====&lt;br /&gt;
Der Arduino Duemilanove ist der Vorgänger des Arduino Uno. Er besitzt den&lt;br /&gt;
ATmega168 (seit 2009 328p) statt dem 328 wie beim Uno. Als Konverter verwendet der Duemilianove eine FTDI-Chip anstelle eines 16U2. Sonst ist von der Pin anzahlen und den Maßen des Boards identisch mit denen des Uno.&lt;br /&gt;
&lt;br /&gt;
====Arduino Diecimila====&lt;br /&gt;
====Arduino NG====&lt;br /&gt;
====Arduino Usb====&lt;br /&gt;
&lt;br /&gt;
===Arduino Mega===&lt;br /&gt;
====Arduino Mega ADK====&lt;br /&gt;
===Arduino Due===&lt;br /&gt;
&lt;br /&gt;
===Arduino Ethernet===&lt;br /&gt;
===Arduino LilyPad===&lt;br /&gt;
===Arduino Leonardo===  &lt;br /&gt;
===Arduino Nano===&lt;br /&gt;
===Arduino Micro===&lt;br /&gt;
===Arduino Fio===&lt;br /&gt;
===Arduino Pro Mini===&lt;br /&gt;
====Arduino Mini====&lt;br /&gt;
===Arduino Pro===&lt;br /&gt;
&lt;br /&gt;
==Shields(Erweiterungsplatinen)==&lt;br /&gt;
Sogennante Shields sind Erweiterungsplatinen, die die Funktionen eines Arduino-Boards um neue Funktionen erweitern. So gibt es z.B. Shields die den Arduino um eine Ethernet-Schnittstelle erweitern, einen VGA-Aschluß besitzen oder einfach leere Platinen sind, auf die eine Chip eingesetzt werden kann, ohne zu Löten. Für das letztere Bsp. wäre eine solche Platine die XBEE-Antenne.&lt;br /&gt;
&lt;br /&gt;
===8-bit LCD-Shield mit Touch-Controller ohne IRQ-Pin===&lt;br /&gt;
&lt;br /&gt;
Seit ca. Herbst 2012 werden einige LCD-Shields mit Touch-Controller angeboten, die den IRQ-Pin nicht mehr durchschleifen.&lt;br /&gt;
&lt;br /&gt;
Damit läuft auch die U-Touch Bibliothek von Henning Carlsen nicht mehr. Alle Sample-Codes im Web funktionieren auch nicht. Das Problem besteht darin herauszufinden, an welchen Arduino-Pin die das CS-Signal geleitet wird. Hier hilft nur Sheets studieren.&lt;br /&gt;
&lt;br /&gt;
Bei mir lief schließlich folgender Code (das CS-Signal lag auf Pin 10):&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#define LCD_RS   19         &lt;br /&gt;
#define LCD_WR   18     &lt;br /&gt;
#define LCD_CS   17       &lt;br /&gt;
#define LCD_REST 16&lt;br /&gt;
&lt;br /&gt;
#define DCLK     15&lt;br /&gt;
#define DIN      14 &lt;br /&gt;
#define CS       10  &lt;br /&gt;
#define DOUT     8&lt;br /&gt;
&lt;br /&gt;
//#define IRQ      7    &lt;br /&gt;
 &lt;br /&gt;
unsigned int TP_X,TP_Y,x0,y0;    &lt;br /&gt;
unsigned int l3=0;&lt;br /&gt;
int lx,ly, l2, ry,rx,x3=65,y3=318;&lt;br /&gt;
int  k=3, vh2=0x84,vl2=0xFF;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
void spistar()                                     //SPI Start&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(CS,LOW);&lt;br /&gt;
  digitalWrite(DCLK,HIGH);&lt;br /&gt;
  digitalWrite(DIN,HIGH);&lt;br /&gt;
  digitalWrite(DCLK,HIGH);&lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
//**********************************************************&lt;br /&gt;
void WriteCharTo7843(unsigned char num)          //SPI Write Data&lt;br /&gt;
{&lt;br /&gt;
  unsigned char count=0;&lt;br /&gt;
  unsigned char temp;&lt;br /&gt;
  unsigned nop;&lt;br /&gt;
  temp=num;&lt;br /&gt;
  digitalWrite(DCLK,LOW);&lt;br /&gt;
  for(count=0;count&amp;lt;8;count++)&lt;br /&gt;
  {&lt;br /&gt;
    if(temp&amp;amp;0x80)&lt;br /&gt;
      digitalWrite(DIN,HIGH);&lt;br /&gt;
    else&lt;br /&gt;
      digitalWrite(DIN,LOW);&lt;br /&gt;
 &lt;br /&gt;
    temp=temp&amp;lt;&amp;lt;1; &lt;br /&gt;
 &lt;br /&gt;
    digitalWrite(DCLK,LOW);                &lt;br /&gt;
    nop++;&lt;br /&gt;
    nop++;&lt;br /&gt;
    digitalWrite(DCLK,HIGH);&lt;br /&gt;
    nop++;&lt;br /&gt;
    nop++;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//**********************************************************&lt;br /&gt;
unsigned int ReadFromCharFrom7843()             //SPI Read Data&lt;br /&gt;
{ &lt;br /&gt;
  unsigned nop;&lt;br /&gt;
  unsigned char count=0;&lt;br /&gt;
  unsigned int Num=0;&lt;br /&gt;
  for(count=0;count&amp;lt;12;count++)&lt;br /&gt;
  {&lt;br /&gt;
    Num&amp;lt;&amp;lt;=1;&lt;br /&gt;
    digitalWrite(DCLK,HIGH);//DCLK=1; _nop_();_nop_();_nop_();                &lt;br /&gt;
    nop++;&lt;br /&gt;
    digitalWrite(DCLK,LOW);//DCLK=0; _nop_();_nop_();_nop_();&lt;br /&gt;
    nop++;&lt;br /&gt;
    if(digitalRead(DOUT)) Num++;&lt;br /&gt;
  }&lt;br /&gt;
  return(Num);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
void LCD_Writ_Bus(char VH,char VL)   &lt;br /&gt;
{   &lt;br /&gt;
  PORTD = VH;&lt;br /&gt;
  digitalWrite(LCD_WR,LOW);&lt;br /&gt;
  digitalWrite(LCD_WR,HIGH);&lt;br /&gt;
  PORTD = VL;&lt;br /&gt;
  digitalWrite(LCD_WR,LOW);&lt;br /&gt;
  digitalWrite(LCD_WR,HIGH);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
void LCD_Write_COM(char VH,char VL)  &lt;br /&gt;
{   &lt;br /&gt;
  digitalWrite(LCD_RS,LOW);&lt;br /&gt;
  LCD_Writ_Bus(VH,VL);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
void LCD_Write_DATA(char VH,char VL)    &lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(LCD_RS,HIGH);&lt;br /&gt;
  LCD_Writ_Bus(VH,VL);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void Lcd_Write_Com_Data(int com,int val)&lt;br /&gt;
{&lt;br /&gt;
    LCD_Write_COM(com&amp;gt;&amp;gt;8,com);&lt;br /&gt;
    LCD_Write_DATA(val&amp;gt;&amp;gt;8,val);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void Address_set(unsigned int x1,unsigned int y1,unsigned int x2,unsigned int y2)&lt;br /&gt;
{&lt;br /&gt;
  LCD_Write_COM(0x00,0x46);LCD_Write_DATA(x2,x1);	  &lt;br /&gt;
  LCD_Write_COM(0x00,0x47);LCD_Write_DATA(y2&amp;gt;&amp;gt;8,y2);  &lt;br /&gt;
  LCD_Write_COM(0x00,0x48);LCD_Write_DATA(y1&amp;gt;&amp;gt;8,y1);&lt;br /&gt;
  LCD_Write_COM(0x00,0x20);LCD_Write_DATA(x1&amp;gt;&amp;gt;8,x1);	  &lt;br /&gt;
  LCD_Write_COM(0x00,0x21);LCD_Write_DATA(y1&amp;gt;&amp;gt;8,y1); &lt;br /&gt;
  LCD_Write_COM(0x00,0x22);		         				 &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void LCD_Init(void)&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
  digitalWrite(LCD_REST,HIGH);&lt;br /&gt;
  delay(5); &lt;br /&gt;
  digitalWrite(LCD_REST,LOW);&lt;br /&gt;
  delay(5);&lt;br /&gt;
  digitalWrite(LCD_REST,HIGH);&lt;br /&gt;
  delay(5);&lt;br /&gt;
 &lt;br /&gt;
  digitalWrite(LCD_CS,LOW);  &lt;br /&gt;
        Lcd_Write_Com_Data(0x11,0x2004);		&lt;br /&gt;
        Lcd_Write_Com_Data(0x13,0xCC00);		&lt;br /&gt;
        Lcd_Write_Com_Data(0x15,0x2600);	&lt;br /&gt;
	Lcd_Write_Com_Data(0x14,0x252A);			&lt;br /&gt;
	Lcd_Write_Com_Data(0x12,0x0033);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x13,0xCC04);		&lt;br /&gt;
	delay(1); &lt;br /&gt;
	Lcd_Write_Com_Data(0x13,0xCC06);		&lt;br /&gt;
	delay(1); &lt;br /&gt;
	Lcd_Write_Com_Data(0x13,0xCC4F);		&lt;br /&gt;
	delay(1); &lt;br /&gt;
	Lcd_Write_Com_Data(0x13,0x674F);&lt;br /&gt;
	Lcd_Write_Com_Data(0x11,0x2003);&lt;br /&gt;
	delay(1); 	&lt;br /&gt;
	Lcd_Write_Com_Data(0x30,0x2609);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x31,0x242C);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x32,0x1F23);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x33,0x2425);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x34,0x2226);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x35,0x2523);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x36,0x1C1A);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x37,0x131D);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x38,0x0B11);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x39,0x1210);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x3A,0x1315);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x3B,0x3619);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x3C,0x0D00);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x3D,0x000D);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x16,0x0007);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x02,0x0013);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x03,0x0003);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x01,0x0127);		&lt;br /&gt;
	delay(1); &lt;br /&gt;
	Lcd_Write_Com_Data(0x08,0x0303);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x0A,0x000B);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x0B,0x0003);   &lt;br /&gt;
	Lcd_Write_Com_Data(0x0C,0x0000);   &lt;br /&gt;
	Lcd_Write_Com_Data(0x41,0x0000);    &lt;br /&gt;
	Lcd_Write_Com_Data(0x50,0x0000);   &lt;br /&gt;
	Lcd_Write_Com_Data(0x60,0x0005);    &lt;br /&gt;
        Lcd_Write_Com_Data(0x70,0x000B);    &lt;br /&gt;
	Lcd_Write_Com_Data(0x71,0x0000);    &lt;br /&gt;
	Lcd_Write_Com_Data(0x78,0x0000);    &lt;br /&gt;
	Lcd_Write_Com_Data(0x7A,0x0000);   &lt;br /&gt;
	Lcd_Write_Com_Data(0x79,0x0007);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x07,0x0051);   &lt;br /&gt;
	delay(1); 	&lt;br /&gt;
	Lcd_Write_Com_Data(0x07,0x0053);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x79,0x0000);&lt;br /&gt;
 &lt;br /&gt;
	LCD_Write_COM(0x00,0x22);&lt;br /&gt;
  digitalWrite(LCD_CS,HIGH);  &lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void Pant(char VH,char VL)&lt;br /&gt;
{&lt;br /&gt;
  int i,j;&lt;br /&gt;
  Address_set(0,0,240,320);&lt;br /&gt;
  for(i=0;i&amp;lt;=320;i++)&lt;br /&gt;
  {&lt;br /&gt;
    for (j=0;j&amp;lt;=240;j++)&lt;br /&gt;
    {&lt;br /&gt;
      LCD_Write_DATA(VH,VL);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void digi(int z3)&lt;br /&gt;
{&lt;br /&gt;
  unsigned char p;&lt;br /&gt;
  int x2, y2, z2, i,h2=1000;&lt;br /&gt;
  digitalWrite(LCD_CS,LOW); &lt;br /&gt;
  for(i=0;i&amp;lt;3;i++)&lt;br /&gt;
  {&lt;br /&gt;
  y2=y3;&lt;br /&gt;
  x2=x3+(10*i);&lt;br /&gt;
  Address_set(x2+6,y2-15,x2+7,y2);&lt;br /&gt;
  for(p=0; p&amp;lt;32; p++)  LCD_Write_DATA(0xFF,0xFF);&lt;br /&gt;
  Address_set(x2,y2-15,x2+7,y2-14);&lt;br /&gt;
  for(p=0; p&amp;lt;16; p++)  LCD_Write_DATA(0xFF,0xFF);&lt;br /&gt;
  Address_set(x2,y2-1,x2+7,y2);&lt;br /&gt;
  for(p=0; p&amp;lt;16; p++)  LCD_Write_DATA(0xFF,0xFF);&lt;br /&gt;
  Address_set(x2,y2-8,x2+7,y2-7);&lt;br /&gt;
  for(p=0; p&amp;lt;16; p++)  LCD_Write_DATA(0xFF,0xFF);&lt;br /&gt;
  Address_set(x2,y2-15,x2+1,y2);&lt;br /&gt;
  for(p=0; p&amp;lt;32; p++)  LCD_Write_DATA(0xFF,0xFF);&lt;br /&gt;
 &lt;br /&gt;
    h2=h2/10;&lt;br /&gt;
    z2=z3/h2; &lt;br /&gt;
    z3=z3-z2*h2;&lt;br /&gt;
    if (z2==0)  {&lt;br /&gt;
      Address_set(x2+2,y2-8,x2+5,y2-7);&lt;br /&gt;
      for(p=0; p&amp;lt;8; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
    }&lt;br /&gt;
    if (z2==1)  {&lt;br /&gt;
      Address_set(x2,y2-15,x2+5,y2);&lt;br /&gt;
      for(p=0; p&amp;lt;96; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
    }&lt;br /&gt;
   if (z2==2)  {&lt;br /&gt;
      Address_set(x2,y2-13,x2+1,y2-9);&lt;br /&gt;
      for(p=0; p&amp;lt;10; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
      Address_set(x2+6,y2-6,x2+7,y2-2);&lt;br /&gt;
      for(p=0; p&amp;lt;10; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
    }&lt;br /&gt;
   if (z2==3)  {&lt;br /&gt;
      Address_set(x2,y2-13,x2+1,y2-9);&lt;br /&gt;
      for(p=0; p&amp;lt;10; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
      Address_set(x2,y2-6,x2+1,y2-2);&lt;br /&gt;
      for(p=0; p&amp;lt;10; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
    }&lt;br /&gt;
   if (z2==4)  {&lt;br /&gt;
      Address_set(x2,y2-6,x2+5,y2);&lt;br /&gt;
      for(p=0; p&amp;lt;42; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
      Address_set(x2+2,y2-15,x2+5,y2-14);&lt;br /&gt;
      for(p=0; p&amp;lt;8; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
    }&lt;br /&gt;
   if (z2==5)  {&lt;br /&gt;
      Address_set(x2+6,y2-13,x2+7,y2-9);&lt;br /&gt;
      for(p=0; p&amp;lt;10; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
     Address_set(x2,y2-6,x2+1,y2-2);&lt;br /&gt;
      for(p=0; p&amp;lt;10; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
    }&lt;br /&gt;
   if (z2==6)  {&lt;br /&gt;
      Address_set(x2+6,y2-13,x2+7,y2-9);&lt;br /&gt;
      for(p=0; p&amp;lt;10; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
    }&lt;br /&gt;
   if (z2==7)  {&lt;br /&gt;
      Address_set(x2,y2-13,x2+5,y2);&lt;br /&gt;
      for(p=0; p&amp;lt;84; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
    }&lt;br /&gt;
   if (z2==9)  {&lt;br /&gt;
      Address_set(x2,y2-6,x2+1,y2-2);&lt;br /&gt;
      for(p=0; p&amp;lt;10; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(LCD_CS,HIGH); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void newpa(void)&lt;br /&gt;
{&lt;br /&gt;
  unsigned char p;&lt;br /&gt;
  digitalWrite(LCD_CS,LOW); &lt;br /&gt;
  Pant(0x00,0x00);   &lt;br /&gt;
&lt;br /&gt;
  Address_set(0,319,240,319);&lt;br /&gt;
  for(p=0; p&amp;lt;240; p++)  LCD_Write_DATA(0xF8,0x00);&lt;br /&gt;
  Address_set(0,0,240,0);&lt;br /&gt;
  for(p=0; p&amp;lt;240; p++)  LCD_Write_DATA(0xFF,0xFF);&lt;br /&gt;
  Address_set(0,300,240,300);&lt;br /&gt;
  for(p=0; p&amp;lt;240; p++)  LCD_Write_DATA(0xFF,0xFF);&lt;br /&gt;
  Address_set(0,0,0,255);&lt;br /&gt;
  for(p=0; p&amp;lt;255; p++)  LCD_Write_DATA(0xF8,0x00);&lt;br /&gt;
  Address_set(0,255,0,300);&lt;br /&gt;
  for(p=0; p&amp;lt;45; p++)  LCD_Write_DATA(0xF8,0x00);&lt;br /&gt;
  Address_set(239,0,239,255);&lt;br /&gt;
  for(p=0; p&amp;lt;255; p++)  LCD_Write_DATA(0xF8,0x00);&lt;br /&gt;
  Address_set(239,255,239,300);&lt;br /&gt;
  for(p=0; p&amp;lt;45; p++)  LCD_Write_DATA(0xF8,0x00);&lt;br /&gt;
Address_set(50,308,59,311);&lt;br /&gt;
  for(p=0; p&amp;lt;40; p++)  LCD_Write_DATA(0x07,0xE0);&lt;br /&gt;
Address_set(53,305,56,314);&lt;br /&gt;
  for(p=0; p&amp;lt;40; p++)  LCD_Write_DATA(0x07,0xE0);&lt;br /&gt;
Address_set(215,305,239,314);&lt;br /&gt;
  for(p=0; p&amp;lt;250; p++)  LCD_Write_DATA(0xF8,0x00);&lt;br /&gt;
 digitalWrite(LCD_CS,HIGH); &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
 void recan(void)&lt;br /&gt;
{&lt;br /&gt;
  int i,j;&lt;br /&gt;
//  unsigned int m;&lt;br /&gt;
 digitalWrite(LCD_CS,LOW); &lt;br /&gt;
  for(i=0;i&amp;lt;7;i++)&lt;br /&gt;
  {&lt;br /&gt;
//    m=i*3;&lt;br /&gt;
    Address_set(i*5,305,i*5+3,314);&lt;br /&gt;
    for(j=0; j&amp;lt;40; j++)&lt;br /&gt;
    {&lt;br /&gt;
      if (1+i*2&amp;lt;= k) LCD_Write_DATA(0xFF,0xE0); else LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
Address_set(100,305,124,314);&lt;br /&gt;
  for(i=0; i&amp;lt;250; i++)  LCD_Write_DATA(vh2,vl2);&lt;br /&gt;
Address_set(125,305,149,314);&lt;br /&gt;
  for(i=0; i&amp;lt;250; i++)  LCD_Write_DATA(vh2,vl2);&lt;br /&gt;
 digitalWrite(LCD_CS,HIGH); &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
void AD7843(void)              &lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(CS,LOW);                    &lt;br /&gt;
  WriteCharTo7843(0x90);        &lt;br /&gt;
  digitalWrite(DCLK,HIGH);&lt;br /&gt;
  digitalWrite(DCLK,LOW); &lt;br /&gt;
  TP_Y=ReadFromCharFrom7843();&lt;br /&gt;
  WriteCharTo7843(0xD0);      &lt;br /&gt;
  digitalWrite(DCLK,HIGH);&lt;br /&gt;
  digitalWrite(DCLK,LOW);&lt;br /&gt;
  TP_X=ReadFromCharFrom7843();&lt;br /&gt;
  digitalWrite(CS,HIGH);&lt;br /&gt;
 &lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void setup()&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
  unsigned char p;&lt;br /&gt;
&lt;br /&gt;
  for(p=0;p&amp;lt;20;p++)&lt;br /&gt;
  {&lt;br /&gt;
    pinMode(p,OUTPUT);&lt;br /&gt;
  }&lt;br /&gt;
  pinMode(DOUT,INPUT);&lt;br /&gt;
      x0=1;&lt;br /&gt;
      y0=1;&lt;br /&gt;
 &lt;br /&gt;
  LCD_Init();  &lt;br /&gt;
  newpa();&lt;br /&gt;
  recan();&lt;br /&gt;
  digi(vh2);&lt;br /&gt;
  x3=x3+90;&lt;br /&gt;
  digi(vl2);&lt;br /&gt;
  spistar();  &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void loop()&lt;br /&gt;
{  &lt;br /&gt;
  rx=0;&lt;br /&gt;
  ry=0;&lt;br /&gt;
   &lt;br /&gt;
  for(l3=0;l3&amp;lt;8;l3++)&lt;br /&gt;
    {&lt;br /&gt;
      AD7843();&lt;br /&gt;
&lt;br /&gt;
      lx=0;&lt;br /&gt;
      ly=-1*TP_Y;&lt;br /&gt;
      ly=4095+ly;&lt;br /&gt;
      if(ly &amp;gt; 0) lx=1*TP_X; else {lx=0;ly=0;rx=0;ry=0;l3=9; }&lt;br /&gt;
      rx=rx+lx;&lt;br /&gt;
      ry=ry+ly;&lt;br /&gt;
    }&lt;br /&gt;
      lx=(rx/8-180)/15;&lt;br /&gt;
      ly=(ry/8-240)/11;&lt;br /&gt;
      if(ly &amp;lt; 1) {lx=0;ly=0; }&lt;br /&gt;
      if(lx &amp;lt; 1) lx=0;&lt;br /&gt;
 &lt;br /&gt;
      if(ly &amp;gt; 309-k)&lt;br /&gt;
      {&lt;br /&gt;
        ly=0;&lt;br /&gt;
        if(lx &amp;gt; 200) k=k-2; else if (lx &amp;gt; 160) k=k+2;else&lt;br /&gt;
            if (lx &amp;gt; 100) vh2++; else if (lx &amp;gt; 40) vl2++; else newpa();&lt;br /&gt;
        lx=0;&lt;br /&gt;
        if (k&amp;lt;1) k=1;&lt;br /&gt;
        if (k&amp;gt;13) k=13;&lt;br /&gt;
        if (vh2&amp;gt;255) vh2=0;&lt;br /&gt;
        if (vl2&amp;gt;255) vl2=0;&lt;br /&gt;
        x3=65;&lt;br /&gt;
        digi(vh2);&lt;br /&gt;
        x3=x3+90;&lt;br /&gt;
        digi(vl2);&lt;br /&gt;
        recan();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if(ly &amp;gt; 299-k) ly=299-k;&lt;br /&gt;
      if(ly &amp;gt; 0)&lt;br /&gt;
      {&lt;br /&gt;
        x0=240-lx;&lt;br /&gt;
        if(x0 &amp;gt; 240-k) x0=240-k;&lt;br /&gt;
        y0=ly;&lt;br /&gt;
        l2=(k+1)*(k+1);&lt;br /&gt;
        digitalWrite(LCD_CS,LOW); &lt;br /&gt;
        Address_set(x0,y0,x0+k,y0+k);&lt;br /&gt;
        for (l3=0; l3&amp;lt;l2; l3++) LCD_Write_DATA(vh2,vl2);&lt;br /&gt;
        digitalWrite(LCD_CS,HIGH); &lt;br /&gt;
    }&lt;br /&gt;
    delay (50);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Derivate==&lt;br /&gt;
Es gibt viele Derivate die auf dem Arduino basieren, weil&lt;br /&gt;
* Alle Layouts quelloffen im Internet stehen&lt;br /&gt;
* Der Bootloader sowohl als Quellocde und schon compillert zum Download im Internet stehen&lt;br /&gt;
*Man die IDE für alle Atmel-Chips verwenden kann, die einen Arduino-Bootloader besitzen&lt;br /&gt;
*Man auch eine Arduino-Derivat auf dem Steckbrett zusammbauen kann  &lt;br /&gt;
&lt;br /&gt;
==Tutorial==&lt;br /&gt;
===Ein erster Sketch: Blinkende LED===&lt;br /&gt;
Die meisten aktuellen Arduino-Boards habe einen fest verlötete&lt;br /&gt;
SMD-LED, welche an Pin 13 angeschloßen ist. Diese LED kann von jedem&lt;br /&gt;
Sketch angesteuert werden. Da diese LED meistens vorhanden ist und immer an Pin 13 ageschloßen ist, ist dieses Programm auf den meisten Boards gleich.&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//Blinkende LED&lt;br /&gt;
void setup() {&lt;br /&gt;
pinMode(13,OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
delay(1000);&lt;br /&gt;
digitalWrite(13,HIGH);&lt;br /&gt;
delay(1000);&lt;br /&gt;
digitalWrite(13,LOW);&lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
* [http://www.arduino.cc/en/Main/Software Download der IDE] &lt;br /&gt;
* [http://www.mikrocontroller.net/articles/AVR Artikel zur AVR Prozessor-Serie]&lt;br /&gt;
&lt;br /&gt;
==Literatur==&lt;br /&gt;
* Erik Bartmann: &#039;&#039;Die elektronische Welt mit Arduino entdecken&#039;&#039;, O&#039;Reilly Verlag, 2011, ISBN 978-3-89721-319-7&lt;br /&gt;
* Thomas Brühlmann: &#039;&#039;Arduino: Praxiseinstieg&#039;&#039;, mitp Verlag, 2010, ISBN 978-3-8266-5605-7&lt;br /&gt;
&lt;br /&gt;
==Bezugsquellen(Auswahl)==&lt;br /&gt;
&lt;br /&gt;
===Offiziele Boards===&lt;br /&gt;
* [http://www.watterott.com/de/Boards-Kits/Arduino Watterott.com] &lt;br /&gt;
* [http://www.reichelt.de/ Reichelt.de]&lt;br /&gt;
* [http://www.conrad.de/ Conrad.de]&lt;br /&gt;
* [http://www.tigal.com/ TIGAL.com]&lt;br /&gt;
&lt;br /&gt;
===Lernpakete===&lt;br /&gt;
* [http://www.franzis.de/ Franzis Verlag(Lernpakete)]&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [http://www.arduino.cc/ Website des Arduino-Projekt] &lt;br /&gt;
* [http://arduino.cc/forum/index.php/board,31.0.html Deutsches Arduino-Forum(offiziel)]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AVR-Boards]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Mknot9</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Arduino&amp;diff=74799</id>
		<title>Arduino</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Arduino&amp;diff=74799"/>
		<updated>2013-03-25T00:18:23Z</updated>

		<summary type="html">&lt;p&gt;Mknot9: /* 8-bit LCD-Shield mit Touch-Controller ohne IRQ-Pin */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
Das Arduino-Projekt ist ein 2006 gestartetes Projekt aus Italien. Arduino&lt;br /&gt;
ist eine Zusammenstellung aus verschiedenen Boards und einer IDE. Die Boards basieren auf der Atmel-AVR Serie. Die einzige ausnahme bildet der Arduino Due, dieser basiert auf einem ARM-Chip von Atmel. Das Gesamt Projekt ist quelloffen,&lt;br /&gt;
also Open-Source. Der Unterschied zu anderen Atmel-Boards sind der Bootloader und die IDE. Der Bootloader wird durch das Arduino-Projekt entwickelt und ist für die einzelnen Boards spezifisch.&lt;br /&gt;
&lt;br /&gt;
==Die IDE==&lt;br /&gt;
Die Arduino-IDE ist eine in JAVA programmierte grafische Obrfläche. Dadurch das sie in JAVA programiert wurde, ist sie plattfomunabhägig und auf Windows, Linux, MacOS X und Solaris verfügbar.&lt;br /&gt;
Die Grafischeoberfläche compiliert die Sketche(so heißt ein Arduino-Programm offiziel) nicht, sondern ruft verschiedene Programme auf. Dies sind in der Regel der Compiler avr-g++(und zugehörige Programme, z.B. ein Linker) und avrdude,&lt;br /&gt;
ein Programm zum übertragen des compilierten Sketch als *.hex File auf den Flashspeicher des Arduino. Die IDE basiert auf der Processing IDE und Wiring.&lt;br /&gt;
&lt;br /&gt;
==Die Boards==&lt;br /&gt;
Die Arduino-Boards sind Atmel AVR/ARM Chips basierende Mikrocontrollerplatinen,&lt;br /&gt;
welche zur Steuerung von I/O-Pins gedacht sind. Im Gegensatz zu anderen Boards sind die Arduino-Boards nicht gedacht um als &amp;quot;Computer&amp;quot; mit Betriebssystem zu dienen, wie etwa der Raspberry Pi, sondern um die I/O Pins zu steuern. Es gibt insgesamt 14 Boards mit 13 - 70 I/O Pins. Die Platinen besitzen meisten ein USB-Aschluß(USB-B bzw. USB-Mini) oder eine Schnitstelle für einen USB-Serial-Konverterchip. Die Platinen mit USB-Anschluß haben einen solchen Chip intigriert,&lt;br /&gt;
meist ein FTDI-Chip bei älteren Boards oder ein 8U2/16U2 bei neueren Boards.Eine Ausnahme bildet hier der Arduino Leonardo: Dieser besitzt einen Atmel-AVR 32U4 Mikrocontroller, welcher auch die Funktionen eines FTDI-Chips besitzt. Es ist also kein weiterer Konverter nötig.&lt;br /&gt;
&lt;br /&gt;
===Arduino Uno===&lt;br /&gt;
Der Arduino Uno R3 ist der Standard-Arduino. In den meisten Anfänger-Bücher und Tutorials wird dieser Arduino verwendet. Auch sind die meisten Libaries für ihn geschrieben. Er ist der neuste der am längsten weiterentwickleten Arduino-Reihe.&lt;br /&gt;
So ist eine frühere Version des Arduino Uno (Arduino USB) das Board gewesen, welches als erstes &#039;&#039;Arduino&#039;&#039; gennant wurde. In der aktuellen Revision (Version) 3 besitzt der Uno 14 Digitale I/O Pins sowie 6 analoge Eingänge. Er wird bei 5V betrieben und besitzt folgende Speicherkapazitäten:&lt;br /&gt;
* 32K Flash(0,5 werden vom Bootloader verwendet.)&lt;br /&gt;
* 2K SRAM&lt;br /&gt;
* 1K EEPROM&lt;br /&gt;
* 16 MHz (Prozessortakt)&lt;br /&gt;
Neben dem USB-B Anschluß verfügt der Uno noch über folgende Anschlüsse:&lt;br /&gt;
* Klinkenbuchse (2.1mm , 6-20 V möglich)&lt;br /&gt;
* SPI&lt;br /&gt;
* I²C&lt;br /&gt;
* ICSP&lt;br /&gt;
&lt;br /&gt;
====Arduino Duemilanove====&lt;br /&gt;
Der Arduino Duemilanove ist der Vorgänger des Arduino Uno. Er besitzt den&lt;br /&gt;
ATmega168 (seit 2009 328p) statt dem 328 wie beim Uno. Als Konverter verwendet der Duemilianove eine FTDI-Chip anstelle eines 16U2. Sonst ist von der Pin anzahlen und den Maßen des Boards identisch mit denen des Uno.&lt;br /&gt;
&lt;br /&gt;
====Arduino Diecimila====&lt;br /&gt;
====Arduino NG====&lt;br /&gt;
====Arduino Usb====&lt;br /&gt;
&lt;br /&gt;
===Arduino Mega===&lt;br /&gt;
====Arduino Mega ADK====&lt;br /&gt;
===Arduino Due===&lt;br /&gt;
&lt;br /&gt;
===Arduino Ethernet===&lt;br /&gt;
===Arduino LilyPad===&lt;br /&gt;
===Arduino Leonardo===  &lt;br /&gt;
===Arduino Nano===&lt;br /&gt;
===Arduino Micro===&lt;br /&gt;
===Arduino Fio===&lt;br /&gt;
===Arduino Pro Mini===&lt;br /&gt;
====Arduino Mini====&lt;br /&gt;
===Arduino Pro===&lt;br /&gt;
&lt;br /&gt;
==Shields(Erweiterungsplatinen)==&lt;br /&gt;
Sogennante Shields sind Erweiterungsplatinen, die die Funktionen eines Arduino-Boards um neue Funktionen erweitern. So gibt es z.B. Shields die den Arduino um eine Ethernet-Schnittstelle erweitern, einen VGA-Aschluß besitzen oder einfach leere Platinen sind, auf die eine Chip eingesetzt werden kann, ohne zu Löten. Für das letztere Bsp. wäre eine solche Platine die XBEE-Antenne.&lt;br /&gt;
&lt;br /&gt;
===8-bit LCD-Shield mit Touch-Controller ohne IRQ-Pin===&lt;br /&gt;
&lt;br /&gt;
Seit ca. Herbst 2012 werden einige LCD-Shields mit Touch-Controller angeboten, die den IRQ-Pin nicht mehr durchschleifen.&lt;br /&gt;
&lt;br /&gt;
Damit läuft auch die U-Touch Bibliothek von Henning Carlsen nicht mehr. Alle Sample-Codes im Web funktionieren auch nicht. Das Problem besteht darin herauszufinden, an welchen Arduino-Pin die das CS-Signal geleitet wird. Hier hilft nur Sheets studieren.&lt;br /&gt;
&lt;br /&gt;
Bei mir lief schließlich folgender Code:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#define LCD_RS   19         &lt;br /&gt;
#define LCD_WR   18     &lt;br /&gt;
#define LCD_CS   17       &lt;br /&gt;
#define LCD_REST 16&lt;br /&gt;
&lt;br /&gt;
#define DCLK     15&lt;br /&gt;
#define DIN      14 &lt;br /&gt;
#define CS       10  &lt;br /&gt;
#define DOUT     8&lt;br /&gt;
//#define IRQ      7    &lt;br /&gt;
 &lt;br /&gt;
unsigned int TP_X,TP_Y,x0,y0;    &lt;br /&gt;
unsigned int l3=0;&lt;br /&gt;
int lx,ly, l2, ry,rx,x3=65,y3=318;&lt;br /&gt;
int  k=3, vh2=0x84,vl2=0xFF;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
void spistar()                                     //SPI Start&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(CS,LOW);&lt;br /&gt;
  digitalWrite(DCLK,HIGH);&lt;br /&gt;
  digitalWrite(DIN,HIGH);&lt;br /&gt;
  digitalWrite(DCLK,HIGH);&lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
//**********************************************************&lt;br /&gt;
void WriteCharTo7843(unsigned char num)          //SPI Write Data&lt;br /&gt;
{&lt;br /&gt;
  unsigned char count=0;&lt;br /&gt;
  unsigned char temp;&lt;br /&gt;
  unsigned nop;&lt;br /&gt;
  temp=num;&lt;br /&gt;
  digitalWrite(DCLK,LOW);&lt;br /&gt;
  for(count=0;count&amp;lt;8;count++)&lt;br /&gt;
  {&lt;br /&gt;
    if(temp&amp;amp;0x80)&lt;br /&gt;
      digitalWrite(DIN,HIGH);&lt;br /&gt;
    else&lt;br /&gt;
      digitalWrite(DIN,LOW);&lt;br /&gt;
 &lt;br /&gt;
    temp=temp&amp;lt;&amp;lt;1; &lt;br /&gt;
 &lt;br /&gt;
    digitalWrite(DCLK,LOW);                &lt;br /&gt;
    nop++;&lt;br /&gt;
    nop++;&lt;br /&gt;
    digitalWrite(DCLK,HIGH);&lt;br /&gt;
    nop++;&lt;br /&gt;
    nop++;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//**********************************************************&lt;br /&gt;
unsigned int ReadFromCharFrom7843()             //SPI Read Data&lt;br /&gt;
{ &lt;br /&gt;
  unsigned nop;&lt;br /&gt;
  unsigned char count=0;&lt;br /&gt;
  unsigned int Num=0;&lt;br /&gt;
  for(count=0;count&amp;lt;12;count++)&lt;br /&gt;
  {&lt;br /&gt;
    Num&amp;lt;&amp;lt;=1;&lt;br /&gt;
    digitalWrite(DCLK,HIGH);//DCLK=1; _nop_();_nop_();_nop_();                &lt;br /&gt;
    nop++;&lt;br /&gt;
    digitalWrite(DCLK,LOW);//DCLK=0; _nop_();_nop_();_nop_();&lt;br /&gt;
    nop++;&lt;br /&gt;
    if(digitalRead(DOUT)) Num++;&lt;br /&gt;
  }&lt;br /&gt;
  return(Num);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
void LCD_Writ_Bus(char VH,char VL)   &lt;br /&gt;
{   &lt;br /&gt;
  PORTD = VH;&lt;br /&gt;
  digitalWrite(LCD_WR,LOW);&lt;br /&gt;
  digitalWrite(LCD_WR,HIGH);&lt;br /&gt;
  PORTD = VL;&lt;br /&gt;
  digitalWrite(LCD_WR,LOW);&lt;br /&gt;
  digitalWrite(LCD_WR,HIGH);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
void LCD_Write_COM(char VH,char VL)  &lt;br /&gt;
{   &lt;br /&gt;
  digitalWrite(LCD_RS,LOW);&lt;br /&gt;
  LCD_Writ_Bus(VH,VL);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
void LCD_Write_DATA(char VH,char VL)    &lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(LCD_RS,HIGH);&lt;br /&gt;
  LCD_Writ_Bus(VH,VL);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void Lcd_Write_Com_Data(int com,int val)&lt;br /&gt;
{&lt;br /&gt;
    LCD_Write_COM(com&amp;gt;&amp;gt;8,com);&lt;br /&gt;
    LCD_Write_DATA(val&amp;gt;&amp;gt;8,val);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void Address_set(unsigned int x1,unsigned int y1,unsigned int x2,unsigned int y2)&lt;br /&gt;
{&lt;br /&gt;
  LCD_Write_COM(0x00,0x46);LCD_Write_DATA(x2,x1);	  &lt;br /&gt;
  LCD_Write_COM(0x00,0x47);LCD_Write_DATA(y2&amp;gt;&amp;gt;8,y2);  &lt;br /&gt;
  LCD_Write_COM(0x00,0x48);LCD_Write_DATA(y1&amp;gt;&amp;gt;8,y1);&lt;br /&gt;
  LCD_Write_COM(0x00,0x20);LCD_Write_DATA(x1&amp;gt;&amp;gt;8,x1);	  &lt;br /&gt;
  LCD_Write_COM(0x00,0x21);LCD_Write_DATA(y1&amp;gt;&amp;gt;8,y1); &lt;br /&gt;
  LCD_Write_COM(0x00,0x22);		         				 &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void LCD_Init(void)&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
  digitalWrite(LCD_REST,HIGH);&lt;br /&gt;
  delay(5); &lt;br /&gt;
  digitalWrite(LCD_REST,LOW);&lt;br /&gt;
  delay(5);&lt;br /&gt;
  digitalWrite(LCD_REST,HIGH);&lt;br /&gt;
  delay(5);&lt;br /&gt;
 &lt;br /&gt;
  digitalWrite(LCD_CS,LOW);  &lt;br /&gt;
        Lcd_Write_Com_Data(0x11,0x2004);		&lt;br /&gt;
        Lcd_Write_Com_Data(0x13,0xCC00);		&lt;br /&gt;
        Lcd_Write_Com_Data(0x15,0x2600);	&lt;br /&gt;
	Lcd_Write_Com_Data(0x14,0x252A);			&lt;br /&gt;
	Lcd_Write_Com_Data(0x12,0x0033);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x13,0xCC04);		&lt;br /&gt;
	delay(1); &lt;br /&gt;
	Lcd_Write_Com_Data(0x13,0xCC06);		&lt;br /&gt;
	delay(1); &lt;br /&gt;
	Lcd_Write_Com_Data(0x13,0xCC4F);		&lt;br /&gt;
	delay(1); &lt;br /&gt;
	Lcd_Write_Com_Data(0x13,0x674F);&lt;br /&gt;
	Lcd_Write_Com_Data(0x11,0x2003);&lt;br /&gt;
	delay(1); 	&lt;br /&gt;
	Lcd_Write_Com_Data(0x30,0x2609);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x31,0x242C);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x32,0x1F23);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x33,0x2425);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x34,0x2226);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x35,0x2523);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x36,0x1C1A);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x37,0x131D);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x38,0x0B11);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x39,0x1210);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x3A,0x1315);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x3B,0x3619);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x3C,0x0D00);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x3D,0x000D);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x16,0x0007);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x02,0x0013);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x03,0x0003);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x01,0x0127);		&lt;br /&gt;
	delay(1); &lt;br /&gt;
	Lcd_Write_Com_Data(0x08,0x0303);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x0A,0x000B);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x0B,0x0003);   &lt;br /&gt;
	Lcd_Write_Com_Data(0x0C,0x0000);   &lt;br /&gt;
	Lcd_Write_Com_Data(0x41,0x0000);    &lt;br /&gt;
	Lcd_Write_Com_Data(0x50,0x0000);   &lt;br /&gt;
	Lcd_Write_Com_Data(0x60,0x0005);    &lt;br /&gt;
        Lcd_Write_Com_Data(0x70,0x000B);    &lt;br /&gt;
	Lcd_Write_Com_Data(0x71,0x0000);    &lt;br /&gt;
	Lcd_Write_Com_Data(0x78,0x0000);    &lt;br /&gt;
	Lcd_Write_Com_Data(0x7A,0x0000);   &lt;br /&gt;
	Lcd_Write_Com_Data(0x79,0x0007);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x07,0x0051);   &lt;br /&gt;
	delay(1); 	&lt;br /&gt;
	Lcd_Write_Com_Data(0x07,0x0053);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x79,0x0000);&lt;br /&gt;
 &lt;br /&gt;
	LCD_Write_COM(0x00,0x22);&lt;br /&gt;
  digitalWrite(LCD_CS,HIGH);  &lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void Pant(char VH,char VL)&lt;br /&gt;
{&lt;br /&gt;
  int i,j;&lt;br /&gt;
  Address_set(0,0,240,320);&lt;br /&gt;
  for(i=0;i&amp;lt;=320;i++)&lt;br /&gt;
  {&lt;br /&gt;
    for (j=0;j&amp;lt;=240;j++)&lt;br /&gt;
    {&lt;br /&gt;
      LCD_Write_DATA(VH,VL);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void digi(int z3)&lt;br /&gt;
{&lt;br /&gt;
  unsigned char p;&lt;br /&gt;
  int x2, y2, z2, i,h2=1000;&lt;br /&gt;
  digitalWrite(LCD_CS,LOW); &lt;br /&gt;
  for(i=0;i&amp;lt;3;i++)&lt;br /&gt;
  {&lt;br /&gt;
  y2=y3;&lt;br /&gt;
  x2=x3+(10*i);&lt;br /&gt;
  Address_set(x2+6,y2-15,x2+7,y2);&lt;br /&gt;
  for(p=0; p&amp;lt;32; p++)  LCD_Write_DATA(0xFF,0xFF);&lt;br /&gt;
  Address_set(x2,y2-15,x2+7,y2-14);&lt;br /&gt;
  for(p=0; p&amp;lt;16; p++)  LCD_Write_DATA(0xFF,0xFF);&lt;br /&gt;
  Address_set(x2,y2-1,x2+7,y2);&lt;br /&gt;
  for(p=0; p&amp;lt;16; p++)  LCD_Write_DATA(0xFF,0xFF);&lt;br /&gt;
  Address_set(x2,y2-8,x2+7,y2-7);&lt;br /&gt;
  for(p=0; p&amp;lt;16; p++)  LCD_Write_DATA(0xFF,0xFF);&lt;br /&gt;
  Address_set(x2,y2-15,x2+1,y2);&lt;br /&gt;
  for(p=0; p&amp;lt;32; p++)  LCD_Write_DATA(0xFF,0xFF);&lt;br /&gt;
 &lt;br /&gt;
    h2=h2/10;&lt;br /&gt;
    z2=z3/h2; &lt;br /&gt;
    z3=z3-z2*h2;&lt;br /&gt;
    if (z2==0)  {&lt;br /&gt;
      Address_set(x2+2,y2-8,x2+5,y2-7);&lt;br /&gt;
      for(p=0; p&amp;lt;8; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
    }&lt;br /&gt;
    if (z2==1)  {&lt;br /&gt;
      Address_set(x2,y2-15,x2+5,y2);&lt;br /&gt;
      for(p=0; p&amp;lt;96; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
    }&lt;br /&gt;
   if (z2==2)  {&lt;br /&gt;
      Address_set(x2,y2-13,x2+1,y2-9);&lt;br /&gt;
      for(p=0; p&amp;lt;10; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
      Address_set(x2+6,y2-6,x2+7,y2-2);&lt;br /&gt;
      for(p=0; p&amp;lt;10; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
    }&lt;br /&gt;
   if (z2==3)  {&lt;br /&gt;
      Address_set(x2,y2-13,x2+1,y2-9);&lt;br /&gt;
      for(p=0; p&amp;lt;10; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
      Address_set(x2,y2-6,x2+1,y2-2);&lt;br /&gt;
      for(p=0; p&amp;lt;10; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
    }&lt;br /&gt;
   if (z2==4)  {&lt;br /&gt;
      Address_set(x2,y2-6,x2+5,y2);&lt;br /&gt;
      for(p=0; p&amp;lt;42; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
      Address_set(x2+2,y2-15,x2+5,y2-14);&lt;br /&gt;
      for(p=0; p&amp;lt;8; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
    }&lt;br /&gt;
   if (z2==5)  {&lt;br /&gt;
      Address_set(x2+6,y2-13,x2+7,y2-9);&lt;br /&gt;
      for(p=0; p&amp;lt;10; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
     Address_set(x2,y2-6,x2+1,y2-2);&lt;br /&gt;
      for(p=0; p&amp;lt;10; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
    }&lt;br /&gt;
   if (z2==6)  {&lt;br /&gt;
      Address_set(x2+6,y2-13,x2+7,y2-9);&lt;br /&gt;
      for(p=0; p&amp;lt;10; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
    }&lt;br /&gt;
   if (z2==7)  {&lt;br /&gt;
      Address_set(x2,y2-13,x2+5,y2);&lt;br /&gt;
      for(p=0; p&amp;lt;84; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
    }&lt;br /&gt;
   if (z2==9)  {&lt;br /&gt;
      Address_set(x2,y2-6,x2+1,y2-2);&lt;br /&gt;
      for(p=0; p&amp;lt;10; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(LCD_CS,HIGH); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void newpa(void)&lt;br /&gt;
{&lt;br /&gt;
  unsigned char p;&lt;br /&gt;
  digitalWrite(LCD_CS,LOW); &lt;br /&gt;
  Pant(0x00,0x00);   &lt;br /&gt;
&lt;br /&gt;
  Address_set(0,319,240,319);&lt;br /&gt;
  for(p=0; p&amp;lt;240; p++)  LCD_Write_DATA(0xF8,0x00);&lt;br /&gt;
  Address_set(0,0,240,0);&lt;br /&gt;
  for(p=0; p&amp;lt;240; p++)  LCD_Write_DATA(0xFF,0xFF);&lt;br /&gt;
  Address_set(0,300,240,300);&lt;br /&gt;
  for(p=0; p&amp;lt;240; p++)  LCD_Write_DATA(0xFF,0xFF);&lt;br /&gt;
  Address_set(0,0,0,255);&lt;br /&gt;
  for(p=0; p&amp;lt;255; p++)  LCD_Write_DATA(0xF8,0x00);&lt;br /&gt;
  Address_set(0,255,0,300);&lt;br /&gt;
  for(p=0; p&amp;lt;45; p++)  LCD_Write_DATA(0xF8,0x00);&lt;br /&gt;
  Address_set(239,0,239,255);&lt;br /&gt;
  for(p=0; p&amp;lt;255; p++)  LCD_Write_DATA(0xF8,0x00);&lt;br /&gt;
  Address_set(239,255,239,300);&lt;br /&gt;
  for(p=0; p&amp;lt;45; p++)  LCD_Write_DATA(0xF8,0x00);&lt;br /&gt;
Address_set(50,308,59,311);&lt;br /&gt;
  for(p=0; p&amp;lt;40; p++)  LCD_Write_DATA(0x07,0xE0);&lt;br /&gt;
Address_set(53,305,56,314);&lt;br /&gt;
  for(p=0; p&amp;lt;40; p++)  LCD_Write_DATA(0x07,0xE0);&lt;br /&gt;
Address_set(215,305,239,314);&lt;br /&gt;
  for(p=0; p&amp;lt;250; p++)  LCD_Write_DATA(0xF8,0x00);&lt;br /&gt;
 digitalWrite(LCD_CS,HIGH); &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
 void recan(void)&lt;br /&gt;
{&lt;br /&gt;
  int i,j;&lt;br /&gt;
//  unsigned int m;&lt;br /&gt;
 digitalWrite(LCD_CS,LOW); &lt;br /&gt;
  for(i=0;i&amp;lt;7;i++)&lt;br /&gt;
  {&lt;br /&gt;
//    m=i*3;&lt;br /&gt;
    Address_set(i*5,305,i*5+3,314);&lt;br /&gt;
    for(j=0; j&amp;lt;40; j++)&lt;br /&gt;
    {&lt;br /&gt;
      if (1+i*2&amp;lt;= k) LCD_Write_DATA(0xFF,0xE0); else LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
Address_set(100,305,124,314);&lt;br /&gt;
  for(i=0; i&amp;lt;250; i++)  LCD_Write_DATA(vh2,vl2);&lt;br /&gt;
Address_set(125,305,149,314);&lt;br /&gt;
  for(i=0; i&amp;lt;250; i++)  LCD_Write_DATA(vh2,vl2);&lt;br /&gt;
 digitalWrite(LCD_CS,HIGH); &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
void AD7843(void)              &lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(CS,LOW);                    &lt;br /&gt;
  WriteCharTo7843(0x90);        &lt;br /&gt;
  digitalWrite(DCLK,HIGH);&lt;br /&gt;
  digitalWrite(DCLK,LOW); &lt;br /&gt;
  TP_Y=ReadFromCharFrom7843();&lt;br /&gt;
  WriteCharTo7843(0xD0);      &lt;br /&gt;
  digitalWrite(DCLK,HIGH);&lt;br /&gt;
  digitalWrite(DCLK,LOW);&lt;br /&gt;
  TP_X=ReadFromCharFrom7843();&lt;br /&gt;
  digitalWrite(CS,HIGH);&lt;br /&gt;
 &lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void setup()&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
  unsigned char p;&lt;br /&gt;
&lt;br /&gt;
  for(p=0;p&amp;lt;20;p++)&lt;br /&gt;
  {&lt;br /&gt;
    pinMode(p,OUTPUT);&lt;br /&gt;
  }&lt;br /&gt;
  pinMode(DOUT,INPUT);&lt;br /&gt;
      x0=1;&lt;br /&gt;
      y0=1;&lt;br /&gt;
 &lt;br /&gt;
  LCD_Init();  &lt;br /&gt;
  newpa();&lt;br /&gt;
  recan();&lt;br /&gt;
  digi(vh2);&lt;br /&gt;
  x3=x3+90;&lt;br /&gt;
  digi(vl2);&lt;br /&gt;
  spistar();  &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void loop()&lt;br /&gt;
{  &lt;br /&gt;
  rx=0;&lt;br /&gt;
  ry=0;&lt;br /&gt;
   &lt;br /&gt;
  for(l3=0;l3&amp;lt;8;l3++)&lt;br /&gt;
    {&lt;br /&gt;
      AD7843();&lt;br /&gt;
&lt;br /&gt;
      lx=0;&lt;br /&gt;
      ly=-1*TP_Y;&lt;br /&gt;
      ly=4095+ly;&lt;br /&gt;
      if(ly &amp;gt; 0) lx=1*TP_X; else {lx=0;ly=0;rx=0;ry=0;l3=9; }&lt;br /&gt;
      rx=rx+lx;&lt;br /&gt;
      ry=ry+ly;&lt;br /&gt;
    }&lt;br /&gt;
      lx=(rx/8-180)/15;&lt;br /&gt;
      ly=(ry/8-240)/11;&lt;br /&gt;
      if(ly &amp;lt; 1) {lx=0;ly=0; }&lt;br /&gt;
      if(lx &amp;lt; 1) lx=0;&lt;br /&gt;
 &lt;br /&gt;
      if(ly &amp;gt; 309-k)&lt;br /&gt;
      {&lt;br /&gt;
        ly=0;&lt;br /&gt;
        if(lx &amp;gt; 200) k=k-2; else if (lx &amp;gt; 160) k=k+2;else&lt;br /&gt;
            if (lx &amp;gt; 100) vh2++; else if (lx &amp;gt; 40) vl2++; else newpa();&lt;br /&gt;
        lx=0;&lt;br /&gt;
        if (k&amp;lt;1) k=1;&lt;br /&gt;
        if (k&amp;gt;13) k=13;&lt;br /&gt;
        if (vh2&amp;gt;255) vh2=0;&lt;br /&gt;
        if (vl2&amp;gt;255) vl2=0;&lt;br /&gt;
        x3=65;&lt;br /&gt;
        digi(vh2);&lt;br /&gt;
        x3=x3+90;&lt;br /&gt;
        digi(vl2);&lt;br /&gt;
        recan();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if(ly &amp;gt; 299-k) ly=299-k;&lt;br /&gt;
      if(ly &amp;gt; 0)&lt;br /&gt;
      {&lt;br /&gt;
        x0=240-lx;&lt;br /&gt;
        if(x0 &amp;gt; 240-k) x0=240-k;&lt;br /&gt;
        y0=ly;&lt;br /&gt;
        l2=(k+1)*(k+1);&lt;br /&gt;
        digitalWrite(LCD_CS,LOW); &lt;br /&gt;
        Address_set(x0,y0,x0+k,y0+k);&lt;br /&gt;
        for (l3=0; l3&amp;lt;l2; l3++) LCD_Write_DATA(vh2,vl2);&lt;br /&gt;
        digitalWrite(LCD_CS,HIGH); &lt;br /&gt;
    }&lt;br /&gt;
    delay (50);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Derivate==&lt;br /&gt;
Es gibt viele Derivate die auf dem Arduino basieren, weil&lt;br /&gt;
* Alle Layouts quelloffen im Internet stehen&lt;br /&gt;
* Der Bootloader sowohl als Quellocde und schon compillert zum Download im Internet stehen&lt;br /&gt;
*Man die IDE für alle Atmel-Chips verwenden kann, die einen Arduino-Bootloader besitzen&lt;br /&gt;
*Man auch eine Arduino-Derivat auf dem Steckbrett zusammbauen kann  &lt;br /&gt;
&lt;br /&gt;
==Tutorial==&lt;br /&gt;
===Ein erster Sketch: Blinkende LED===&lt;br /&gt;
Die meisten aktuellen Arduino-Boards habe einen fest verlötete&lt;br /&gt;
SMD-LED, welche an Pin 13 angeschloßen ist. Diese LED kann von jedem&lt;br /&gt;
Sketch angesteuert werden. Da diese LED meistens vorhanden ist und immer an Pin 13 ageschloßen ist, ist dieses Programm auf den meisten Boards gleich.&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//Blinkende LED&lt;br /&gt;
void setup() {&lt;br /&gt;
pinMode(13,OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
delay(1000);&lt;br /&gt;
digitalWrite(13,HIGH);&lt;br /&gt;
delay(1000);&lt;br /&gt;
digitalWrite(13,LOW);&lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
* [http://www.arduino.cc/en/Main/Software Download der IDE] &lt;br /&gt;
* [http://www.mikrocontroller.net/articles/AVR Artikel zur AVR Prozessor-Serie]&lt;br /&gt;
&lt;br /&gt;
==Literatur==&lt;br /&gt;
* Erik Bartmann: &#039;&#039;Die elektronische Welt mit Arduino entdecken&#039;&#039;, O&#039;Reilly Verlag, 2011, ISBN 978-3-89721-319-7&lt;br /&gt;
* Thomas Brühlmann: &#039;&#039;Arduino: Praxiseinstieg&#039;&#039;, mitp Verlag, 2010, ISBN 978-3-8266-5605-7&lt;br /&gt;
&lt;br /&gt;
==Bezugsquellen(Auswahl)==&lt;br /&gt;
&lt;br /&gt;
===Offiziele Boards===&lt;br /&gt;
* [http://www.watterott.com/de/Boards-Kits/Arduino Watterott.com] &lt;br /&gt;
* [http://www.reichelt.de/ Reichelt.de]&lt;br /&gt;
* [http://www.conrad.de/ Conrad.de]&lt;br /&gt;
* [http://www.tigal.com/ TIGAL.com]&lt;br /&gt;
&lt;br /&gt;
===Lernpakete===&lt;br /&gt;
* [http://www.franzis.de/ Franzis Verlag(Lernpakete)]&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [http://www.arduino.cc/ Website des Arduino-Projekt] &lt;br /&gt;
* [http://arduino.cc/forum/index.php/board,31.0.html Deutsches Arduino-Forum(offiziel)]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AVR-Boards]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Mknot9</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Arduino&amp;diff=74798</id>
		<title>Arduino</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Arduino&amp;diff=74798"/>
		<updated>2013-03-25T00:17:13Z</updated>

		<summary type="html">&lt;p&gt;Mknot9: /* 8-bit LCD-Shield mit Touch-Controller ohne IRQ-Pin */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
Das Arduino-Projekt ist ein 2006 gestartetes Projekt aus Italien. Arduino&lt;br /&gt;
ist eine Zusammenstellung aus verschiedenen Boards und einer IDE. Die Boards basieren auf der Atmel-AVR Serie. Die einzige ausnahme bildet der Arduino Due, dieser basiert auf einem ARM-Chip von Atmel. Das Gesamt Projekt ist quelloffen,&lt;br /&gt;
also Open-Source. Der Unterschied zu anderen Atmel-Boards sind der Bootloader und die IDE. Der Bootloader wird durch das Arduino-Projekt entwickelt und ist für die einzelnen Boards spezifisch.&lt;br /&gt;
&lt;br /&gt;
==Die IDE==&lt;br /&gt;
Die Arduino-IDE ist eine in JAVA programmierte grafische Obrfläche. Dadurch das sie in JAVA programiert wurde, ist sie plattfomunabhägig und auf Windows, Linux, MacOS X und Solaris verfügbar.&lt;br /&gt;
Die Grafischeoberfläche compiliert die Sketche(so heißt ein Arduino-Programm offiziel) nicht, sondern ruft verschiedene Programme auf. Dies sind in der Regel der Compiler avr-g++(und zugehörige Programme, z.B. ein Linker) und avrdude,&lt;br /&gt;
ein Programm zum übertragen des compilierten Sketch als *.hex File auf den Flashspeicher des Arduino. Die IDE basiert auf der Processing IDE und Wiring.&lt;br /&gt;
&lt;br /&gt;
==Die Boards==&lt;br /&gt;
Die Arduino-Boards sind Atmel AVR/ARM Chips basierende Mikrocontrollerplatinen,&lt;br /&gt;
welche zur Steuerung von I/O-Pins gedacht sind. Im Gegensatz zu anderen Boards sind die Arduino-Boards nicht gedacht um als &amp;quot;Computer&amp;quot; mit Betriebssystem zu dienen, wie etwa der Raspberry Pi, sondern um die I/O Pins zu steuern. Es gibt insgesamt 14 Boards mit 13 - 70 I/O Pins. Die Platinen besitzen meisten ein USB-Aschluß(USB-B bzw. USB-Mini) oder eine Schnitstelle für einen USB-Serial-Konverterchip. Die Platinen mit USB-Anschluß haben einen solchen Chip intigriert,&lt;br /&gt;
meist ein FTDI-Chip bei älteren Boards oder ein 8U2/16U2 bei neueren Boards.Eine Ausnahme bildet hier der Arduino Leonardo: Dieser besitzt einen Atmel-AVR 32U4 Mikrocontroller, welcher auch die Funktionen eines FTDI-Chips besitzt. Es ist also kein weiterer Konverter nötig.&lt;br /&gt;
&lt;br /&gt;
===Arduino Uno===&lt;br /&gt;
Der Arduino Uno R3 ist der Standard-Arduino. In den meisten Anfänger-Bücher und Tutorials wird dieser Arduino verwendet. Auch sind die meisten Libaries für ihn geschrieben. Er ist der neuste der am längsten weiterentwickleten Arduino-Reihe.&lt;br /&gt;
So ist eine frühere Version des Arduino Uno (Arduino USB) das Board gewesen, welches als erstes &#039;&#039;Arduino&#039;&#039; gennant wurde. In der aktuellen Revision (Version) 3 besitzt der Uno 14 Digitale I/O Pins sowie 6 analoge Eingänge. Er wird bei 5V betrieben und besitzt folgende Speicherkapazitäten:&lt;br /&gt;
* 32K Flash(0,5 werden vom Bootloader verwendet.)&lt;br /&gt;
* 2K SRAM&lt;br /&gt;
* 1K EEPROM&lt;br /&gt;
* 16 MHz (Prozessortakt)&lt;br /&gt;
Neben dem USB-B Anschluß verfügt der Uno noch über folgende Anschlüsse:&lt;br /&gt;
* Klinkenbuchse (2.1mm , 6-20 V möglich)&lt;br /&gt;
* SPI&lt;br /&gt;
* I²C&lt;br /&gt;
* ICSP&lt;br /&gt;
&lt;br /&gt;
====Arduino Duemilanove====&lt;br /&gt;
Der Arduino Duemilanove ist der Vorgänger des Arduino Uno. Er besitzt den&lt;br /&gt;
ATmega168 (seit 2009 328p) statt dem 328 wie beim Uno. Als Konverter verwendet der Duemilianove eine FTDI-Chip anstelle eines 16U2. Sonst ist von der Pin anzahlen und den Maßen des Boards identisch mit denen des Uno.&lt;br /&gt;
&lt;br /&gt;
====Arduino Diecimila====&lt;br /&gt;
====Arduino NG====&lt;br /&gt;
====Arduino Usb====&lt;br /&gt;
&lt;br /&gt;
===Arduino Mega===&lt;br /&gt;
====Arduino Mega ADK====&lt;br /&gt;
===Arduino Due===&lt;br /&gt;
&lt;br /&gt;
===Arduino Ethernet===&lt;br /&gt;
===Arduino LilyPad===&lt;br /&gt;
===Arduino Leonardo===  &lt;br /&gt;
===Arduino Nano===&lt;br /&gt;
===Arduino Micro===&lt;br /&gt;
===Arduino Fio===&lt;br /&gt;
===Arduino Pro Mini===&lt;br /&gt;
====Arduino Mini====&lt;br /&gt;
===Arduino Pro===&lt;br /&gt;
&lt;br /&gt;
==Shields(Erweiterungsplatinen)==&lt;br /&gt;
Sogennante Shields sind Erweiterungsplatinen, die die Funktionen eines Arduino-Boards um neue Funktionen erweitern. So gibt es z.B. Shields die den Arduino um eine Ethernet-Schnittstelle erweitern, einen VGA-Aschluß besitzen oder einfach leere Platinen sind, auf die eine Chip eingesetzt werden kann, ohne zu Löten. Für das letztere Bsp. wäre eine solche Platine die XBEE-Antenne.&lt;br /&gt;
&lt;br /&gt;
===8-bit LCD-Shield mit Touch-Controller ohne IRQ-Pin===&lt;br /&gt;
&lt;br /&gt;
Seit ca. Herbst 2012 werden einige LCD-Shields mit Touch-Controller angeboten, die den IRQ-Pin nicht mehr durchschleifen.&lt;br /&gt;
&lt;br /&gt;
Damit läuft auch die U-Touch Bibliothek von Henning Carlsen nicht mehr. Alle Sample-Codes im Web funktionieren auch nicht. Das Problem besteht darin herauszufinden, an welchen Arduino-Pin die das CS-Signal geleitet wird. Hier hilft nur Sheets studieren.&lt;br /&gt;
&lt;br /&gt;
Bei mir lief schließlich folgender Code:&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
#define LCD_RS   19         &lt;br /&gt;
#define LCD_WR   18     &lt;br /&gt;
#define LCD_CS   17       &lt;br /&gt;
#define LCD_REST 16&lt;br /&gt;
&lt;br /&gt;
#define DCLK     15&lt;br /&gt;
#define DIN      14 &lt;br /&gt;
#define CS       10  &lt;br /&gt;
#define DOUT     8&lt;br /&gt;
//#define IRQ      7    &lt;br /&gt;
 &lt;br /&gt;
unsigned int TP_X,TP_Y,x0,y0;    &lt;br /&gt;
unsigned int l3=0;&lt;br /&gt;
int lx,ly, l2, ry,rx,x3=65,y3=318;&lt;br /&gt;
int  k=3, vh2=0x84,vl2=0xFF;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
void spistar()                                     //SPI Start&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(CS,LOW);&lt;br /&gt;
  digitalWrite(DCLK,HIGH);&lt;br /&gt;
  digitalWrite(DIN,HIGH);&lt;br /&gt;
  digitalWrite(DCLK,HIGH);&lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
//**********************************************************&lt;br /&gt;
void WriteCharTo7843(unsigned char num)          //SPI Write Data&lt;br /&gt;
{&lt;br /&gt;
  unsigned char count=0;&lt;br /&gt;
  unsigned char temp;&lt;br /&gt;
  unsigned nop;&lt;br /&gt;
  temp=num;&lt;br /&gt;
  digitalWrite(DCLK,LOW);&lt;br /&gt;
  for(count=0;count&amp;lt;8;count++)&lt;br /&gt;
  {&lt;br /&gt;
    if(temp&amp;amp;0x80)&lt;br /&gt;
      digitalWrite(DIN,HIGH);&lt;br /&gt;
    else&lt;br /&gt;
      digitalWrite(DIN,LOW);&lt;br /&gt;
 &lt;br /&gt;
    temp=temp&amp;lt;&amp;lt;1; &lt;br /&gt;
 &lt;br /&gt;
    digitalWrite(DCLK,LOW);                &lt;br /&gt;
    nop++;&lt;br /&gt;
    nop++;&lt;br /&gt;
    digitalWrite(DCLK,HIGH);&lt;br /&gt;
    nop++;&lt;br /&gt;
    nop++;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//**********************************************************&lt;br /&gt;
unsigned int ReadFromCharFrom7843()             //SPI Read Data&lt;br /&gt;
{ &lt;br /&gt;
  unsigned nop;&lt;br /&gt;
  unsigned char count=0;&lt;br /&gt;
  unsigned int Num=0;&lt;br /&gt;
  for(count=0;count&amp;lt;12;count++)&lt;br /&gt;
  {&lt;br /&gt;
    Num&amp;lt;&amp;lt;=1;&lt;br /&gt;
    digitalWrite(DCLK,HIGH);//DCLK=1; _nop_();_nop_();_nop_();                &lt;br /&gt;
    nop++;&lt;br /&gt;
    digitalWrite(DCLK,LOW);//DCLK=0; _nop_();_nop_();_nop_();&lt;br /&gt;
    nop++;&lt;br /&gt;
    if(digitalRead(DOUT)) Num++;&lt;br /&gt;
  }&lt;br /&gt;
  return(Num);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
void LCD_Writ_Bus(char VH,char VL)   &lt;br /&gt;
{   &lt;br /&gt;
  PORTD = VH;&lt;br /&gt;
  digitalWrite(LCD_WR,LOW);&lt;br /&gt;
  digitalWrite(LCD_WR,HIGH);&lt;br /&gt;
  PORTD = VL;&lt;br /&gt;
  digitalWrite(LCD_WR,LOW);&lt;br /&gt;
  digitalWrite(LCD_WR,HIGH);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
void LCD_Write_COM(char VH,char VL)  &lt;br /&gt;
{   &lt;br /&gt;
  digitalWrite(LCD_RS,LOW);&lt;br /&gt;
  LCD_Writ_Bus(VH,VL);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
void LCD_Write_DATA(char VH,char VL)    &lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(LCD_RS,HIGH);&lt;br /&gt;
  LCD_Writ_Bus(VH,VL);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void Lcd_Write_Com_Data(int com,int val)&lt;br /&gt;
{&lt;br /&gt;
    LCD_Write_COM(com&amp;gt;&amp;gt;8,com);&lt;br /&gt;
    LCD_Write_DATA(val&amp;gt;&amp;gt;8,val);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void Address_set(unsigned int x1,unsigned int y1,unsigned int x2,unsigned int y2)&lt;br /&gt;
{&lt;br /&gt;
  LCD_Write_COM(0x00,0x46);LCD_Write_DATA(x2,x1);	  &lt;br /&gt;
  LCD_Write_COM(0x00,0x47);LCD_Write_DATA(y2&amp;gt;&amp;gt;8,y2);  &lt;br /&gt;
  LCD_Write_COM(0x00,0x48);LCD_Write_DATA(y1&amp;gt;&amp;gt;8,y1);&lt;br /&gt;
  LCD_Write_COM(0x00,0x20);LCD_Write_DATA(x1&amp;gt;&amp;gt;8,x1);	  &lt;br /&gt;
  LCD_Write_COM(0x00,0x21);LCD_Write_DATA(y1&amp;gt;&amp;gt;8,y1); &lt;br /&gt;
  LCD_Write_COM(0x00,0x22);		         				 &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void LCD_Init(void)&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
  digitalWrite(LCD_REST,HIGH);&lt;br /&gt;
  delay(5); &lt;br /&gt;
  digitalWrite(LCD_REST,LOW);&lt;br /&gt;
  delay(5);&lt;br /&gt;
  digitalWrite(LCD_REST,HIGH);&lt;br /&gt;
  delay(5);&lt;br /&gt;
 &lt;br /&gt;
  digitalWrite(LCD_CS,LOW);  &lt;br /&gt;
        Lcd_Write_Com_Data(0x11,0x2004);		&lt;br /&gt;
        Lcd_Write_Com_Data(0x13,0xCC00);		&lt;br /&gt;
        Lcd_Write_Com_Data(0x15,0x2600);	&lt;br /&gt;
	Lcd_Write_Com_Data(0x14,0x252A);			&lt;br /&gt;
	Lcd_Write_Com_Data(0x12,0x0033);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x13,0xCC04);		&lt;br /&gt;
	delay(1); &lt;br /&gt;
	Lcd_Write_Com_Data(0x13,0xCC06);		&lt;br /&gt;
	delay(1); &lt;br /&gt;
	Lcd_Write_Com_Data(0x13,0xCC4F);		&lt;br /&gt;
	delay(1); &lt;br /&gt;
	Lcd_Write_Com_Data(0x13,0x674F);&lt;br /&gt;
	Lcd_Write_Com_Data(0x11,0x2003);&lt;br /&gt;
	delay(1); 	&lt;br /&gt;
	Lcd_Write_Com_Data(0x30,0x2609);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x31,0x242C);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x32,0x1F23);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x33,0x2425);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x34,0x2226);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x35,0x2523);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x36,0x1C1A);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x37,0x131D);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x38,0x0B11);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x39,0x1210);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x3A,0x1315);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x3B,0x3619);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x3C,0x0D00);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x3D,0x000D);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x16,0x0007);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x02,0x0013);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x03,0x0003);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x01,0x0127);		&lt;br /&gt;
	delay(1); &lt;br /&gt;
	Lcd_Write_Com_Data(0x08,0x0303);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x0A,0x000B);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x0B,0x0003);   &lt;br /&gt;
	Lcd_Write_Com_Data(0x0C,0x0000);   &lt;br /&gt;
	Lcd_Write_Com_Data(0x41,0x0000);    &lt;br /&gt;
	Lcd_Write_Com_Data(0x50,0x0000);   &lt;br /&gt;
	Lcd_Write_Com_Data(0x60,0x0005);    &lt;br /&gt;
        Lcd_Write_Com_Data(0x70,0x000B);    &lt;br /&gt;
	Lcd_Write_Com_Data(0x71,0x0000);    &lt;br /&gt;
	Lcd_Write_Com_Data(0x78,0x0000);    &lt;br /&gt;
	Lcd_Write_Com_Data(0x7A,0x0000);   &lt;br /&gt;
	Lcd_Write_Com_Data(0x79,0x0007);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x07,0x0051);   &lt;br /&gt;
	delay(1); 	&lt;br /&gt;
	Lcd_Write_Com_Data(0x07,0x0053);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x79,0x0000);&lt;br /&gt;
 &lt;br /&gt;
	LCD_Write_COM(0x00,0x22);&lt;br /&gt;
  digitalWrite(LCD_CS,HIGH);  &lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void Pant(char VH,char VL)&lt;br /&gt;
{&lt;br /&gt;
  int i,j;&lt;br /&gt;
  Address_set(0,0,240,320);&lt;br /&gt;
  for(i=0;i&amp;lt;=320;i++)&lt;br /&gt;
  {&lt;br /&gt;
    for (j=0;j&amp;lt;=240;j++)&lt;br /&gt;
    {&lt;br /&gt;
      LCD_Write_DATA(VH,VL);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void digi(int z3)&lt;br /&gt;
{&lt;br /&gt;
  unsigned char p;&lt;br /&gt;
  int x2, y2, z2, i,h2=1000;&lt;br /&gt;
  digitalWrite(LCD_CS,LOW); &lt;br /&gt;
  for(i=0;i&amp;lt;3;i++)&lt;br /&gt;
  {&lt;br /&gt;
  y2=y3;&lt;br /&gt;
  x2=x3+(10*i);&lt;br /&gt;
  Address_set(x2+6,y2-15,x2+7,y2);&lt;br /&gt;
  for(p=0; p&amp;lt;32; p++)  LCD_Write_DATA(0xFF,0xFF);&lt;br /&gt;
  Address_set(x2,y2-15,x2+7,y2-14);&lt;br /&gt;
  for(p=0; p&amp;lt;16; p++)  LCD_Write_DATA(0xFF,0xFF);&lt;br /&gt;
  Address_set(x2,y2-1,x2+7,y2);&lt;br /&gt;
  for(p=0; p&amp;lt;16; p++)  LCD_Write_DATA(0xFF,0xFF);&lt;br /&gt;
  Address_set(x2,y2-8,x2+7,y2-7);&lt;br /&gt;
  for(p=0; p&amp;lt;16; p++)  LCD_Write_DATA(0xFF,0xFF);&lt;br /&gt;
  Address_set(x2,y2-15,x2+1,y2);&lt;br /&gt;
  for(p=0; p&amp;lt;32; p++)  LCD_Write_DATA(0xFF,0xFF);&lt;br /&gt;
 &lt;br /&gt;
    h2=h2/10;&lt;br /&gt;
    z2=z3/h2; &lt;br /&gt;
    z3=z3-z2*h2;&lt;br /&gt;
    if (z2==0)  {&lt;br /&gt;
      Address_set(x2+2,y2-8,x2+5,y2-7);&lt;br /&gt;
      for(p=0; p&amp;lt;8; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
    }&lt;br /&gt;
    if (z2==1)  {&lt;br /&gt;
      Address_set(x2,y2-15,x2+5,y2);&lt;br /&gt;
      for(p=0; p&amp;lt;96; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
    }&lt;br /&gt;
   if (z2==2)  {&lt;br /&gt;
      Address_set(x2,y2-13,x2+1,y2-9);&lt;br /&gt;
      for(p=0; p&amp;lt;10; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
      Address_set(x2+6,y2-6,x2+7,y2-2);&lt;br /&gt;
      for(p=0; p&amp;lt;10; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
    }&lt;br /&gt;
   if (z2==3)  {&lt;br /&gt;
      Address_set(x2,y2-13,x2+1,y2-9);&lt;br /&gt;
      for(p=0; p&amp;lt;10; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
      Address_set(x2,y2-6,x2+1,y2-2);&lt;br /&gt;
      for(p=0; p&amp;lt;10; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
    }&lt;br /&gt;
   if (z2==4)  {&lt;br /&gt;
      Address_set(x2,y2-6,x2+5,y2);&lt;br /&gt;
      for(p=0; p&amp;lt;42; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
      Address_set(x2+2,y2-15,x2+5,y2-14);&lt;br /&gt;
      for(p=0; p&amp;lt;8; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
    }&lt;br /&gt;
   if (z2==5)  {&lt;br /&gt;
      Address_set(x2+6,y2-13,x2+7,y2-9);&lt;br /&gt;
      for(p=0; p&amp;lt;10; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
     Address_set(x2,y2-6,x2+1,y2-2);&lt;br /&gt;
      for(p=0; p&amp;lt;10; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
    }&lt;br /&gt;
   if (z2==6)  {&lt;br /&gt;
      Address_set(x2+6,y2-13,x2+7,y2-9);&lt;br /&gt;
      for(p=0; p&amp;lt;10; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
    }&lt;br /&gt;
   if (z2==7)  {&lt;br /&gt;
      Address_set(x2,y2-13,x2+5,y2);&lt;br /&gt;
      for(p=0; p&amp;lt;84; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
    }&lt;br /&gt;
   if (z2==9)  {&lt;br /&gt;
      Address_set(x2,y2-6,x2+1,y2-2);&lt;br /&gt;
      for(p=0; p&amp;lt;10; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(LCD_CS,HIGH); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void newpa(void)&lt;br /&gt;
{&lt;br /&gt;
  unsigned char p;&lt;br /&gt;
  digitalWrite(LCD_CS,LOW); &lt;br /&gt;
  Pant(0x00,0x00);   &lt;br /&gt;
&lt;br /&gt;
  Address_set(0,319,240,319);&lt;br /&gt;
  for(p=0; p&amp;lt;240; p++)  LCD_Write_DATA(0xF8,0x00);&lt;br /&gt;
  Address_set(0,0,240,0);&lt;br /&gt;
  for(p=0; p&amp;lt;240; p++)  LCD_Write_DATA(0xFF,0xFF);&lt;br /&gt;
  Address_set(0,300,240,300);&lt;br /&gt;
  for(p=0; p&amp;lt;240; p++)  LCD_Write_DATA(0xFF,0xFF);&lt;br /&gt;
  Address_set(0,0,0,255);&lt;br /&gt;
  for(p=0; p&amp;lt;255; p++)  LCD_Write_DATA(0xF8,0x00);&lt;br /&gt;
  Address_set(0,255,0,300);&lt;br /&gt;
  for(p=0; p&amp;lt;45; p++)  LCD_Write_DATA(0xF8,0x00);&lt;br /&gt;
  Address_set(239,0,239,255);&lt;br /&gt;
  for(p=0; p&amp;lt;255; p++)  LCD_Write_DATA(0xF8,0x00);&lt;br /&gt;
  Address_set(239,255,239,300);&lt;br /&gt;
  for(p=0; p&amp;lt;45; p++)  LCD_Write_DATA(0xF8,0x00);&lt;br /&gt;
Address_set(50,308,59,311);&lt;br /&gt;
  for(p=0; p&amp;lt;40; p++)  LCD_Write_DATA(0x07,0xE0);&lt;br /&gt;
Address_set(53,305,56,314);&lt;br /&gt;
  for(p=0; p&amp;lt;40; p++)  LCD_Write_DATA(0x07,0xE0);&lt;br /&gt;
Address_set(215,305,239,314);&lt;br /&gt;
  for(p=0; p&amp;lt;250; p++)  LCD_Write_DATA(0xF8,0x00);&lt;br /&gt;
 digitalWrite(LCD_CS,HIGH); &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
 void recan(void)&lt;br /&gt;
{&lt;br /&gt;
  int i,j;&lt;br /&gt;
//  unsigned int m;&lt;br /&gt;
 digitalWrite(LCD_CS,LOW); &lt;br /&gt;
  for(i=0;i&amp;lt;7;i++)&lt;br /&gt;
  {&lt;br /&gt;
//    m=i*3;&lt;br /&gt;
    Address_set(i*5,305,i*5+3,314);&lt;br /&gt;
    for(j=0; j&amp;lt;40; j++)&lt;br /&gt;
    {&lt;br /&gt;
      if (1+i*2&amp;lt;= k) LCD_Write_DATA(0xFF,0xE0); else LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
Address_set(100,305,124,314);&lt;br /&gt;
  for(i=0; i&amp;lt;250; i++)  LCD_Write_DATA(vh2,vl2);&lt;br /&gt;
Address_set(125,305,149,314);&lt;br /&gt;
  for(i=0; i&amp;lt;250; i++)  LCD_Write_DATA(vh2,vl2);&lt;br /&gt;
 digitalWrite(LCD_CS,HIGH); &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
void AD7843(void)              &lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(CS,LOW);                    &lt;br /&gt;
  WriteCharTo7843(0x90);        &lt;br /&gt;
  digitalWrite(DCLK,HIGH);&lt;br /&gt;
  digitalWrite(DCLK,LOW); &lt;br /&gt;
  TP_Y=ReadFromCharFrom7843();&lt;br /&gt;
  WriteCharTo7843(0xD0);      &lt;br /&gt;
  digitalWrite(DCLK,HIGH);&lt;br /&gt;
  digitalWrite(DCLK,LOW);&lt;br /&gt;
  TP_X=ReadFromCharFrom7843();&lt;br /&gt;
  digitalWrite(CS,HIGH);&lt;br /&gt;
 &lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void setup()&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
  unsigned char p;&lt;br /&gt;
&lt;br /&gt;
  for(p=0;p&amp;lt;20;p++)&lt;br /&gt;
  {&lt;br /&gt;
    pinMode(p,OUTPUT);&lt;br /&gt;
  }&lt;br /&gt;
  pinMode(DOUT,INPUT);&lt;br /&gt;
      x0=1;&lt;br /&gt;
      y0=1;&lt;br /&gt;
 &lt;br /&gt;
  LCD_Init();  &lt;br /&gt;
  newpa();&lt;br /&gt;
  recan();&lt;br /&gt;
  digi(vh2);&lt;br /&gt;
  x3=x3+90;&lt;br /&gt;
  digi(vl2);&lt;br /&gt;
  spistar();  &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void loop()&lt;br /&gt;
{  &lt;br /&gt;
  rx=0;&lt;br /&gt;
  ry=0;&lt;br /&gt;
   &lt;br /&gt;
  for(l3=0;l3&amp;lt;8;l3++)&lt;br /&gt;
    {&lt;br /&gt;
      AD7843();&lt;br /&gt;
&lt;br /&gt;
      lx=0;&lt;br /&gt;
      ly=-1*TP_Y;&lt;br /&gt;
      ly=4095+ly;&lt;br /&gt;
      if(ly &amp;gt; 0) lx=1*TP_X; else {lx=0;ly=0;rx=0;ry=0;l3=9; }&lt;br /&gt;
      rx=rx+lx;&lt;br /&gt;
      ry=ry+ly;&lt;br /&gt;
    }&lt;br /&gt;
      lx=(rx/8-180)/15;&lt;br /&gt;
      ly=(ry/8-240)/11;&lt;br /&gt;
      if(ly &amp;lt; 1) {lx=0;ly=0; }&lt;br /&gt;
      if(lx &amp;lt; 1) lx=0;&lt;br /&gt;
 &lt;br /&gt;
      if(ly &amp;gt; 309-k)&lt;br /&gt;
      {&lt;br /&gt;
        ly=0;&lt;br /&gt;
        if(lx &amp;gt; 200) k=k-2; else if (lx &amp;gt; 160) k=k+2;else&lt;br /&gt;
            if (lx &amp;gt; 100) vh2++; else if (lx &amp;gt; 40) vl2++; else newpa();&lt;br /&gt;
        lx=0;&lt;br /&gt;
        if (k&amp;lt;1) k=1;&lt;br /&gt;
        if (k&amp;gt;13) k=13;&lt;br /&gt;
        if (vh2&amp;gt;255) vh2=0;&lt;br /&gt;
        if (vl2&amp;gt;255) vl2=0;&lt;br /&gt;
        x3=65;&lt;br /&gt;
        digi(vh2);&lt;br /&gt;
        x3=x3+90;&lt;br /&gt;
        digi(vl2);&lt;br /&gt;
        recan();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if(ly &amp;gt; 299-k) ly=299-k;&lt;br /&gt;
      if(ly &amp;gt; 0)&lt;br /&gt;
      {&lt;br /&gt;
        x0=240-lx;&lt;br /&gt;
        if(x0 &amp;gt; 240-k) x0=240-k;&lt;br /&gt;
        y0=ly;&lt;br /&gt;
        l2=(k+1)*(k+1);&lt;br /&gt;
        digitalWrite(LCD_CS,LOW); &lt;br /&gt;
        Address_set(x0,y0,x0+k,y0+k);&lt;br /&gt;
        for (l3=0; l3&amp;lt;l2; l3++) LCD_Write_DATA(vh2,vl2);&lt;br /&gt;
        digitalWrite(LCD_CS,HIGH); &lt;br /&gt;
    }&lt;br /&gt;
    delay (50);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Derivate==&lt;br /&gt;
Es gibt viele Derivate die auf dem Arduino basieren, weil&lt;br /&gt;
* Alle Layouts quelloffen im Internet stehen&lt;br /&gt;
* Der Bootloader sowohl als Quellocde und schon compillert zum Download im Internet stehen&lt;br /&gt;
*Man die IDE für alle Atmel-Chips verwenden kann, die einen Arduino-Bootloader besitzen&lt;br /&gt;
*Man auch eine Arduino-Derivat auf dem Steckbrett zusammbauen kann  &lt;br /&gt;
&lt;br /&gt;
==Tutorial==&lt;br /&gt;
===Ein erster Sketch: Blinkende LED===&lt;br /&gt;
Die meisten aktuellen Arduino-Boards habe einen fest verlötete&lt;br /&gt;
SMD-LED, welche an Pin 13 angeschloßen ist. Diese LED kann von jedem&lt;br /&gt;
Sketch angesteuert werden. Da diese LED meistens vorhanden ist und immer an Pin 13 ageschloßen ist, ist dieses Programm auf den meisten Boards gleich.&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//Blinkende LED&lt;br /&gt;
void setup() {&lt;br /&gt;
pinMode(13,OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
delay(1000);&lt;br /&gt;
digitalWrite(13,HIGH);&lt;br /&gt;
delay(1000);&lt;br /&gt;
digitalWrite(13,LOW);&lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
* [http://www.arduino.cc/en/Main/Software Download der IDE] &lt;br /&gt;
* [http://www.mikrocontroller.net/articles/AVR Artikel zur AVR Prozessor-Serie]&lt;br /&gt;
&lt;br /&gt;
==Literatur==&lt;br /&gt;
* Erik Bartmann: &#039;&#039;Die elektronische Welt mit Arduino entdecken&#039;&#039;, O&#039;Reilly Verlag, 2011, ISBN 978-3-89721-319-7&lt;br /&gt;
* Thomas Brühlmann: &#039;&#039;Arduino: Praxiseinstieg&#039;&#039;, mitp Verlag, 2010, ISBN 978-3-8266-5605-7&lt;br /&gt;
&lt;br /&gt;
==Bezugsquellen(Auswahl)==&lt;br /&gt;
&lt;br /&gt;
===Offiziele Boards===&lt;br /&gt;
* [http://www.watterott.com/de/Boards-Kits/Arduino Watterott.com] &lt;br /&gt;
* [http://www.reichelt.de/ Reichelt.de]&lt;br /&gt;
* [http://www.conrad.de/ Conrad.de]&lt;br /&gt;
* [http://www.tigal.com/ TIGAL.com]&lt;br /&gt;
&lt;br /&gt;
===Lernpakete===&lt;br /&gt;
* [http://www.franzis.de/ Franzis Verlag(Lernpakete)]&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [http://www.arduino.cc/ Website des Arduino-Projekt] &lt;br /&gt;
* [http://arduino.cc/forum/index.php/board,31.0.html Deutsches Arduino-Forum(offiziel)]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AVR-Boards]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Mknot9</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Arduino&amp;diff=74797</id>
		<title>Arduino</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Arduino&amp;diff=74797"/>
		<updated>2013-03-25T00:16:10Z</updated>

		<summary type="html">&lt;p&gt;Mknot9: /* Shields(Erweiterungsplatinen) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
Das Arduino-Projekt ist ein 2006 gestartetes Projekt aus Italien. Arduino&lt;br /&gt;
ist eine Zusammenstellung aus verschiedenen Boards und einer IDE. Die Boards basieren auf der Atmel-AVR Serie. Die einzige ausnahme bildet der Arduino Due, dieser basiert auf einem ARM-Chip von Atmel. Das Gesamt Projekt ist quelloffen,&lt;br /&gt;
also Open-Source. Der Unterschied zu anderen Atmel-Boards sind der Bootloader und die IDE. Der Bootloader wird durch das Arduino-Projekt entwickelt und ist für die einzelnen Boards spezifisch.&lt;br /&gt;
&lt;br /&gt;
==Die IDE==&lt;br /&gt;
Die Arduino-IDE ist eine in JAVA programmierte grafische Obrfläche. Dadurch das sie in JAVA programiert wurde, ist sie plattfomunabhägig und auf Windows, Linux, MacOS X und Solaris verfügbar.&lt;br /&gt;
Die Grafischeoberfläche compiliert die Sketche(so heißt ein Arduino-Programm offiziel) nicht, sondern ruft verschiedene Programme auf. Dies sind in der Regel der Compiler avr-g++(und zugehörige Programme, z.B. ein Linker) und avrdude,&lt;br /&gt;
ein Programm zum übertragen des compilierten Sketch als *.hex File auf den Flashspeicher des Arduino. Die IDE basiert auf der Processing IDE und Wiring.&lt;br /&gt;
&lt;br /&gt;
==Die Boards==&lt;br /&gt;
Die Arduino-Boards sind Atmel AVR/ARM Chips basierende Mikrocontrollerplatinen,&lt;br /&gt;
welche zur Steuerung von I/O-Pins gedacht sind. Im Gegensatz zu anderen Boards sind die Arduino-Boards nicht gedacht um als &amp;quot;Computer&amp;quot; mit Betriebssystem zu dienen, wie etwa der Raspberry Pi, sondern um die I/O Pins zu steuern. Es gibt insgesamt 14 Boards mit 13 - 70 I/O Pins. Die Platinen besitzen meisten ein USB-Aschluß(USB-B bzw. USB-Mini) oder eine Schnitstelle für einen USB-Serial-Konverterchip. Die Platinen mit USB-Anschluß haben einen solchen Chip intigriert,&lt;br /&gt;
meist ein FTDI-Chip bei älteren Boards oder ein 8U2/16U2 bei neueren Boards.Eine Ausnahme bildet hier der Arduino Leonardo: Dieser besitzt einen Atmel-AVR 32U4 Mikrocontroller, welcher auch die Funktionen eines FTDI-Chips besitzt. Es ist also kein weiterer Konverter nötig.&lt;br /&gt;
&lt;br /&gt;
===Arduino Uno===&lt;br /&gt;
Der Arduino Uno R3 ist der Standard-Arduino. In den meisten Anfänger-Bücher und Tutorials wird dieser Arduino verwendet. Auch sind die meisten Libaries für ihn geschrieben. Er ist der neuste der am längsten weiterentwickleten Arduino-Reihe.&lt;br /&gt;
So ist eine frühere Version des Arduino Uno (Arduino USB) das Board gewesen, welches als erstes &#039;&#039;Arduino&#039;&#039; gennant wurde. In der aktuellen Revision (Version) 3 besitzt der Uno 14 Digitale I/O Pins sowie 6 analoge Eingänge. Er wird bei 5V betrieben und besitzt folgende Speicherkapazitäten:&lt;br /&gt;
* 32K Flash(0,5 werden vom Bootloader verwendet.)&lt;br /&gt;
* 2K SRAM&lt;br /&gt;
* 1K EEPROM&lt;br /&gt;
* 16 MHz (Prozessortakt)&lt;br /&gt;
Neben dem USB-B Anschluß verfügt der Uno noch über folgende Anschlüsse:&lt;br /&gt;
* Klinkenbuchse (2.1mm , 6-20 V möglich)&lt;br /&gt;
* SPI&lt;br /&gt;
* I²C&lt;br /&gt;
* ICSP&lt;br /&gt;
&lt;br /&gt;
====Arduino Duemilanove====&lt;br /&gt;
Der Arduino Duemilanove ist der Vorgänger des Arduino Uno. Er besitzt den&lt;br /&gt;
ATmega168 (seit 2009 328p) statt dem 328 wie beim Uno. Als Konverter verwendet der Duemilianove eine FTDI-Chip anstelle eines 16U2. Sonst ist von der Pin anzahlen und den Maßen des Boards identisch mit denen des Uno.&lt;br /&gt;
&lt;br /&gt;
====Arduino Diecimila====&lt;br /&gt;
====Arduino NG====&lt;br /&gt;
====Arduino Usb====&lt;br /&gt;
&lt;br /&gt;
===Arduino Mega===&lt;br /&gt;
====Arduino Mega ADK====&lt;br /&gt;
===Arduino Due===&lt;br /&gt;
&lt;br /&gt;
===Arduino Ethernet===&lt;br /&gt;
===Arduino LilyPad===&lt;br /&gt;
===Arduino Leonardo===  &lt;br /&gt;
===Arduino Nano===&lt;br /&gt;
===Arduino Micro===&lt;br /&gt;
===Arduino Fio===&lt;br /&gt;
===Arduino Pro Mini===&lt;br /&gt;
====Arduino Mini====&lt;br /&gt;
===Arduino Pro===&lt;br /&gt;
&lt;br /&gt;
==Shields(Erweiterungsplatinen)==&lt;br /&gt;
Sogennante Shields sind Erweiterungsplatinen, die die Funktionen eines Arduino-Boards um neue Funktionen erweitern. So gibt es z.B. Shields die den Arduino um eine Ethernet-Schnittstelle erweitern, einen VGA-Aschluß besitzen oder einfach leere Platinen sind, auf die eine Chip eingesetzt werden kann, ohne zu Löten. Für das letztere Bsp. wäre eine solche Platine die XBEE-Antenne.&lt;br /&gt;
&lt;br /&gt;
===8-bit LCD-Shield mit Touch-Controller ohne IRQ-Pin===&lt;br /&gt;
&lt;br /&gt;
Seit ca. Herbst 2012 werden einige LCD-Shields mit Touch-Controller angeboten, die den IRQ-Pin nicht mehr durchschleifen.&lt;br /&gt;
&lt;br /&gt;
Damit läuft auch die U-Touch Bibliothek von Henning Carlsen nicht mehr. Alle Sample-Codes im Web funktionieren auch nicht. Das Problem besteht darin herauszufinden, an welchen Arduino-Pin die das CS-Signal geleitet wird. Hier hilft nur Sheets studieren.&lt;br /&gt;
&lt;br /&gt;
Bei mir lief schließlich folgender Code:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
#define LCD_RS   19         &lt;br /&gt;
#define LCD_WR   18     &lt;br /&gt;
#define LCD_CS   17       &lt;br /&gt;
#define LCD_REST 16&lt;br /&gt;
&lt;br /&gt;
#define DCLK     15&lt;br /&gt;
#define DIN      14 &lt;br /&gt;
#define CS       10  &lt;br /&gt;
#define DOUT     8&lt;br /&gt;
//#define IRQ      7    &lt;br /&gt;
 &lt;br /&gt;
unsigned int TP_X,TP_Y,x0,y0;    &lt;br /&gt;
unsigned int l3=0;&lt;br /&gt;
int lx,ly, l2, ry,rx,x3=65,y3=318;&lt;br /&gt;
int  k=3, vh2=0x84,vl2=0xFF;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
void spistar()                                     //SPI Start&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(CS,LOW);&lt;br /&gt;
  digitalWrite(DCLK,HIGH);&lt;br /&gt;
  digitalWrite(DIN,HIGH);&lt;br /&gt;
  digitalWrite(DCLK,HIGH);&lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
//**********************************************************&lt;br /&gt;
void WriteCharTo7843(unsigned char num)          //SPI Write Data&lt;br /&gt;
{&lt;br /&gt;
  unsigned char count=0;&lt;br /&gt;
  unsigned char temp;&lt;br /&gt;
  unsigned nop;&lt;br /&gt;
  temp=num;&lt;br /&gt;
  digitalWrite(DCLK,LOW);&lt;br /&gt;
  for(count=0;count&amp;lt;8;count++)&lt;br /&gt;
  {&lt;br /&gt;
    if(temp&amp;amp;0x80)&lt;br /&gt;
      digitalWrite(DIN,HIGH);&lt;br /&gt;
    else&lt;br /&gt;
      digitalWrite(DIN,LOW);&lt;br /&gt;
 &lt;br /&gt;
    temp=temp&amp;lt;&amp;lt;1; &lt;br /&gt;
 &lt;br /&gt;
    digitalWrite(DCLK,LOW);                &lt;br /&gt;
    nop++;&lt;br /&gt;
    nop++;&lt;br /&gt;
    digitalWrite(DCLK,HIGH);&lt;br /&gt;
    nop++;&lt;br /&gt;
    nop++;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//**********************************************************&lt;br /&gt;
unsigned int ReadFromCharFrom7843()             //SPI Read Data&lt;br /&gt;
{ &lt;br /&gt;
  unsigned nop;&lt;br /&gt;
  unsigned char count=0;&lt;br /&gt;
  unsigned int Num=0;&lt;br /&gt;
  for(count=0;count&amp;lt;12;count++)&lt;br /&gt;
  {&lt;br /&gt;
    Num&amp;lt;&amp;lt;=1;&lt;br /&gt;
    digitalWrite(DCLK,HIGH);//DCLK=1; _nop_();_nop_();_nop_();                &lt;br /&gt;
    nop++;&lt;br /&gt;
    digitalWrite(DCLK,LOW);//DCLK=0; _nop_();_nop_();_nop_();&lt;br /&gt;
    nop++;&lt;br /&gt;
    if(digitalRead(DOUT)) Num++;&lt;br /&gt;
  }&lt;br /&gt;
  return(Num);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
void LCD_Writ_Bus(char VH,char VL)   &lt;br /&gt;
{   &lt;br /&gt;
  PORTD = VH;&lt;br /&gt;
  digitalWrite(LCD_WR,LOW);&lt;br /&gt;
  digitalWrite(LCD_WR,HIGH);&lt;br /&gt;
  PORTD = VL;&lt;br /&gt;
  digitalWrite(LCD_WR,LOW);&lt;br /&gt;
  digitalWrite(LCD_WR,HIGH);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
void LCD_Write_COM(char VH,char VL)  &lt;br /&gt;
{   &lt;br /&gt;
  digitalWrite(LCD_RS,LOW);&lt;br /&gt;
  LCD_Writ_Bus(VH,VL);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
void LCD_Write_DATA(char VH,char VL)    &lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(LCD_RS,HIGH);&lt;br /&gt;
  LCD_Writ_Bus(VH,VL);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void Lcd_Write_Com_Data(int com,int val)&lt;br /&gt;
{&lt;br /&gt;
    LCD_Write_COM(com&amp;gt;&amp;gt;8,com);&lt;br /&gt;
    LCD_Write_DATA(val&amp;gt;&amp;gt;8,val);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void Address_set(unsigned int x1,unsigned int y1,unsigned int x2,unsigned int y2)&lt;br /&gt;
{&lt;br /&gt;
  LCD_Write_COM(0x00,0x46);LCD_Write_DATA(x2,x1);	  &lt;br /&gt;
  LCD_Write_COM(0x00,0x47);LCD_Write_DATA(y2&amp;gt;&amp;gt;8,y2);  &lt;br /&gt;
  LCD_Write_COM(0x00,0x48);LCD_Write_DATA(y1&amp;gt;&amp;gt;8,y1);&lt;br /&gt;
  LCD_Write_COM(0x00,0x20);LCD_Write_DATA(x1&amp;gt;&amp;gt;8,x1);	  &lt;br /&gt;
  LCD_Write_COM(0x00,0x21);LCD_Write_DATA(y1&amp;gt;&amp;gt;8,y1); &lt;br /&gt;
  LCD_Write_COM(0x00,0x22);		         				 &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void LCD_Init(void)&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
  digitalWrite(LCD_REST,HIGH);&lt;br /&gt;
  delay(5); &lt;br /&gt;
  digitalWrite(LCD_REST,LOW);&lt;br /&gt;
  delay(5);&lt;br /&gt;
  digitalWrite(LCD_REST,HIGH);&lt;br /&gt;
  delay(5);&lt;br /&gt;
 &lt;br /&gt;
  digitalWrite(LCD_CS,LOW);  &lt;br /&gt;
        Lcd_Write_Com_Data(0x11,0x2004);		&lt;br /&gt;
        Lcd_Write_Com_Data(0x13,0xCC00);		&lt;br /&gt;
        Lcd_Write_Com_Data(0x15,0x2600);	&lt;br /&gt;
	Lcd_Write_Com_Data(0x14,0x252A);			&lt;br /&gt;
	Lcd_Write_Com_Data(0x12,0x0033);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x13,0xCC04);		&lt;br /&gt;
	delay(1); &lt;br /&gt;
	Lcd_Write_Com_Data(0x13,0xCC06);		&lt;br /&gt;
	delay(1); &lt;br /&gt;
	Lcd_Write_Com_Data(0x13,0xCC4F);		&lt;br /&gt;
	delay(1); &lt;br /&gt;
	Lcd_Write_Com_Data(0x13,0x674F);&lt;br /&gt;
	Lcd_Write_Com_Data(0x11,0x2003);&lt;br /&gt;
	delay(1); 	&lt;br /&gt;
	Lcd_Write_Com_Data(0x30,0x2609);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x31,0x242C);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x32,0x1F23);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x33,0x2425);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x34,0x2226);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x35,0x2523);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x36,0x1C1A);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x37,0x131D);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x38,0x0B11);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x39,0x1210);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x3A,0x1315);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x3B,0x3619);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x3C,0x0D00);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x3D,0x000D);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x16,0x0007);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x02,0x0013);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x03,0x0003);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x01,0x0127);		&lt;br /&gt;
	delay(1); &lt;br /&gt;
	Lcd_Write_Com_Data(0x08,0x0303);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x0A,0x000B);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x0B,0x0003);   &lt;br /&gt;
	Lcd_Write_Com_Data(0x0C,0x0000);   &lt;br /&gt;
	Lcd_Write_Com_Data(0x41,0x0000);    &lt;br /&gt;
	Lcd_Write_Com_Data(0x50,0x0000);   &lt;br /&gt;
	Lcd_Write_Com_Data(0x60,0x0005);    &lt;br /&gt;
        Lcd_Write_Com_Data(0x70,0x000B);    &lt;br /&gt;
	Lcd_Write_Com_Data(0x71,0x0000);    &lt;br /&gt;
	Lcd_Write_Com_Data(0x78,0x0000);    &lt;br /&gt;
	Lcd_Write_Com_Data(0x7A,0x0000);   &lt;br /&gt;
	Lcd_Write_Com_Data(0x79,0x0007);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x07,0x0051);   &lt;br /&gt;
	delay(1); 	&lt;br /&gt;
	Lcd_Write_Com_Data(0x07,0x0053);		&lt;br /&gt;
	Lcd_Write_Com_Data(0x79,0x0000);&lt;br /&gt;
 &lt;br /&gt;
	LCD_Write_COM(0x00,0x22);&lt;br /&gt;
  digitalWrite(LCD_CS,HIGH);  &lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void Pant(char VH,char VL)&lt;br /&gt;
{&lt;br /&gt;
  int i,j;&lt;br /&gt;
  Address_set(0,0,240,320);&lt;br /&gt;
  for(i=0;i&amp;lt;=320;i++)&lt;br /&gt;
  {&lt;br /&gt;
    for (j=0;j&amp;lt;=240;j++)&lt;br /&gt;
    {&lt;br /&gt;
      LCD_Write_DATA(VH,VL);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void digi(int z3)&lt;br /&gt;
{&lt;br /&gt;
  unsigned char p;&lt;br /&gt;
  int x2, y2, z2, i,h2=1000;&lt;br /&gt;
  digitalWrite(LCD_CS,LOW); &lt;br /&gt;
  for(i=0;i&amp;lt;3;i++)&lt;br /&gt;
  {&lt;br /&gt;
  y2=y3;&lt;br /&gt;
  x2=x3+(10*i);&lt;br /&gt;
  Address_set(x2+6,y2-15,x2+7,y2);&lt;br /&gt;
  for(p=0; p&amp;lt;32; p++)  LCD_Write_DATA(0xFF,0xFF);&lt;br /&gt;
  Address_set(x2,y2-15,x2+7,y2-14);&lt;br /&gt;
  for(p=0; p&amp;lt;16; p++)  LCD_Write_DATA(0xFF,0xFF);&lt;br /&gt;
  Address_set(x2,y2-1,x2+7,y2);&lt;br /&gt;
  for(p=0; p&amp;lt;16; p++)  LCD_Write_DATA(0xFF,0xFF);&lt;br /&gt;
  Address_set(x2,y2-8,x2+7,y2-7);&lt;br /&gt;
  for(p=0; p&amp;lt;16; p++)  LCD_Write_DATA(0xFF,0xFF);&lt;br /&gt;
  Address_set(x2,y2-15,x2+1,y2);&lt;br /&gt;
  for(p=0; p&amp;lt;32; p++)  LCD_Write_DATA(0xFF,0xFF);&lt;br /&gt;
 &lt;br /&gt;
    h2=h2/10;&lt;br /&gt;
    z2=z3/h2; &lt;br /&gt;
    z3=z3-z2*h2;&lt;br /&gt;
    if (z2==0)  {&lt;br /&gt;
      Address_set(x2+2,y2-8,x2+5,y2-7);&lt;br /&gt;
      for(p=0; p&amp;lt;8; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
    }&lt;br /&gt;
    if (z2==1)  {&lt;br /&gt;
      Address_set(x2,y2-15,x2+5,y2);&lt;br /&gt;
      for(p=0; p&amp;lt;96; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
    }&lt;br /&gt;
   if (z2==2)  {&lt;br /&gt;
      Address_set(x2,y2-13,x2+1,y2-9);&lt;br /&gt;
      for(p=0; p&amp;lt;10; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
      Address_set(x2+6,y2-6,x2+7,y2-2);&lt;br /&gt;
      for(p=0; p&amp;lt;10; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
    }&lt;br /&gt;
   if (z2==3)  {&lt;br /&gt;
      Address_set(x2,y2-13,x2+1,y2-9);&lt;br /&gt;
      for(p=0; p&amp;lt;10; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
      Address_set(x2,y2-6,x2+1,y2-2);&lt;br /&gt;
      for(p=0; p&amp;lt;10; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
    }&lt;br /&gt;
   if (z2==4)  {&lt;br /&gt;
      Address_set(x2,y2-6,x2+5,y2);&lt;br /&gt;
      for(p=0; p&amp;lt;42; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
      Address_set(x2+2,y2-15,x2+5,y2-14);&lt;br /&gt;
      for(p=0; p&amp;lt;8; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
    }&lt;br /&gt;
   if (z2==5)  {&lt;br /&gt;
      Address_set(x2+6,y2-13,x2+7,y2-9);&lt;br /&gt;
      for(p=0; p&amp;lt;10; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
     Address_set(x2,y2-6,x2+1,y2-2);&lt;br /&gt;
      for(p=0; p&amp;lt;10; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
    }&lt;br /&gt;
   if (z2==6)  {&lt;br /&gt;
      Address_set(x2+6,y2-13,x2+7,y2-9);&lt;br /&gt;
      for(p=0; p&amp;lt;10; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
    }&lt;br /&gt;
   if (z2==7)  {&lt;br /&gt;
      Address_set(x2,y2-13,x2+5,y2);&lt;br /&gt;
      for(p=0; p&amp;lt;84; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
    }&lt;br /&gt;
   if (z2==9)  {&lt;br /&gt;
      Address_set(x2,y2-6,x2+1,y2-2);&lt;br /&gt;
      for(p=0; p&amp;lt;10; p++)  LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(LCD_CS,HIGH); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void newpa(void)&lt;br /&gt;
{&lt;br /&gt;
  unsigned char p;&lt;br /&gt;
  digitalWrite(LCD_CS,LOW); &lt;br /&gt;
  Pant(0x00,0x00);   &lt;br /&gt;
&lt;br /&gt;
  Address_set(0,319,240,319);&lt;br /&gt;
  for(p=0; p&amp;lt;240; p++)  LCD_Write_DATA(0xF8,0x00);&lt;br /&gt;
  Address_set(0,0,240,0);&lt;br /&gt;
  for(p=0; p&amp;lt;240; p++)  LCD_Write_DATA(0xFF,0xFF);&lt;br /&gt;
  Address_set(0,300,240,300);&lt;br /&gt;
  for(p=0; p&amp;lt;240; p++)  LCD_Write_DATA(0xFF,0xFF);&lt;br /&gt;
  Address_set(0,0,0,255);&lt;br /&gt;
  for(p=0; p&amp;lt;255; p++)  LCD_Write_DATA(0xF8,0x00);&lt;br /&gt;
  Address_set(0,255,0,300);&lt;br /&gt;
  for(p=0; p&amp;lt;45; p++)  LCD_Write_DATA(0xF8,0x00);&lt;br /&gt;
  Address_set(239,0,239,255);&lt;br /&gt;
  for(p=0; p&amp;lt;255; p++)  LCD_Write_DATA(0xF8,0x00);&lt;br /&gt;
  Address_set(239,255,239,300);&lt;br /&gt;
  for(p=0; p&amp;lt;45; p++)  LCD_Write_DATA(0xF8,0x00);&lt;br /&gt;
Address_set(50,308,59,311);&lt;br /&gt;
  for(p=0; p&amp;lt;40; p++)  LCD_Write_DATA(0x07,0xE0);&lt;br /&gt;
Address_set(53,305,56,314);&lt;br /&gt;
  for(p=0; p&amp;lt;40; p++)  LCD_Write_DATA(0x07,0xE0);&lt;br /&gt;
Address_set(215,305,239,314);&lt;br /&gt;
  for(p=0; p&amp;lt;250; p++)  LCD_Write_DATA(0xF8,0x00);&lt;br /&gt;
 digitalWrite(LCD_CS,HIGH); &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
 void recan(void)&lt;br /&gt;
{&lt;br /&gt;
  int i,j;&lt;br /&gt;
//  unsigned int m;&lt;br /&gt;
 digitalWrite(LCD_CS,LOW); &lt;br /&gt;
  for(i=0;i&amp;lt;7;i++)&lt;br /&gt;
  {&lt;br /&gt;
//    m=i*3;&lt;br /&gt;
    Address_set(i*5,305,i*5+3,314);&lt;br /&gt;
    for(j=0; j&amp;lt;40; j++)&lt;br /&gt;
    {&lt;br /&gt;
      if (1+i*2&amp;lt;= k) LCD_Write_DATA(0xFF,0xE0); else LCD_Write_DATA(0x00,0x00);&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
Address_set(100,305,124,314);&lt;br /&gt;
  for(i=0; i&amp;lt;250; i++)  LCD_Write_DATA(vh2,vl2);&lt;br /&gt;
Address_set(125,305,149,314);&lt;br /&gt;
  for(i=0; i&amp;lt;250; i++)  LCD_Write_DATA(vh2,vl2);&lt;br /&gt;
 digitalWrite(LCD_CS,HIGH); &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
void AD7843(void)              &lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(CS,LOW);                    &lt;br /&gt;
  WriteCharTo7843(0x90);        &lt;br /&gt;
  digitalWrite(DCLK,HIGH);&lt;br /&gt;
  digitalWrite(DCLK,LOW); &lt;br /&gt;
  TP_Y=ReadFromCharFrom7843();&lt;br /&gt;
  WriteCharTo7843(0xD0);      &lt;br /&gt;
  digitalWrite(DCLK,HIGH);&lt;br /&gt;
  digitalWrite(DCLK,LOW);&lt;br /&gt;
  TP_X=ReadFromCharFrom7843();&lt;br /&gt;
  digitalWrite(CS,HIGH);&lt;br /&gt;
 &lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void setup()&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
  unsigned char p;&lt;br /&gt;
&lt;br /&gt;
  for(p=0;p&amp;lt;20;p++)&lt;br /&gt;
  {&lt;br /&gt;
    pinMode(p,OUTPUT);&lt;br /&gt;
  }&lt;br /&gt;
  pinMode(DOUT,INPUT);&lt;br /&gt;
      x0=1;&lt;br /&gt;
      y0=1;&lt;br /&gt;
 &lt;br /&gt;
  LCD_Init();  &lt;br /&gt;
  newpa();&lt;br /&gt;
  recan();&lt;br /&gt;
  digi(vh2);&lt;br /&gt;
  x3=x3+90;&lt;br /&gt;
  digi(vl2);&lt;br /&gt;
  spistar();  &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void loop()&lt;br /&gt;
{  &lt;br /&gt;
  rx=0;&lt;br /&gt;
  ry=0;&lt;br /&gt;
   &lt;br /&gt;
  for(l3=0;l3&amp;lt;8;l3++)&lt;br /&gt;
    {&lt;br /&gt;
      AD7843();&lt;br /&gt;
&lt;br /&gt;
      lx=0;&lt;br /&gt;
      ly=-1*TP_Y;&lt;br /&gt;
      ly=4095+ly;&lt;br /&gt;
      if(ly &amp;gt; 0) lx=1*TP_X; else {lx=0;ly=0;rx=0;ry=0;l3=9; }&lt;br /&gt;
      rx=rx+lx;&lt;br /&gt;
      ry=ry+ly;&lt;br /&gt;
    }&lt;br /&gt;
      lx=(rx/8-180)/15;&lt;br /&gt;
      ly=(ry/8-240)/11;&lt;br /&gt;
      if(ly &amp;lt; 1) {lx=0;ly=0; }&lt;br /&gt;
      if(lx &amp;lt; 1) lx=0;&lt;br /&gt;
 &lt;br /&gt;
      if(ly &amp;gt; 309-k)&lt;br /&gt;
      {&lt;br /&gt;
        ly=0;&lt;br /&gt;
        if(lx &amp;gt; 200) k=k-2; else if (lx &amp;gt; 160) k=k+2;else&lt;br /&gt;
            if (lx &amp;gt; 100) vh2++; else if (lx &amp;gt; 40) vl2++; else newpa();&lt;br /&gt;
        lx=0;&lt;br /&gt;
        if (k&amp;lt;1) k=1;&lt;br /&gt;
        if (k&amp;gt;13) k=13;&lt;br /&gt;
        if (vh2&amp;gt;255) vh2=0;&lt;br /&gt;
        if (vl2&amp;gt;255) vl2=0;&lt;br /&gt;
        x3=65;&lt;br /&gt;
        digi(vh2);&lt;br /&gt;
        x3=x3+90;&lt;br /&gt;
        digi(vl2);&lt;br /&gt;
        recan();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if(ly &amp;gt; 299-k) ly=299-k;&lt;br /&gt;
      if(ly &amp;gt; 0)&lt;br /&gt;
      {&lt;br /&gt;
        x0=240-lx;&lt;br /&gt;
        if(x0 &amp;gt; 240-k) x0=240-k;&lt;br /&gt;
        y0=ly;&lt;br /&gt;
        l2=(k+1)*(k+1);&lt;br /&gt;
        digitalWrite(LCD_CS,LOW); &lt;br /&gt;
        Address_set(x0,y0,x0+k,y0+k);&lt;br /&gt;
        for (l3=0; l3&amp;lt;l2; l3++) LCD_Write_DATA(vh2,vl2);&lt;br /&gt;
        digitalWrite(LCD_CS,HIGH); &lt;br /&gt;
    }&lt;br /&gt;
    delay (50);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Derivate==&lt;br /&gt;
Es gibt viele Derivate die auf dem Arduino basieren, weil&lt;br /&gt;
* Alle Layouts quelloffen im Internet stehen&lt;br /&gt;
* Der Bootloader sowohl als Quellocde und schon compillert zum Download im Internet stehen&lt;br /&gt;
*Man die IDE für alle Atmel-Chips verwenden kann, die einen Arduino-Bootloader besitzen&lt;br /&gt;
*Man auch eine Arduino-Derivat auf dem Steckbrett zusammbauen kann  &lt;br /&gt;
&lt;br /&gt;
==Tutorial==&lt;br /&gt;
===Ein erster Sketch: Blinkende LED===&lt;br /&gt;
Die meisten aktuellen Arduino-Boards habe einen fest verlötete&lt;br /&gt;
SMD-LED, welche an Pin 13 angeschloßen ist. Diese LED kann von jedem&lt;br /&gt;
Sketch angesteuert werden. Da diese LED meistens vorhanden ist und immer an Pin 13 ageschloßen ist, ist dieses Programm auf den meisten Boards gleich.&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//Blinkende LED&lt;br /&gt;
void setup() {&lt;br /&gt;
pinMode(13,OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
delay(1000);&lt;br /&gt;
digitalWrite(13,HIGH);&lt;br /&gt;
delay(1000);&lt;br /&gt;
digitalWrite(13,LOW);&lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
* [http://www.arduino.cc/en/Main/Software Download der IDE] &lt;br /&gt;
* [http://www.mikrocontroller.net/articles/AVR Artikel zur AVR Prozessor-Serie]&lt;br /&gt;
&lt;br /&gt;
==Literatur==&lt;br /&gt;
* Erik Bartmann: &#039;&#039;Die elektronische Welt mit Arduino entdecken&#039;&#039;, O&#039;Reilly Verlag, 2011, ISBN 978-3-89721-319-7&lt;br /&gt;
* Thomas Brühlmann: &#039;&#039;Arduino: Praxiseinstieg&#039;&#039;, mitp Verlag, 2010, ISBN 978-3-8266-5605-7&lt;br /&gt;
&lt;br /&gt;
==Bezugsquellen(Auswahl)==&lt;br /&gt;
&lt;br /&gt;
===Offiziele Boards===&lt;br /&gt;
* [http://www.watterott.com/de/Boards-Kits/Arduino Watterott.com] &lt;br /&gt;
* [http://www.reichelt.de/ Reichelt.de]&lt;br /&gt;
* [http://www.conrad.de/ Conrad.de]&lt;br /&gt;
* [http://www.tigal.com/ TIGAL.com]&lt;br /&gt;
&lt;br /&gt;
===Lernpakete===&lt;br /&gt;
* [http://www.franzis.de/ Franzis Verlag(Lernpakete)]&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [http://www.arduino.cc/ Website des Arduino-Projekt] &lt;br /&gt;
* [http://arduino.cc/forum/index.php/board,31.0.html Deutsches Arduino-Forum(offiziel)]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AVR-Boards]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Mknot9</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=RPi_als_D/A-Wandler&amp;diff=74527</id>
		<title>RPi als D/A-Wandler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=RPi_als_D/A-Wandler&amp;diff=74527"/>
		<updated>2013-03-08T22:44:45Z</updated>

		<summary type="html">&lt;p&gt;Mknot9: /* Hardwareseitige Ausbauvarianten */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;von M. Knoop&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
Oft wird ein Computer &#039;nur&#039; genutzt um darauf Software ablaufen zu lassen. Dessen Möglichkeit zur Steuerung von elektrischen und mechanischen Geräten wird dabei leicht übersehen.&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel richtet sich daher an Einsteiger, die mit dem [[Raspberry Pi]] (&#039;RPi&#039;) Grundlagen der Computersteuerung mit Relais und [[Spannungsteiler]]n nachvollziehen möchten. Es wird an einem konkreten Beispiel schrittweise dargestellt, wie mittels eines D/A-Wandlers (Digital/Analog-Wandler = Umwandlung von digitalen 1/0 Signale) die Steuerung einer stufenweise veränderbaren Ausgangsspannung aufgebaut werden kann.&lt;br /&gt;
&lt;br /&gt;
= Verwendete Hardware =&lt;br /&gt;
&lt;br /&gt;
== RPi in Kombination mit der &#039;PiFace&#039;-Karte als Bastelplattform ==&lt;br /&gt;
&lt;br /&gt;
Dank der einfachen Bauweise bietet sich der RPi mit seinen frei zugänglichen GPIO-Pins als ideale Bastelplattform an. Trotzdem kann es beim anfänglichen Experimentieren mit Schaltungen öfters zu kleinen Fehlern kommen, die schlimmstenfalls die empfindliche Elektronik des RPi dauerhaft beschädigen können.&lt;br /&gt;
&lt;br /&gt;
Daher wird bei diesem Projekt zusätzlich mit der &#039;PiFace[http://elinux.org/RPi_Expansion_Boards#Piface]&#039;-Karte gearbeitet, die man auf die GPIO-Pins stecken kann. Diese Erweiterungskarte verschaltet die GPIO-Pins auf je 8 digitale Ein- und Ausgänge sowie 2 Relais, die eine galvanische Trennung von Stromkreisen ermöglichen. Damit besteht auch für Einsteiger ein gewisser Schutz für die Steuerelektronik des RPi.&lt;br /&gt;
&lt;br /&gt;
Auch im weiteren Verlauf dieser Einführung soll noch auf eine Trennung der Stromkreise Wert gelegt werden, so dass für erste digitale Schaltexperimente ein Optokoppler genutzt wird. Die spätere Nutzung der &#039;Input Pins&#039; des PiFace um eine Steuerung der D/A-Wandlung durch bestimmte Ereignisse zu ermöglichen, erfolgt ebenfalls passiv.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Auch wenn mit vermeintlich &#039;sicheren&#039; Transformatoren gebastelt wird, muss stets bedacht werden, dass diese an einem 230V-Stromnetz betrieben werden und man eher einmal mehr als weniger prüfen sollte, ob man durch eventuelle Fehler mit lebensgefährlicher Spannung in Berührung kommt!&lt;br /&gt;
&lt;br /&gt;
== Auswahl eines Beispielprojektes ==&lt;br /&gt;
&lt;br /&gt;
Günstige Möglichkeiten ein Gerät zu finden, das mit analogen Spannungen arbeitet, bieten sich u.a. im Spielzeugbereich. Im Grunde eignet sich alles, was mit Batterien oder mit Gleichspannungen unter 24 V betrieben wird.&lt;br /&gt;
&lt;br /&gt;
Da jedoch ein Ziel das Steuern von analogen Spannungen ist, bietet sich insbesondere alles an, bei dem [[Potentiometer]] eingesetzt werden. Einen dieser &#039;Handregler&#039; sollte man übrig haben, da er von seinem Anschlusskabel abgetrennt werden muss, um den oft proprietären Steckanschluss nutzen zu können. In diesem Sinne wird hier eine handelsübliche Spielzeug-Autorennbahn mit Potentiometer-Handreglern genutzt.&lt;br /&gt;
&lt;br /&gt;
== Sonstige Bauteile ==&lt;br /&gt;
&lt;br /&gt;
Für die ersten Grundlagen (s. Teile 2 &amp;amp; 3) genügen bereits rund 2 m isolierter Draht, der nicht aus verdrillten feinen Adern (Litze) bestehen sollte, 50 cm nicht-isolierter Draht, einige niederohmige Widerstände (z.B. je 2 mal 100 Ohm, 80, 60, sowie 20) und ein &#039;Experimentierbrett&#039; (engl. [[Breadboard]]).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Grundlagen und Vorbereitung des Projekts =&lt;br /&gt;
&lt;br /&gt;
== Umwandlung von 1/0 zu Ein/Aus mit einem Relais ==&lt;br /&gt;
&lt;br /&gt;
Vom Prinzip her ist jede Umwandlung eines digitalen 0 oder 1 Signals (das über eine bestimmte Spannungsdifferenz festgelegt ist) in eine (nutzbare) Spannung bereits eine D/A-Wandlung. Dies wird schlicht so realisiert, dass mit einer Eingabe am RPi die Nutzspannung des &#039;Verbrauchers&#039; zunächst einfach an- und ausgeschaltet wird.&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung der zu steuernden Hardware ==&lt;br /&gt;
&lt;br /&gt;
a. Um Fehlerquellen auszuschließen sollte zunächst (und ggf. auch später!) kurz getestet werden, ob der vorhandene Regler wie erwartet funktioniert.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pif_Con9.jpg|thumb|right|400px|Fixierung der Reglerkabel]]&lt;br /&gt;
b. Nach dem Trennen des Reglers von der Einspeisung (und ggf. Ziehen des Netzsteckers) muss das Regler-Kabel abgeschnitten werden (eher nahe beim Regler, da das Kabel bald bis zum Breadboard reichen soll). Die neuen Enden des Einspeiseteils werden abisoliert und auf dem Breadboard diagonal zueinander mit einigen Spalten Abstand fixiert. Auch können bereits die Drähte, die später zum RPi führen, jeweils in den passenden kontaktführenden Spalten eingesteckt werden, z. B. wie rechts zu sehen (die nicht beschrifteten Drähte können vorerst ignoriert werden):&lt;br /&gt;
&lt;br /&gt;
c. Nun bietet sich eine gute Gelegenheit die maximale Spannung am Nutzgerät zu messen. Man verbindet das Regler-Kabel (nun ohne Regler) wieder mit der Einspeisung und die offenen Enden der Drähte mit dem Messgerät, bei dem zunächst ein Messbereich von ca. 10-50 Volt gewählt werden sollte. Dies sollte dann z.B. 14,8 V anzeigen. Natürlich können auch die beiden offenen Enden einen kleinen Moment kurz geschlossen werden, man sollte aber bedenken, dass das zu regelnde Nutzgerät dann die maximal vorgesehene Spannung erhält (hier: maximales Tempo).&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung des RPi ==&lt;br /&gt;
&lt;br /&gt;
Es wird davon ausgegangen, dass entsprechend des zugehörigen &#039;manual&#039; das PiFace bereits auf den RPi gesteckt ist, die nötigen python-Bibliotheken installiert sind und man sich im Terminal-Arbeitsverzeichnis &#039;pi&#039; befindet.&lt;br /&gt;
&lt;br /&gt;
a. Zunächst wird der PiFace-Emulator (im Terminal direkt aus dem Arbeitsverzeichnis) gestartet: &amp;lt;tt&amp;gt;piface/scripts/piface-emulator&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b. Wenn alles richtig installiert wurde, erscheint ein Fenster (unten links), bei dem die vorerst wichtigen blauen Signale am rechten Rand wie folgt angezeigt werden sollten: &lt;br /&gt;
 &lt;br /&gt;
[[Datei:RPi_PiF_em-scs.jpg|400px|Piface-Emulator im default-Zustand]] [[Datei:RPi_PiF_em_scs1.jpg|400px|Piface-Relais 1 auf &#039;1&#039; geschaltet]]&lt;br /&gt;
&lt;br /&gt;
c. Das rechte Fenster ergibt sich, wenn man nun im Fenster auf &amp;quot;Override Enable&amp;quot; und dann &amp;quot;Output Pin 1&amp;quot; klickt. Es müsste ein &amp;quot;Klick&amp;quot; vom Relais 1 zu hören sein sowie der Schaltzustand des unteren Relais 1 (das an den Output Pin 1 gekoppelt ist) auf die Verbindung der beiden unteren Anschlüsse wechseln. Zugleich wird das erste LED-Icon beim Output Pin 1 rot sowie das zugehörige LED-Icon blau.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pif_rel2.png|thumb|right|250px|Schema der Piface-Relais]]&lt;br /&gt;
d. Rechts ist der Schaltzustand der Relais, die zu Beginn genutzt werden, im Grundzustand dargestellt (jeweils der mittlere und obere Kontakt sind kurzgeschlossen, der jeweils untere Kontakt ist frei):&lt;br /&gt;
&lt;br /&gt;
e. Ein weiterer Klick auf &amp;quot;Output Pin 1&amp;quot; versetzt das Relais in den Ausgangszustand, der vor dem nächsten Schritt wieder eingestellt werden sollte.&lt;br /&gt;
&lt;br /&gt;
f. Das Relais lässt sich auch mittels eines Python-Scripts vom RPi aus ansteuern. Dazu wird folgende Textdatei &amp;quot;wandler.py&amp;quot; im Arbeitsverzeichnis abgespeichert und mit dem Befehl &amp;quot;&amp;lt;tt&amp;gt;python wandler.py&amp;lt;/tt&amp;gt;&amp;quot; gestartet:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler.py&lt;br /&gt;
&lt;br /&gt;
 from time import sleep&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
&lt;br /&gt;
 pfio.init()&lt;br /&gt;
&lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
 print &amp;quot;Strom an&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 sleep(2)&lt;br /&gt;
&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Strom aus&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Nach dem Absetzen des Befehls wechselt nun das blaue Signal an Relais 1 für 2 Sekunden und das Relais klickt entsprechend.&lt;br /&gt;
&lt;br /&gt;
== Einsatz eines Relais&#039; zur Umsetzung von Spannungsänderungen ==&lt;br /&gt;
&lt;br /&gt;
a. Ist das Relais wieder im Ausgangszustand, befestigt man nun einen der vom Breadboard führenden Drähte am unteren und einen am mittleren Relaiseingang (im Moment ist die Polarität noch egal). Zunächst sollte nichts passieren (das Relais hält diesen ja Stromkreis noch offen).&lt;br /&gt;
&lt;br /&gt;
b. Startet man aber das Script wieder (&amp;lt;tt&amp;gt;python wandler.py&amp;lt;/tt&amp;gt;) oder klickt auf &#039;Output Pin 1&#039; wird der Nutzstromkreis geschlossen. Nochmals aufgepasst: unser Nutzer erhält wieder die maximal vorgesehene Spannung - also besser vorher im Script &amp;quot;&amp;lt;tt&amp;gt;sleep(0.3)&amp;lt;/tt&amp;gt;&amp;quot; setzen und speichern.&lt;br /&gt;
&lt;br /&gt;
c. Im Prinzip ist damit die programmgesteuerte Umsetzung eines 0/1 Signals in z.B. eine 0V/15V Spannung erreicht.&lt;br /&gt;
&lt;br /&gt;
d. Da wir bald verschiedene Steuerspannungen schalten wollen, geht es jetzt darum herauszufinden, bei welcher Spannung unser Nutzgerät gerade noch bewegt wird. Dies probiert man aus - mit dem kleinsten Widerstand beginnend: indem einer der Drähte in eine freie Breadboardspalte gesteckt wird und aus dieser Spalte der Widerstand zu dem &#039;alten&#039; Steckplatz des Drahtes geführt wird. Nun startet man jeweils das Script bis der Widerstand so hoch ist, dass die Anlaufspannung beim Nutzgerätes gut ausreicht, eine Reaktion des Nutzgerät (Fahrzeug bewegt sich) zu bewirken (z.B. bei 50 Ohm beträgt der Strom im Mittel ca. 130 mA während ohne 190 mA fließen).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Ansteuerung von 3 Schaltstufen =&lt;br /&gt;
&lt;br /&gt;
== Kombination von 2 Relais ==&lt;br /&gt;
&lt;br /&gt;
[[Bild:ZrelMww2.png|thumb|right|250px|Beschaltung der Relais]] a. Die einfachste Stufe der weiteren Verschaltung erreicht man, indem der Widerstand mit einem 2. Relais überbrückt wird. Relais 1 kann dann als &#039;Hauptschalter&#039;, Relais 2 als Spannungsumschalter genutzt werden:&lt;br /&gt;
&lt;br /&gt;
b. Diese Beschaltung kann sogleich mit dem PiFace-Emulator ausprobiert werden. Damit können wir bereits 3 Schaltstufen steuern: keine, verminderte und volle Spannung.&lt;br /&gt;
&lt;br /&gt;
c. Theoretisch ließe sich auch noch eine 4. Spannungsstufe erzeugen, da mit 2 &#039;Bits&#039; (Ein/Aus bei 2 Relais) bereits 4 verschiedene Signale darstellbar sind. Beim jetzigen Aufbau werden aber lediglich die (pin1,pin2)-Signale (0,0), (1,0) und (1,1) &#039;genutzt&#039;, da Relais 1 als Hauptschalter vorgesehen ist und die Kombination (0,1) so nicht ausgewertet wird.&lt;br /&gt;
&lt;br /&gt;
== Programmgesteuerte Schaltung von 2 Relais ==&lt;br /&gt;
&lt;br /&gt;
a. Mit einem veränderten python-Script &amp;quot;wandler2.py&amp;quot; ist auch die programmgesteuerte Schaltung möglich. Dabei werden zusätzlich die Tasten 1 und 2 des PiFace genutzt, um nach dem Start des Scripts (&amp;lt;tt&amp;gt;python wandler2.py&amp;lt;/tt&amp;gt;) den Hauptschalter (Relais 1) zu steuern:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler2.py&lt;br /&gt;
 &lt;br /&gt;
 from time import sleep&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
 pfio.init()&lt;br /&gt;
 &lt;br /&gt;
 taste_1=0&lt;br /&gt;
 taste_2=0&lt;br /&gt;
 intervall_a=0.1&lt;br /&gt;
 intervall_b=0.5&lt;br /&gt;
 # Die Intervalle bestimmen die Schaltzeit für volle/verminderte Spannung&lt;br /&gt;
 &lt;br /&gt;
 print &amp;quot;Zum Start Taste 1 drücken, zum Stoppen Taste 2&amp;quot;&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 while taste_1 == 0:&lt;br /&gt;
   sleep(intervall_a)&lt;br /&gt;
   taste_1=pfio.digital_read(1)&lt;br /&gt;
&lt;br /&gt;
 # Der o.g. &#039;sleep&#039;-Befehl bestimmt die Abfragepausen für Taste 1&lt;br /&gt;
 &lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
 print &amp;quot;Strom an!&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 while taste_2 == 0:&lt;br /&gt;
   pfio.digital_write(2,1)&lt;br /&gt;
   sleep(intervall_a)&lt;br /&gt;
   pfio.digital_write(2,0)&lt;br /&gt;
   sleep(intervall_b)&lt;br /&gt;
   taste_2=pfio.digital_read(2)&lt;br /&gt;
 &lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Strom aus!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
b. Falls beim Ausprobieren von Script-Änderungen mal was schief geht, kann das Script stets auch mit der Tastenkombination (CTRL-C) gestoppt werden. U.U. muss dann noch zusätzlich Relais 1 und/oder 2 via Emulator zurückgesetzt werden.&lt;br /&gt;
&lt;br /&gt;
c. Beim Verändern des Scripts fällt bald auf, dass die bisherige Programmsteuerung keine direkte Möglichkeit vorsieht, auf Ereignisse zu reagieren. Immerhin wird ein mechanisches Gerät gesteuert, bei dem mit Ausfällen, Fertigungstoleranzen, Umwelteinflüssen etc. zu rechnen ist (im Script wird dies bislang &#039;nur&#039; durch die Abbruchbedingung &#039;Taste 2&#039; berücksichtigt).&lt;br /&gt;
&lt;br /&gt;
== Einfache Sensor-Signale als steuernde Elemente eines Programms ==&lt;br /&gt;
&lt;br /&gt;
a. Eine wichtige Anwendung von D/A-Steuerungen ist die mögliche Reaktion dieser Steuerung auf &#039;äußere&#039; Ereignisse, die z.B. mit Hilfe von Sensoren leistbar ist.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Einf_Sens.jpg|thumb|right|250px|einfacher Sensor]]b. Für unsere Zwecke genügt zunächst ein sehr einfacher Sensor, der ein 0- oder 1-Signal liefert und idealerweise direkt am &#039;Input Pin 1&#039; des PiFace angeschlossen werden kann. So liegt beim Input Pin 1 das Signal &#039;1&#039; an, wenn eine Verbindung zu &#039;Input GND&#039; besteht.&lt;br /&gt;
Z.B. können 2 unisolierte Drähte so platziert werden, dass ein vorbeifahrendes Fahrzeug einen von ihnen genügend bewegt um den Kontakt kurze Zeit zu öffnen. Genau dann liefert dieser &#039;Sensor&#039; das Signal &#039;0&#039;. Eine - die Schwerkraft nutzende - mögliche Bauform ist rechts abgebildet ;-)&lt;br /&gt;
&lt;br /&gt;
c. Natürlich werden zusätzlich 2 isolierte Drähte benötigt, um jeden der beiden offenen Drähte geschützt mit Input Pin 1 und Input GND zu verbinden.&lt;br /&gt;
&lt;br /&gt;
d. Bei jeder Durchfahrt liefert der Sensor nun ein &#039;0&#039;-Signal, was im Script sowohl für eine Zeitmessung als auch für ein &#039;Schaltintervall-Array&#039; genutzt werden kann. Dort können abwechselnd für beide Spannungen Zeiten (die in etwa zum jeweiligen Streckenabschnitt passen) &#039;programmiert&#039; werden. Statt Taste 1 wird nun der Sensor ausgewertet (wobei Taste 1 als Sensor-Ersatz insoweit genutzt werden kann, dass sie gedrückt bleiben bzw. kurz losgelassen werden muss). Zur genaueren Zeitmessung wird noch das modul &#039;clock&#039; benötigt. &amp;quot;&amp;lt;tt&amp;gt;wandler3.py&amp;lt;/tt&amp;gt;&amp;quot; könnte also so aussehen:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler3.py&lt;br /&gt;
 &lt;br /&gt;
 from time import clock&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
 sensor_1=1&lt;br /&gt;
 sensor_2=0&lt;br /&gt;
 rundenzahl=0&lt;br /&gt;
 v_wechsel=0&lt;br /&gt;
 vorrunde=0&lt;br /&gt;
 index_zaehler=1&lt;br /&gt;
 &lt;br /&gt;
 zeit_array=[0,0.2,0.4,0.2,0.4,0.2,0.4,0.2,5,0.2,6]&lt;br /&gt;
 # dieses array enthält die sek. bis zum Spannungswechsel&lt;br /&gt;
&lt;br /&gt;
 array_laenge=9&lt;br /&gt;
 # legt fest, wie viel Werte des arrays genutzt werden sollen&lt;br /&gt;
 &lt;br /&gt;
 sensor_aus=1.3&lt;br /&gt;
 # bis der Sensor sicher in die Ruhestellung kippt, wird er nicht ausgelesen&lt;br /&gt;
  &lt;br /&gt;
 pfio.init()&lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
&lt;br /&gt;
 # das Fahrzeug wird langsam zum Start (=Sensor) bewegt&lt;br /&gt;
 while sensor_1 == 1 :&lt;br /&gt;
   sensor_1=pfio.digital_read(1)&lt;br /&gt;
  &lt;br /&gt;
 print &amp;quot;fliegender Start... zum Beenden Taste 2 drücken&amp;quot;&lt;br /&gt;
 print &amp;quot;Runde Nr., Ges.Zeit, Rundenzeit, mittlere Rundenzeit&amp;quot;&lt;br /&gt;
 start_zeit=clock()&lt;br /&gt;
 runden_start=start_zeit&lt;br /&gt;
  &lt;br /&gt;
 while sensor_2 == 0 :&lt;br /&gt;
   sensor_2=pfio.digital_read(2)&lt;br /&gt;
   v_wechsel=1-v_wechsel&lt;br /&gt;
   pfio.digital_write(2,v_wechsel)&lt;br /&gt;
   sensor_zeit=clock()&lt;br /&gt;
  &lt;br /&gt;
   while zeit_array[index_zaehler]+sensor_zeit &amp;gt; clock() :&lt;br /&gt;
     if runden_start+sensor_aus &amp;lt; clock() :&lt;br /&gt;
 &lt;br /&gt;
       sensor_1=pfio.digital_read(1) &lt;br /&gt;
       if sensor_1 == 0 :&lt;br /&gt;
         rundenzahl=rundenzahl+1&lt;br /&gt;
         runden_start=clock()&lt;br /&gt;
         zeit=runden_start-start_zeit&lt;br /&gt;
         print rundenzahl, zeit, zeit-vorrunde, zeit/rundenzahl&lt;br /&gt;
         vorrunde=zeit&lt;br /&gt;
         sensor_zeit=0&lt;br /&gt;
         index_zaehler=0&lt;br /&gt;
         v_wechsel=0&lt;br /&gt;
  &lt;br /&gt;
   index_zaehler=index_zaehler+1&lt;br /&gt;
   if index_zaehler &amp;gt; array_laenge :&lt;br /&gt;
     sensor_2=1&lt;br /&gt;
     print &amp;quot;array-Ende erreicht!&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Outp 1 &amp;amp; 2 auf 0!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wird das Array-Ende erreicht, wurden entweder zu wenige Einträge vorgesehen oder es befindet sich kein Fahrzeug (mehr) auf der Strecke, das den Sensor und damit des Zurücksetzen des Arrays auslösen konnte.&lt;br /&gt;
&lt;br /&gt;
e. Das Array ist an die jeweilige Strecke anzupassen, wobei der vorderste Eintrag ungenutzt bleibt und dann mit der Dauer für maximale Spannung begonnen wird. Solange man mit Relais arbeitet, sollten die Schaltzeiten nicht zu kurz sein (&amp;gt;0.1 sek.), da diese eine gewisse mechanische Trägheit besitzen.&lt;br /&gt;
&lt;br /&gt;
f. Eben diese mechanische Beschaffenheit der Relais (Verschleiß) ist auch ein guter Grund, auf &#039;volle&#039; digitale Signalumwandlung umzustellen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Optokoppler als Ersatz für Relais =&lt;br /&gt;
&lt;br /&gt;
Ähnlich wie ein Relais dient ein [[Optokoppler]] dazu, eine Signalübertragung zwischen zwei getrennten Stromkreisen zu ermöglichen. Bei diesem Projekt liegt der Einsatz von Optokopplern nahe, da sie schneller schalten und keine beweglichen Teile besitzen. Für unsere Zwecke benötigen wir nun als zusätzliche Elemente: Optokoppler (CNY 17-4), npn-[[Transistor]]en (BC 337-40) zur Signalverstärkung sowie einige Widerstände im Bereich von 2k und 400 Ohm. &lt;br /&gt;
&lt;br /&gt;
== Kaskadierung von Transistoren zur Signalverstärkung ==&lt;br /&gt;
&lt;br /&gt;
a. Entsprechend Schritt 2.4.d. (ein Relais bei 50 Ohm) wird zunächst ein [[Optokoppler]] eingesetzt, dessen Signal durch einen Transistor verstärkt wird, um die &#039;Grundspannung&#039; zu schalten (Pin 3 und 6 beim Optokoppler sollten unbeschaltet bleiben, allein der &#039;Lichtstrom&#039; reicht für eine Ansteuerung aus):&lt;br /&gt;
&lt;br /&gt;
[[Bild:PiF_CNY_BC_1.png|400px|Optokoppler mit Transistor]]&lt;br /&gt;
&lt;br /&gt;
b. Da immer mit einer gewissen Toleranz bei allen Komponenten zu rechnen ist, kann es sein, dass u.U. die Widerstände etwas größer oder kleiner gewählt werden müssen. Beim Ausprobieren sollte man hier in 10% Schritten variieren.&lt;br /&gt;
&lt;br /&gt;
c. Bei Austesten mit Emulator oder Script ist auch zu beachten, dass nun &#039;Output Pin 8&#039; genutzt wird, da dieser nicht mit den Relais verschaltet ist.&lt;br /&gt;
&lt;br /&gt;
== Umsetzung von 3 Schaltstufen mit Optokopplern ==&lt;br /&gt;
&lt;br /&gt;
a. Entsprechend dem Vorgehen beim Relais kann nun auch der kleine Widerstand zusätzlich beschaltet werden um seine gesteuerte Überbrückung zu ermöglichen. Da hier eine relativ geringe Spannung aufgeschaltet wird, kann zu Beginn eine Diode eingesetzt werden, die die Schaltstufe &#039;maximale Spannung&#039; anzeigt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:SmPiFu2ou2T.png|400px|Kombination von 2 Optokopplern]]&lt;br /&gt;
&lt;br /&gt;
b. Vor dem Testen ist wieder zu beachten, dass nun zusätzlich &#039;Output Pin 7&#039; genutzt wird (statt Output Pin 2).&lt;br /&gt;
&lt;br /&gt;
c. Neben dem Weglassen der Diode (was die Maximalgeschwindigkeit leicht erhöht), können auch statt der 400 Ohm Widerstände 1k-Werte oder höher gewählt werden, wenn dadurch der jeweilige Basisstrom noch hoch genug ist. Im vorliegenden Fall war erst ab 400 Ohm keine weitere Tempoerhöhung mehr feststellbar.&lt;br /&gt;
&lt;br /&gt;
d. Eine mögliche Realisierung sieht so aus: http://youtu.be/xQ7N-PrIULk&lt;br /&gt;
&lt;br /&gt;
== Zusätzliche Erhöhung der Schaltstufen bei D/A-Wandlern ==&lt;br /&gt;
&lt;br /&gt;
a. Zwar benötigen wir in unserem speziellen Beispiel eine &#039;Grundspannung&#039;, die sich dahingehend auswirkt, dass - wie unter 3.1.c. erwähnt - eine Signalkombination nicht ausgewertet wird, aber mit jeder weiteren Schaltstufe würde sich dieses Problem (theoretisch) relativieren, da bei geschickter Auswahl der Widerstände (z.B. im Verhältnis 1 zu 2) jeweils eine Verdoppelung der Kombinationsmöglichkeiten erreichbar ist.&lt;br /&gt;
&lt;br /&gt;
b. Wird hier der 50 Ohm Widerstand asymmetrisch geteilt (z.B. 15 + 35 Ohm, s.a. [[Spannungsteiler]]) um dort ein weiteres Signal umsetzen zu können, ergeben sich direkt folgende 5 Schaltstufen (aus, 50, 35, 15 und 0 Ohm) u.s.w.:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Sm3ou3t2.png|400px|Erhöhung der Schaltstufen]]&lt;br /&gt;
&lt;br /&gt;
c. Zur Ansteuerung dieser Schaltstufen wäre das Script so zu ändern, dass nun zwischen mehr als 2 Stufen gewechselt werden kann und im Array entsprechende Zusatzdaten vorgegeben und ausgelesen werden. Mehr als diese Stufen sind im konkreten Fall aber nicht sinnvoll, da die entstehende Verlustleistung in der Schaltung die maximal verfügbare Leistung reduziert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Weiterführende Ideen =&lt;br /&gt;
&lt;br /&gt;
Die Ausbaumöglichkeiten dieses Projektes sind vielfältig:&lt;br /&gt;
&lt;br /&gt;
== Hardwareseitige Ausbauvarianten ==&lt;br /&gt;
&lt;br /&gt;
- beispielhafte Umsetzung einer differenzierten Abstufung mittels eines möglichst oft durch 2 teilbaren Anfangswertes und der Teiler (640 Ohm, 320, 160...) oder in 10er Potenzen. Denkbar wäre auch eine Parallelschaltung der &#039;zuschaltbaren&#039; Widerstände [http://de.wikipedia.org/wiki/Digital-Analog-Umsetzer#Realisierungsverfahren] - je nach Umsetzung wären natürlich die Vorwiderstände der Transistoren anzupassen;&lt;br /&gt;
&lt;br /&gt;
- Nachbau des Projekts mit einem Mikrocontroller (ggf. mit LCD-Anzeige);&lt;br /&gt;
&lt;br /&gt;
- Umbau der Steuerung mit dem Ziel, sie direkt an die GPIO-Pins des RPi anzuschließen;&lt;br /&gt;
&lt;br /&gt;
- Entwurf einer Zusatzschaltung, die in diesem Beispiel eine Rückmeldung liefert, ob ein Verbraucher aktiv ist oder nicht (Fahrzeug noch auf der Strecke?);&lt;br /&gt;
&lt;br /&gt;
- Entwurf einer Zusatzschaltung, die erkennt wie viel Strom fliesst: damit wären Rückschlüsse auf den Streckenverlauf möglich (Kurve=etwas mehr Strom, Steigung=noch mehr Strom nötig, etc.) und so auch eine programmgesteuerte Optimierung der Array-Schaltzeiten dankbar; &lt;br /&gt;
&lt;br /&gt;
- Einsatz anderer Sensortechniken und/oder mehrerer Sensoren zur Optimierung der Schnelligkeit oder parallelen Steuerung eines 2. Fahrzeuges;&lt;br /&gt;
&lt;br /&gt;
== Softwareseitige Ausbauvarianten ==&lt;br /&gt;
&lt;br /&gt;
- Optimierung des Scripts, indem die Sensor-Abfrage über einen &#039;Listener&#039; umgesetzt wird;&lt;br /&gt;
&lt;br /&gt;
- Erweiterung des Scripts um eine GUI mit Hilfe der python-lib Tkinter, um einen Nutzerzugriff auf das Steuerarray und/oder eine &#039;Verwaltung&#039; mehrerer Fahrzeuge;&lt;br /&gt;
&lt;br /&gt;
- Einbindung eines Web-Interface um eine &#039;Fernsteuerung&#039; zu ermöglichen...&lt;br /&gt;
&lt;br /&gt;
...in jedem Fall: viel Spaß beim Basteln!&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [http://hackaday.com/2013/01/23/replacement-controllers-for-slot-car-racing/ andere Variante der Ersetzung der Handregler bei &#039;hackaday&#039;] &lt;br /&gt;
* [https://docs.google.com/folder/d/0B-UAZ9CyJCLGQjJ3RDlqa2pqaDg/edit?pli=1&amp;amp;docId=0B-UAZ9CyJCLGNmpMeVpyYlZJUWc Relaisschaltung mit pädagogischer Erweiterung der Universität Manchester (englischspr.)]&lt;br /&gt;
* [http://elinux.org/RPi_Projects englischsp. Projektliste zum RPi]&lt;br /&gt;
* [http://elinux.org/RPi_Projects/PiFace_controlling_a_slot-car paralleler englischsp. Bericht des Autors zum RPi mit anderem Schwerpunkt] &lt;br /&gt;
* [http://www.mikrocontroller.net/articles/GhostCarProjekt Verlagerung der gesamten Steuerelektronik ins Fahrzeug]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Raspberry Pi]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Mknot9</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=RPi_als_D/A-Wandler&amp;diff=74522</id>
		<title>RPi als D/A-Wandler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=RPi_als_D/A-Wandler&amp;diff=74522"/>
		<updated>2013-03-08T22:33:53Z</updated>

		<summary type="html">&lt;p&gt;Mknot9: /* Hardwareseitige Ausbauvarianten */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;von M. Knoop&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
Oft wird ein Computer &#039;nur&#039; genutzt um darauf Software ablaufen zu lassen. Dessen Möglichkeit zur Steuerung von elektrischen und mechanischen Geräten wird dabei leicht übersehen.&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel richtet sich daher an Einsteiger, die mit dem [[Raspberry Pi]] (&#039;RPi&#039;) Grundlagen der Computersteuerung mit Relais und [[Spannungsteiler]]n nachvollziehen möchten. Es wird an einem konkreten Beispiel schrittweise dargestellt, wie mittels eines D/A-Wandlers (Digital/Analog-Wandler = Umwandlung von digitalen 1/0 Signale) die Steuerung einer stufenweise veränderbaren Ausgangsspannung aufgebaut werden kann.&lt;br /&gt;
&lt;br /&gt;
= Verwendete Hardware =&lt;br /&gt;
&lt;br /&gt;
== RPi in Kombination mit der &#039;PiFace&#039;-Karte als Bastelplattform ==&lt;br /&gt;
&lt;br /&gt;
Dank der einfachen Bauweise bietet sich der RPi mit seinen frei zugänglichen GPIO-Pins als ideale Bastelplattform an. Trotzdem kann es beim anfänglichen Experimentieren mit Schaltungen öfters zu kleinen Fehlern kommen, die schlimmstenfalls die empfindliche Elektronik des RPi dauerhaft beschädigen können.&lt;br /&gt;
&lt;br /&gt;
Daher wird bei diesem Projekt zusätzlich mit der &#039;PiFace[http://elinux.org/RPi_Expansion_Boards#Piface]&#039;-Karte gearbeitet, die man auf die GPIO-Pins stecken kann. Diese Erweiterungskarte verschaltet die GPIO-Pins auf je 8 digitale Ein- und Ausgänge sowie 2 Relais, die eine galvanische Trennung von Stromkreisen ermöglichen. Damit besteht auch für Einsteiger ein gewisser Schutz für die Steuerelektronik des RPi.&lt;br /&gt;
&lt;br /&gt;
Auch im weiteren Verlauf dieser Einführung soll noch auf eine Trennung der Stromkreise Wert gelegt werden, so dass für erste digitale Schaltexperimente ein Optokoppler genutzt wird. Die spätere Nutzung der &#039;Input Pins&#039; des PiFace um eine Steuerung der D/A-Wandlung durch bestimmte Ereignisse zu ermöglichen, erfolgt ebenfalls passiv.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Auch wenn mit vermeintlich &#039;sicheren&#039; Transformatoren gebastelt wird, muss stets bedacht werden, dass diese an einem 230V-Stromnetz betrieben werden und man eher einmal mehr als weniger prüfen sollte, ob man durch eventuelle Fehler mit lebensgefährlicher Spannung in Berührung kommt!&lt;br /&gt;
&lt;br /&gt;
== Auswahl eines Beispielprojektes ==&lt;br /&gt;
&lt;br /&gt;
Günstige Möglichkeiten ein Gerät zu finden, das mit analogen Spannungen arbeitet, bieten sich u.a. im Spielzeugbereich. Im Grunde eignet sich alles, was mit Batterien oder mit Gleichspannungen unter 24 V betrieben wird.&lt;br /&gt;
&lt;br /&gt;
Da jedoch ein Ziel das Steuern von analogen Spannungen ist, bietet sich insbesondere alles an, bei dem [[Potentiometer]] eingesetzt werden. Einen dieser &#039;Handregler&#039; sollte man übrig haben, da er von seinem Anschlusskabel abgetrennt werden muss, um den oft proprietären Steckanschluss nutzen zu können. In diesem Sinne wird hier eine handelsübliche Spielzeug-Autorennbahn mit Potentiometer-Handreglern genutzt.&lt;br /&gt;
&lt;br /&gt;
== Sonstige Bauteile ==&lt;br /&gt;
&lt;br /&gt;
Für die ersten Grundlagen (s. Teile 2 &amp;amp; 3) genügen bereits rund 2 m isolierter Draht, der nicht aus verdrillten feinen Adern (Litze) bestehen sollte, 50 cm nicht-isolierter Draht, einige niederohmige Widerstände (z.B. je 2 mal 100 Ohm, 80, 60, sowie 20) und ein &#039;Experimentierbrett&#039; (engl. [[Breadboard]]).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Grundlagen und Vorbereitung des Projekts =&lt;br /&gt;
&lt;br /&gt;
== Umwandlung von 1/0 zu Ein/Aus mit einem Relais ==&lt;br /&gt;
&lt;br /&gt;
Vom Prinzip her ist jede Umwandlung eines digitalen 0 oder 1 Signals (das über eine bestimmte Spannungsdifferenz festgelegt ist) in eine (nutzbare) Spannung bereits eine D/A-Wandlung. Dies wird schlicht so realisiert, dass mit einer Eingabe am RPi die Nutzspannung des &#039;Verbrauchers&#039; zunächst einfach an- und ausgeschaltet wird.&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung der zu steuernden Hardware ==&lt;br /&gt;
&lt;br /&gt;
a. Um Fehlerquellen auszuschließen sollte zunächst (und ggf. auch später!) kurz getestet werden, ob der vorhandene Regler wie erwartet funktioniert.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pif_Con9.jpg|thumb|right|400px|Fixierung der Reglerkabel]]&lt;br /&gt;
b. Nach dem Trennen des Reglers von der Einspeisung (und ggf. Ziehen des Netzsteckers) muss das Regler-Kabel abgeschnitten werden (eher nahe beim Regler, da das Kabel bald bis zum Breadboard reichen soll). Die neuen Enden des Einspeiseteils werden abisoliert und auf dem Breadboard diagonal zueinander mit einigen Spalten Abstand fixiert. Auch können bereits die Drähte, die später zum RPi führen, jeweils in den passenden kontaktführenden Spalten eingesteckt werden, z. B. wie rechts zu sehen (die nicht beschrifteten Drähte können vorerst ignoriert werden):&lt;br /&gt;
&lt;br /&gt;
c. Nun bietet sich eine gute Gelegenheit die maximale Spannung am Nutzgerät zu messen. Man verbindet das Regler-Kabel (nun ohne Regler) wieder mit der Einspeisung und die offenen Enden der Drähte mit dem Messgerät, bei dem zunächst ein Messbereich von ca. 10-50 Volt gewählt werden sollte. Dies sollte dann z.B. 14,8 V anzeigen. Natürlich können auch die beiden offenen Enden einen kleinen Moment kurz geschlossen werden, man sollte aber bedenken, dass das zu regelnde Nutzgerät dann die maximal vorgesehene Spannung erhält (hier: maximales Tempo).&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung des RPi ==&lt;br /&gt;
&lt;br /&gt;
Es wird davon ausgegangen, dass entsprechend des zugehörigen &#039;manual&#039; das PiFace bereits auf den RPi gesteckt ist, die nötigen python-Bibliotheken installiert sind und man sich im Terminal-Arbeitsverzeichnis &#039;pi&#039; befindet.&lt;br /&gt;
&lt;br /&gt;
a. Zunächst wird der PiFace-Emulator (im Terminal direkt aus dem Arbeitsverzeichnis) gestartet: &amp;lt;tt&amp;gt;piface/scripts/piface-emulator&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b. Wenn alles richtig installiert wurde, erscheint ein Fenster (unten links), bei dem die vorerst wichtigen blauen Signale am rechten Rand wie folgt angezeigt werden sollten: &lt;br /&gt;
 &lt;br /&gt;
[[Datei:RPi_PiF_em-scs.jpg|400px|Piface-Emulator im default-Zustand]] [[Datei:RPi_PiF_em_scs1.jpg|400px|Piface-Relais 1 auf &#039;1&#039; geschaltet]]&lt;br /&gt;
&lt;br /&gt;
c. Das rechte Fenster ergibt sich, wenn man nun im Fenster auf &amp;quot;Override Enable&amp;quot; und dann &amp;quot;Output Pin 1&amp;quot; klickt. Es müsste ein &amp;quot;Klick&amp;quot; vom Relais 1 zu hören sein sowie der Schaltzustand des unteren Relais 1 (das an den Output Pin 1 gekoppelt ist) auf die Verbindung der beiden unteren Anschlüsse wechseln. Zugleich wird das erste LED-Icon beim Output Pin 1 rot sowie das zugehörige LED-Icon blau.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pif_rel2.png|thumb|right|250px|Schema der Piface-Relais]]&lt;br /&gt;
d. Rechts ist der Schaltzustand der Relais, die zu Beginn genutzt werden, im Grundzustand dargestellt (jeweils der mittlere und obere Kontakt sind kurzgeschlossen, der jeweils untere Kontakt ist frei):&lt;br /&gt;
&lt;br /&gt;
e. Ein weiterer Klick auf &amp;quot;Output Pin 1&amp;quot; versetzt das Relais in den Ausgangszustand, der vor dem nächsten Schritt wieder eingestellt werden sollte.&lt;br /&gt;
&lt;br /&gt;
f. Das Relais lässt sich auch mittels eines Python-Scripts vom RPi aus ansteuern. Dazu wird folgende Textdatei &amp;quot;wandler.py&amp;quot; im Arbeitsverzeichnis abgespeichert und mit dem Befehl &amp;quot;&amp;lt;tt&amp;gt;python wandler.py&amp;lt;/tt&amp;gt;&amp;quot; gestartet:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler.py&lt;br /&gt;
&lt;br /&gt;
 from time import sleep&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
&lt;br /&gt;
 pfio.init()&lt;br /&gt;
&lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
 print &amp;quot;Strom an&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 sleep(2)&lt;br /&gt;
&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Strom aus&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Nach dem Absetzen des Befehls wechselt nun das blaue Signal an Relais 1 für 2 Sekunden und das Relais klickt entsprechend.&lt;br /&gt;
&lt;br /&gt;
== Einsatz eines Relais&#039; zur Umsetzung von Spannungsänderungen ==&lt;br /&gt;
&lt;br /&gt;
a. Ist das Relais wieder im Ausgangszustand, befestigt man nun einen der vom Breadboard führenden Drähte am unteren und einen am mittleren Relaiseingang (im Moment ist die Polarität noch egal). Zunächst sollte nichts passieren (das Relais hält diesen ja Stromkreis noch offen).&lt;br /&gt;
&lt;br /&gt;
b. Startet man aber das Script wieder (&amp;lt;tt&amp;gt;python wandler.py&amp;lt;/tt&amp;gt;) oder klickt auf &#039;Output Pin 1&#039; wird der Nutzstromkreis geschlossen. Nochmals aufgepasst: unser Nutzer erhält wieder die maximal vorgesehene Spannung - also besser vorher im Script &amp;quot;&amp;lt;tt&amp;gt;sleep(0.3)&amp;lt;/tt&amp;gt;&amp;quot; setzen und speichern.&lt;br /&gt;
&lt;br /&gt;
c. Im Prinzip ist damit die programmgesteuerte Umsetzung eines 0/1 Signals in z.B. eine 0V/15V Spannung erreicht.&lt;br /&gt;
&lt;br /&gt;
d. Da wir bald verschiedene Steuerspannungen schalten wollen, geht es jetzt darum herauszufinden, bei welcher Spannung unser Nutzgerät gerade noch bewegt wird. Dies probiert man aus - mit dem kleinsten Widerstand beginnend: indem einer der Drähte in eine freie Breadboardspalte gesteckt wird und aus dieser Spalte der Widerstand zu dem &#039;alten&#039; Steckplatz des Drahtes geführt wird. Nun startet man jeweils das Script bis der Widerstand so hoch ist, dass die Anlaufspannung beim Nutzgerätes gut ausreicht, eine Reaktion des Nutzgerät (Fahrzeug bewegt sich) zu bewirken (z.B. bei 50 Ohm beträgt der Strom im Mittel ca. 130 mA während ohne 190 mA fließen).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Ansteuerung von 3 Schaltstufen =&lt;br /&gt;
&lt;br /&gt;
== Kombination von 2 Relais ==&lt;br /&gt;
&lt;br /&gt;
[[Bild:ZrelMww2.png|thumb|right|250px|Beschaltung der Relais]] a. Die einfachste Stufe der weiteren Verschaltung erreicht man, indem der Widerstand mit einem 2. Relais überbrückt wird. Relais 1 kann dann als &#039;Hauptschalter&#039;, Relais 2 als Spannungsumschalter genutzt werden:&lt;br /&gt;
&lt;br /&gt;
b. Diese Beschaltung kann sogleich mit dem PiFace-Emulator ausprobiert werden. Damit können wir bereits 3 Schaltstufen steuern: keine, verminderte und volle Spannung.&lt;br /&gt;
&lt;br /&gt;
c. Theoretisch ließe sich auch noch eine 4. Spannungsstufe erzeugen, da mit 2 &#039;Bits&#039; (Ein/Aus bei 2 Relais) bereits 4 verschiedene Signale darstellbar sind. Beim jetzigen Aufbau werden aber lediglich die (pin1,pin2)-Signale (0,0), (1,0) und (1,1) &#039;genutzt&#039;, da Relais 1 als Hauptschalter vorgesehen ist und die Kombination (0,1) so nicht ausgewertet wird.&lt;br /&gt;
&lt;br /&gt;
== Programmgesteuerte Schaltung von 2 Relais ==&lt;br /&gt;
&lt;br /&gt;
a. Mit einem veränderten python-Script &amp;quot;wandler2.py&amp;quot; ist auch die programmgesteuerte Schaltung möglich. Dabei werden zusätzlich die Tasten 1 und 2 des PiFace genutzt, um nach dem Start des Scripts (&amp;lt;tt&amp;gt;python wandler2.py&amp;lt;/tt&amp;gt;) den Hauptschalter (Relais 1) zu steuern:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler2.py&lt;br /&gt;
 &lt;br /&gt;
 from time import sleep&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
 pfio.init()&lt;br /&gt;
 &lt;br /&gt;
 taste_1=0&lt;br /&gt;
 taste_2=0&lt;br /&gt;
 intervall_a=0.1&lt;br /&gt;
 intervall_b=0.5&lt;br /&gt;
 # Die Intervalle bestimmen die Schaltzeit für volle/verminderte Spannung&lt;br /&gt;
 &lt;br /&gt;
 print &amp;quot;Zum Start Taste 1 drücken, zum Stoppen Taste 2&amp;quot;&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 while taste_1 == 0:&lt;br /&gt;
   sleep(intervall_a)&lt;br /&gt;
   taste_1=pfio.digital_read(1)&lt;br /&gt;
&lt;br /&gt;
 # Der o.g. &#039;sleep&#039;-Befehl bestimmt die Abfragepausen für Taste 1&lt;br /&gt;
 &lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
 print &amp;quot;Strom an!&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 while taste_2 == 0:&lt;br /&gt;
   pfio.digital_write(2,1)&lt;br /&gt;
   sleep(intervall_a)&lt;br /&gt;
   pfio.digital_write(2,0)&lt;br /&gt;
   sleep(intervall_b)&lt;br /&gt;
   taste_2=pfio.digital_read(2)&lt;br /&gt;
 &lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Strom aus!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
b. Falls beim Ausprobieren von Script-Änderungen mal was schief geht, kann das Script stets auch mit der Tastenkombination (CTRL-C) gestoppt werden. U.U. muss dann noch zusätzlich Relais 1 und/oder 2 via Emulator zurückgesetzt werden.&lt;br /&gt;
&lt;br /&gt;
c. Beim Verändern des Scripts fällt bald auf, dass die bisherige Programmsteuerung keine direkte Möglichkeit vorsieht, auf Ereignisse zu reagieren. Immerhin wird ein mechanisches Gerät gesteuert, bei dem mit Ausfällen, Fertigungstoleranzen, Umwelteinflüssen etc. zu rechnen ist (im Script wird dies bislang &#039;nur&#039; durch die Abbruchbedingung &#039;Taste 2&#039; berücksichtigt).&lt;br /&gt;
&lt;br /&gt;
== Einfache Sensor-Signale als steuernde Elemente eines Programms ==&lt;br /&gt;
&lt;br /&gt;
a. Eine wichtige Anwendung von D/A-Steuerungen ist die mögliche Reaktion dieser Steuerung auf &#039;äußere&#039; Ereignisse, die z.B. mit Hilfe von Sensoren leistbar ist.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Einf_Sens.jpg|thumb|right|250px|einfacher Sensor]]b. Für unsere Zwecke genügt zunächst ein sehr einfacher Sensor, der ein 0- oder 1-Signal liefert und idealerweise direkt am &#039;Input Pin 1&#039; des PiFace angeschlossen werden kann. So liegt beim Input Pin 1 das Signal &#039;1&#039; an, wenn eine Verbindung zu &#039;Input GND&#039; besteht.&lt;br /&gt;
Z.B. können 2 unisolierte Drähte so platziert werden, dass ein vorbeifahrendes Fahrzeug einen von ihnen genügend bewegt um den Kontakt kurze Zeit zu öffnen. Genau dann liefert dieser &#039;Sensor&#039; das Signal &#039;0&#039;. Eine - die Schwerkraft nutzende - mögliche Bauform ist rechts abgebildet ;-)&lt;br /&gt;
&lt;br /&gt;
c. Natürlich werden zusätzlich 2 isolierte Drähte benötigt, um jeden der beiden offenen Drähte geschützt mit Input Pin 1 und Input GND zu verbinden.&lt;br /&gt;
&lt;br /&gt;
d. Bei jeder Durchfahrt liefert der Sensor nun ein &#039;0&#039;-Signal, was im Script sowohl für eine Zeitmessung als auch für ein &#039;Schaltintervall-Array&#039; genutzt werden kann. Dort können abwechselnd für beide Spannungen Zeiten (die in etwa zum jeweiligen Streckenabschnitt passen) &#039;programmiert&#039; werden. Statt Taste 1 wird nun der Sensor ausgewertet (wobei Taste 1 als Sensor-Ersatz insoweit genutzt werden kann, dass sie gedrückt bleiben bzw. kurz losgelassen werden muss). Zur genaueren Zeitmessung wird noch das modul &#039;clock&#039; benötigt. &amp;quot;&amp;lt;tt&amp;gt;wandler3.py&amp;lt;/tt&amp;gt;&amp;quot; könnte also so aussehen:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler3.py&lt;br /&gt;
 &lt;br /&gt;
 from time import clock&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
 sensor_1=1&lt;br /&gt;
 sensor_2=0&lt;br /&gt;
 rundenzahl=0&lt;br /&gt;
 v_wechsel=0&lt;br /&gt;
 vorrunde=0&lt;br /&gt;
 index_zaehler=1&lt;br /&gt;
 &lt;br /&gt;
 zeit_array=[0,0.2,0.4,0.2,0.4,0.2,0.4,0.2,5,0.2,6]&lt;br /&gt;
 # dieses array enthält die sek. bis zum Spannungswechsel&lt;br /&gt;
&lt;br /&gt;
 array_laenge=9&lt;br /&gt;
 # legt fest, wie viel Werte des arrays genutzt werden sollen&lt;br /&gt;
 &lt;br /&gt;
 sensor_aus=1.3&lt;br /&gt;
 # bis der Sensor sicher in die Ruhestellung kippt, wird er nicht ausgelesen&lt;br /&gt;
  &lt;br /&gt;
 pfio.init()&lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
&lt;br /&gt;
 # das Fahrzeug wird langsam zum Start (=Sensor) bewegt&lt;br /&gt;
 while sensor_1 == 1 :&lt;br /&gt;
   sensor_1=pfio.digital_read(1)&lt;br /&gt;
  &lt;br /&gt;
 print &amp;quot;fliegender Start... zum Beenden Taste 2 drücken&amp;quot;&lt;br /&gt;
 print &amp;quot;Runde Nr., Ges.Zeit, Rundenzeit, mittlere Rundenzeit&amp;quot;&lt;br /&gt;
 start_zeit=clock()&lt;br /&gt;
 runden_start=start_zeit&lt;br /&gt;
  &lt;br /&gt;
 while sensor_2 == 0 :&lt;br /&gt;
   sensor_2=pfio.digital_read(2)&lt;br /&gt;
   v_wechsel=1-v_wechsel&lt;br /&gt;
   pfio.digital_write(2,v_wechsel)&lt;br /&gt;
   sensor_zeit=clock()&lt;br /&gt;
  &lt;br /&gt;
   while zeit_array[index_zaehler]+sensor_zeit &amp;gt; clock() :&lt;br /&gt;
     if runden_start+sensor_aus &amp;lt; clock() :&lt;br /&gt;
 &lt;br /&gt;
       sensor_1=pfio.digital_read(1) &lt;br /&gt;
       if sensor_1 == 0 :&lt;br /&gt;
         rundenzahl=rundenzahl+1&lt;br /&gt;
         runden_start=clock()&lt;br /&gt;
         zeit=runden_start-start_zeit&lt;br /&gt;
         print rundenzahl, zeit, zeit-vorrunde, zeit/rundenzahl&lt;br /&gt;
         vorrunde=zeit&lt;br /&gt;
         sensor_zeit=0&lt;br /&gt;
         index_zaehler=0&lt;br /&gt;
         v_wechsel=0&lt;br /&gt;
  &lt;br /&gt;
   index_zaehler=index_zaehler+1&lt;br /&gt;
   if index_zaehler &amp;gt; array_laenge :&lt;br /&gt;
     sensor_2=1&lt;br /&gt;
     print &amp;quot;array-Ende erreicht!&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Outp 1 &amp;amp; 2 auf 0!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wird das Array-Ende erreicht, wurden entweder zu wenige Einträge vorgesehen oder es befindet sich kein Fahrzeug (mehr) auf der Strecke, das den Sensor und damit des Zurücksetzen des Arrays auslösen konnte.&lt;br /&gt;
&lt;br /&gt;
e. Das Array ist an die jeweilige Strecke anzupassen, wobei der vorderste Eintrag ungenutzt bleibt und dann mit der Dauer für maximale Spannung begonnen wird. Solange man mit Relais arbeitet, sollten die Schaltzeiten nicht zu kurz sein (&amp;gt;0.1 sek.), da diese eine gewisse mechanische Trägheit besitzen.&lt;br /&gt;
&lt;br /&gt;
f. Eben diese mechanische Beschaffenheit der Relais (Verschleiß) ist auch ein guter Grund, auf &#039;volle&#039; digitale Signalumwandlung umzustellen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Optokoppler als Ersatz für Relais =&lt;br /&gt;
&lt;br /&gt;
Ähnlich wie ein Relais dient ein [[Optokoppler]] dazu, eine Signalübertragung zwischen zwei getrennten Stromkreisen zu ermöglichen. Bei diesem Projekt liegt der Einsatz von Optokopplern nahe, da sie schneller schalten und keine beweglichen Teile besitzen. Für unsere Zwecke benötigen wir nun als zusätzliche Elemente: Optokoppler (CNY 17-4), npn-[[Transistor]]en (BC 337-40) zur Signalverstärkung sowie einige Widerstände im Bereich von 2k und 400 Ohm. &lt;br /&gt;
&lt;br /&gt;
== Kaskadierung von Transistoren zur Signalverstärkung ==&lt;br /&gt;
&lt;br /&gt;
a. Entsprechend Schritt 2.4.d. (ein Relais bei 50 Ohm) wird zunächst ein [[Optokoppler]] eingesetzt, dessen Signal durch einen Transistor verstärkt wird, um die &#039;Grundspannung&#039; zu schalten (Pin 3 und 6 beim Optokoppler sollten unbeschaltet bleiben, allein der &#039;Lichtstrom&#039; reicht für eine Ansteuerung aus):&lt;br /&gt;
&lt;br /&gt;
[[Bild:PiF_CNY_BC_1.png|400px|Optokoppler mit Transistor]]&lt;br /&gt;
&lt;br /&gt;
b. Da immer mit einer gewissen Toleranz bei allen Komponenten zu rechnen ist, kann es sein, dass u.U. die Widerstände etwas größer oder kleiner gewählt werden müssen. Beim Ausprobieren sollte man hier in 10% Schritten variieren.&lt;br /&gt;
&lt;br /&gt;
c. Bei Austesten mit Emulator oder Script ist auch zu beachten, dass nun &#039;Output Pin 8&#039; genutzt wird, da dieser nicht mit den Relais verschaltet ist.&lt;br /&gt;
&lt;br /&gt;
== Umsetzung von 3 Schaltstufen mit Optokopplern ==&lt;br /&gt;
&lt;br /&gt;
a. Entsprechend dem Vorgehen beim Relais kann nun auch der kleine Widerstand zusätzlich beschaltet werden um seine gesteuerte Überbrückung zu ermöglichen. Da hier eine relativ geringe Spannung aufgeschaltet wird, kann zu Beginn eine Diode eingesetzt werden, die die Schaltstufe &#039;maximale Spannung&#039; anzeigt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:SmPiFu2ou2T.png|400px|Kombination von 2 Optokopplern]]&lt;br /&gt;
&lt;br /&gt;
b. Vor dem Testen ist wieder zu beachten, dass nun zusätzlich &#039;Output Pin 7&#039; genutzt wird (statt Output Pin 2).&lt;br /&gt;
&lt;br /&gt;
c. Neben dem Weglassen der Diode (was die Maximalgeschwindigkeit leicht erhöht), können auch statt der 400 Ohm Widerstände 1k-Werte oder höher gewählt werden, wenn dadurch der jeweilige Basisstrom noch hoch genug ist. Im vorliegenden Fall war erst ab 400 Ohm keine weitere Tempoerhöhung mehr feststellbar.&lt;br /&gt;
&lt;br /&gt;
d. Eine mögliche Realisierung sieht so aus: http://youtu.be/xQ7N-PrIULk&lt;br /&gt;
&lt;br /&gt;
== Zusätzliche Erhöhung der Schaltstufen bei D/A-Wandlern ==&lt;br /&gt;
&lt;br /&gt;
a. Zwar benötigen wir in unserem speziellen Beispiel eine &#039;Grundspannung&#039;, die sich dahingehend auswirkt, dass - wie unter 3.1.c. erwähnt - eine Signalkombination nicht ausgewertet wird, aber mit jeder weiteren Schaltstufe würde sich dieses Problem (theoretisch) relativieren, da bei geschickter Auswahl der Widerstände (z.B. im Verhältnis 1 zu 2) jeweils eine Verdoppelung der Kombinationsmöglichkeiten erreichbar ist.&lt;br /&gt;
&lt;br /&gt;
b. Wird hier der 50 Ohm Widerstand asymmetrisch geteilt (z.B. 15 + 35 Ohm, s.a. [[Spannungsteiler]]) um dort ein weiteres Signal umsetzen zu können, ergeben sich direkt folgende 5 Schaltstufen (aus, 50, 35, 15 und 0 Ohm) u.s.w.:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Sm3ou3t2.png|400px|Erhöhung der Schaltstufen]]&lt;br /&gt;
&lt;br /&gt;
c. Zur Ansteuerung dieser Schaltstufen wäre das Script so zu ändern, dass nun zwischen mehr als 2 Stufen gewechselt werden kann und im Array entsprechende Zusatzdaten vorgegeben und ausgelesen werden. Mehr als diese Stufen sind im konkreten Fall aber nicht sinnvoll, da die entstehende Verlustleistung in der Schaltung die maximal verfügbare Leistung reduziert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Weiterführende Ideen =&lt;br /&gt;
&lt;br /&gt;
Die Ausbaumöglichkeiten dieses Projektes sind vielfältig:&lt;br /&gt;
&lt;br /&gt;
== Hardwareseitige Ausbauvarianten ==&lt;br /&gt;
&lt;br /&gt;
- beispielhafte Umsetzung einer differenzierten Abstufung mittels eines möglichst oft durch 2 teilbaren Anfangswertes und der Teiler (640 Ohm, 320, 160...) oder in 10er Potenzen. Denkbar wäre auch eine Parallelschaltung der &#039;zuschaltbaren&#039; Widerstände - je nach Umsetzung wären natürlich die Vorwiderstände der Transistoren anzupassen;&lt;br /&gt;
&lt;br /&gt;
- Nachbau des Projekts mit einem Mikrocontroller (ggf. mit LCD-Anzeige);&lt;br /&gt;
&lt;br /&gt;
- Umbau der Steuerung mit dem Ziel, sie direkt an die GPIO-Pins des RPi anzuschließen;&lt;br /&gt;
&lt;br /&gt;
- Entwurf einer Zusatzschaltung, die in diesem Beispiel eine Rückmeldung liefert, ob ein Verbraucher aktiv ist oder nicht (Fahrzeug noch auf der Strecke?);&lt;br /&gt;
&lt;br /&gt;
- Entwurf einer Zusatzschaltung, die erkennt wie viel Strom fliesst: damit wären Rückschlüsse auf den Streckenverlauf möglich (Kurve=etwas mehr Strom, Steigung=noch mehr Strom nötig, etc.) und so auch eine programmgesteuerte Optimierung der Array-Schaltzeiten dankbar; &lt;br /&gt;
&lt;br /&gt;
- Einsatz anderer Sensortechniken und/oder mehrerer Sensoren zur Optimierung der Schnelligkeit oder parallelen Steuerung eines 2. Fahrzeuges;&lt;br /&gt;
&lt;br /&gt;
== Softwareseitige Ausbauvarianten ==&lt;br /&gt;
&lt;br /&gt;
- Optimierung des Scripts, indem die Sensor-Abfrage über einen &#039;Listener&#039; umgesetzt wird;&lt;br /&gt;
&lt;br /&gt;
- Erweiterung des Scripts um eine GUI mit Hilfe der python-lib Tkinter, um einen Nutzerzugriff auf das Steuerarray und/oder eine &#039;Verwaltung&#039; mehrerer Fahrzeuge;&lt;br /&gt;
&lt;br /&gt;
- Einbindung eines Web-Interface um eine &#039;Fernsteuerung&#039; zu ermöglichen...&lt;br /&gt;
&lt;br /&gt;
...in jedem Fall: viel Spaß beim Basteln!&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [http://hackaday.com/2013/01/23/replacement-controllers-for-slot-car-racing/ andere Variante der Ersetzung der Handregler bei &#039;hackaday&#039;] &lt;br /&gt;
* [https://docs.google.com/folder/d/0B-UAZ9CyJCLGQjJ3RDlqa2pqaDg/edit?pli=1&amp;amp;docId=0B-UAZ9CyJCLGNmpMeVpyYlZJUWc Relaisschaltung mit pädagogischer Erweiterung der Universität Manchester (englischspr.)]&lt;br /&gt;
* [http://elinux.org/RPi_Projects englischsp. Projektliste zum RPi]&lt;br /&gt;
* [http://elinux.org/RPi_Projects/PiFace_controlling_a_slot-car paralleler englischsp. Bericht des Autors zum RPi mit anderem Schwerpunkt] &lt;br /&gt;
* [http://www.mikrocontroller.net/articles/GhostCarProjekt Verlagerung der gesamten Steuerelektronik ins Fahrzeug]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Raspberry Pi]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Mknot9</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=RPi_als_D/A-Wandler&amp;diff=74520</id>
		<title>RPi als D/A-Wandler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=RPi_als_D/A-Wandler&amp;diff=74520"/>
		<updated>2013-03-08T22:33:24Z</updated>

		<summary type="html">&lt;p&gt;Mknot9: /* Hardwareseitige Ausbauvarianten */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;von M. Knoop&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
Oft wird ein Computer &#039;nur&#039; genutzt um darauf Software ablaufen zu lassen. Dessen Möglichkeit zur Steuerung von elektrischen und mechanischen Geräten wird dabei leicht übersehen.&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel richtet sich daher an Einsteiger, die mit dem [[Raspberry Pi]] (&#039;RPi&#039;) Grundlagen der Computersteuerung mit Relais und [[Spannungsteiler]]n nachvollziehen möchten. Es wird an einem konkreten Beispiel schrittweise dargestellt, wie mittels eines D/A-Wandlers (Digital/Analog-Wandler = Umwandlung von digitalen 1/0 Signale) die Steuerung einer stufenweise veränderbaren Ausgangsspannung aufgebaut werden kann.&lt;br /&gt;
&lt;br /&gt;
= Verwendete Hardware =&lt;br /&gt;
&lt;br /&gt;
== RPi in Kombination mit der &#039;PiFace&#039;-Karte als Bastelplattform ==&lt;br /&gt;
&lt;br /&gt;
Dank der einfachen Bauweise bietet sich der RPi mit seinen frei zugänglichen GPIO-Pins als ideale Bastelplattform an. Trotzdem kann es beim anfänglichen Experimentieren mit Schaltungen öfters zu kleinen Fehlern kommen, die schlimmstenfalls die empfindliche Elektronik des RPi dauerhaft beschädigen können.&lt;br /&gt;
&lt;br /&gt;
Daher wird bei diesem Projekt zusätzlich mit der &#039;PiFace[http://elinux.org/RPi_Expansion_Boards#Piface]&#039;-Karte gearbeitet, die man auf die GPIO-Pins stecken kann. Diese Erweiterungskarte verschaltet die GPIO-Pins auf je 8 digitale Ein- und Ausgänge sowie 2 Relais, die eine galvanische Trennung von Stromkreisen ermöglichen. Damit besteht auch für Einsteiger ein gewisser Schutz für die Steuerelektronik des RPi.&lt;br /&gt;
&lt;br /&gt;
Auch im weiteren Verlauf dieser Einführung soll noch auf eine Trennung der Stromkreise Wert gelegt werden, so dass für erste digitale Schaltexperimente ein Optokoppler genutzt wird. Die spätere Nutzung der &#039;Input Pins&#039; des PiFace um eine Steuerung der D/A-Wandlung durch bestimmte Ereignisse zu ermöglichen, erfolgt ebenfalls passiv.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Auch wenn mit vermeintlich &#039;sicheren&#039; Transformatoren gebastelt wird, muss stets bedacht werden, dass diese an einem 230V-Stromnetz betrieben werden und man eher einmal mehr als weniger prüfen sollte, ob man durch eventuelle Fehler mit lebensgefährlicher Spannung in Berührung kommt!&lt;br /&gt;
&lt;br /&gt;
== Auswahl eines Beispielprojektes ==&lt;br /&gt;
&lt;br /&gt;
Günstige Möglichkeiten ein Gerät zu finden, das mit analogen Spannungen arbeitet, bieten sich u.a. im Spielzeugbereich. Im Grunde eignet sich alles, was mit Batterien oder mit Gleichspannungen unter 24 V betrieben wird.&lt;br /&gt;
&lt;br /&gt;
Da jedoch ein Ziel das Steuern von analogen Spannungen ist, bietet sich insbesondere alles an, bei dem [[Potentiometer]] eingesetzt werden. Einen dieser &#039;Handregler&#039; sollte man übrig haben, da er von seinem Anschlusskabel abgetrennt werden muss, um den oft proprietären Steckanschluss nutzen zu können. In diesem Sinne wird hier eine handelsübliche Spielzeug-Autorennbahn mit Potentiometer-Handreglern genutzt.&lt;br /&gt;
&lt;br /&gt;
== Sonstige Bauteile ==&lt;br /&gt;
&lt;br /&gt;
Für die ersten Grundlagen (s. Teile 2 &amp;amp; 3) genügen bereits rund 2 m isolierter Draht, der nicht aus verdrillten feinen Adern (Litze) bestehen sollte, 50 cm nicht-isolierter Draht, einige niederohmige Widerstände (z.B. je 2 mal 100 Ohm, 80, 60, sowie 20) und ein &#039;Experimentierbrett&#039; (engl. [[Breadboard]]).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Grundlagen und Vorbereitung des Projekts =&lt;br /&gt;
&lt;br /&gt;
== Umwandlung von 1/0 zu Ein/Aus mit einem Relais ==&lt;br /&gt;
&lt;br /&gt;
Vom Prinzip her ist jede Umwandlung eines digitalen 0 oder 1 Signals (das über eine bestimmte Spannungsdifferenz festgelegt ist) in eine (nutzbare) Spannung bereits eine D/A-Wandlung. Dies wird schlicht so realisiert, dass mit einer Eingabe am RPi die Nutzspannung des &#039;Verbrauchers&#039; zunächst einfach an- und ausgeschaltet wird.&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung der zu steuernden Hardware ==&lt;br /&gt;
&lt;br /&gt;
a. Um Fehlerquellen auszuschließen sollte zunächst (und ggf. auch später!) kurz getestet werden, ob der vorhandene Regler wie erwartet funktioniert.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pif_Con9.jpg|thumb|right|400px|Fixierung der Reglerkabel]]&lt;br /&gt;
b. Nach dem Trennen des Reglers von der Einspeisung (und ggf. Ziehen des Netzsteckers) muss das Regler-Kabel abgeschnitten werden (eher nahe beim Regler, da das Kabel bald bis zum Breadboard reichen soll). Die neuen Enden des Einspeiseteils werden abisoliert und auf dem Breadboard diagonal zueinander mit einigen Spalten Abstand fixiert. Auch können bereits die Drähte, die später zum RPi führen, jeweils in den passenden kontaktführenden Spalten eingesteckt werden, z. B. wie rechts zu sehen (die nicht beschrifteten Drähte können vorerst ignoriert werden):&lt;br /&gt;
&lt;br /&gt;
c. Nun bietet sich eine gute Gelegenheit die maximale Spannung am Nutzgerät zu messen. Man verbindet das Regler-Kabel (nun ohne Regler) wieder mit der Einspeisung und die offenen Enden der Drähte mit dem Messgerät, bei dem zunächst ein Messbereich von ca. 10-50 Volt gewählt werden sollte. Dies sollte dann z.B. 14,8 V anzeigen. Natürlich können auch die beiden offenen Enden einen kleinen Moment kurz geschlossen werden, man sollte aber bedenken, dass das zu regelnde Nutzgerät dann die maximal vorgesehene Spannung erhält (hier: maximales Tempo).&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung des RPi ==&lt;br /&gt;
&lt;br /&gt;
Es wird davon ausgegangen, dass entsprechend des zugehörigen &#039;manual&#039; das PiFace bereits auf den RPi gesteckt ist, die nötigen python-Bibliotheken installiert sind und man sich im Terminal-Arbeitsverzeichnis &#039;pi&#039; befindet.&lt;br /&gt;
&lt;br /&gt;
a. Zunächst wird der PiFace-Emulator (im Terminal direkt aus dem Arbeitsverzeichnis) gestartet: &amp;lt;tt&amp;gt;piface/scripts/piface-emulator&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b. Wenn alles richtig installiert wurde, erscheint ein Fenster (unten links), bei dem die vorerst wichtigen blauen Signale am rechten Rand wie folgt angezeigt werden sollten: &lt;br /&gt;
 &lt;br /&gt;
[[Datei:RPi_PiF_em-scs.jpg|400px|Piface-Emulator im default-Zustand]] [[Datei:RPi_PiF_em_scs1.jpg|400px|Piface-Relais 1 auf &#039;1&#039; geschaltet]]&lt;br /&gt;
&lt;br /&gt;
c. Das rechte Fenster ergibt sich, wenn man nun im Fenster auf &amp;quot;Override Enable&amp;quot; und dann &amp;quot;Output Pin 1&amp;quot; klickt. Es müsste ein &amp;quot;Klick&amp;quot; vom Relais 1 zu hören sein sowie der Schaltzustand des unteren Relais 1 (das an den Output Pin 1 gekoppelt ist) auf die Verbindung der beiden unteren Anschlüsse wechseln. Zugleich wird das erste LED-Icon beim Output Pin 1 rot sowie das zugehörige LED-Icon blau.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pif_rel2.png|thumb|right|250px|Schema der Piface-Relais]]&lt;br /&gt;
d. Rechts ist der Schaltzustand der Relais, die zu Beginn genutzt werden, im Grundzustand dargestellt (jeweils der mittlere und obere Kontakt sind kurzgeschlossen, der jeweils untere Kontakt ist frei):&lt;br /&gt;
&lt;br /&gt;
e. Ein weiterer Klick auf &amp;quot;Output Pin 1&amp;quot; versetzt das Relais in den Ausgangszustand, der vor dem nächsten Schritt wieder eingestellt werden sollte.&lt;br /&gt;
&lt;br /&gt;
f. Das Relais lässt sich auch mittels eines Python-Scripts vom RPi aus ansteuern. Dazu wird folgende Textdatei &amp;quot;wandler.py&amp;quot; im Arbeitsverzeichnis abgespeichert und mit dem Befehl &amp;quot;&amp;lt;tt&amp;gt;python wandler.py&amp;lt;/tt&amp;gt;&amp;quot; gestartet:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler.py&lt;br /&gt;
&lt;br /&gt;
 from time import sleep&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
&lt;br /&gt;
 pfio.init()&lt;br /&gt;
&lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
 print &amp;quot;Strom an&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 sleep(2)&lt;br /&gt;
&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Strom aus&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Nach dem Absetzen des Befehls wechselt nun das blaue Signal an Relais 1 für 2 Sekunden und das Relais klickt entsprechend.&lt;br /&gt;
&lt;br /&gt;
== Einsatz eines Relais&#039; zur Umsetzung von Spannungsänderungen ==&lt;br /&gt;
&lt;br /&gt;
a. Ist das Relais wieder im Ausgangszustand, befestigt man nun einen der vom Breadboard führenden Drähte am unteren und einen am mittleren Relaiseingang (im Moment ist die Polarität noch egal). Zunächst sollte nichts passieren (das Relais hält diesen ja Stromkreis noch offen).&lt;br /&gt;
&lt;br /&gt;
b. Startet man aber das Script wieder (&amp;lt;tt&amp;gt;python wandler.py&amp;lt;/tt&amp;gt;) oder klickt auf &#039;Output Pin 1&#039; wird der Nutzstromkreis geschlossen. Nochmals aufgepasst: unser Nutzer erhält wieder die maximal vorgesehene Spannung - also besser vorher im Script &amp;quot;&amp;lt;tt&amp;gt;sleep(0.3)&amp;lt;/tt&amp;gt;&amp;quot; setzen und speichern.&lt;br /&gt;
&lt;br /&gt;
c. Im Prinzip ist damit die programmgesteuerte Umsetzung eines 0/1 Signals in z.B. eine 0V/15V Spannung erreicht.&lt;br /&gt;
&lt;br /&gt;
d. Da wir bald verschiedene Steuerspannungen schalten wollen, geht es jetzt darum herauszufinden, bei welcher Spannung unser Nutzgerät gerade noch bewegt wird. Dies probiert man aus - mit dem kleinsten Widerstand beginnend: indem einer der Drähte in eine freie Breadboardspalte gesteckt wird und aus dieser Spalte der Widerstand zu dem &#039;alten&#039; Steckplatz des Drahtes geführt wird. Nun startet man jeweils das Script bis der Widerstand so hoch ist, dass die Anlaufspannung beim Nutzgerätes gut ausreicht, eine Reaktion des Nutzgerät (Fahrzeug bewegt sich) zu bewirken (z.B. bei 50 Ohm beträgt der Strom im Mittel ca. 130 mA während ohne 190 mA fließen).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Ansteuerung von 3 Schaltstufen =&lt;br /&gt;
&lt;br /&gt;
== Kombination von 2 Relais ==&lt;br /&gt;
&lt;br /&gt;
[[Bild:ZrelMww2.png|thumb|right|250px|Beschaltung der Relais]] a. Die einfachste Stufe der weiteren Verschaltung erreicht man, indem der Widerstand mit einem 2. Relais überbrückt wird. Relais 1 kann dann als &#039;Hauptschalter&#039;, Relais 2 als Spannungsumschalter genutzt werden:&lt;br /&gt;
&lt;br /&gt;
b. Diese Beschaltung kann sogleich mit dem PiFace-Emulator ausprobiert werden. Damit können wir bereits 3 Schaltstufen steuern: keine, verminderte und volle Spannung.&lt;br /&gt;
&lt;br /&gt;
c. Theoretisch ließe sich auch noch eine 4. Spannungsstufe erzeugen, da mit 2 &#039;Bits&#039; (Ein/Aus bei 2 Relais) bereits 4 verschiedene Signale darstellbar sind. Beim jetzigen Aufbau werden aber lediglich die (pin1,pin2)-Signale (0,0), (1,0) und (1,1) &#039;genutzt&#039;, da Relais 1 als Hauptschalter vorgesehen ist und die Kombination (0,1) so nicht ausgewertet wird.&lt;br /&gt;
&lt;br /&gt;
== Programmgesteuerte Schaltung von 2 Relais ==&lt;br /&gt;
&lt;br /&gt;
a. Mit einem veränderten python-Script &amp;quot;wandler2.py&amp;quot; ist auch die programmgesteuerte Schaltung möglich. Dabei werden zusätzlich die Tasten 1 und 2 des PiFace genutzt, um nach dem Start des Scripts (&amp;lt;tt&amp;gt;python wandler2.py&amp;lt;/tt&amp;gt;) den Hauptschalter (Relais 1) zu steuern:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler2.py&lt;br /&gt;
 &lt;br /&gt;
 from time import sleep&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
 pfio.init()&lt;br /&gt;
 &lt;br /&gt;
 taste_1=0&lt;br /&gt;
 taste_2=0&lt;br /&gt;
 intervall_a=0.1&lt;br /&gt;
 intervall_b=0.5&lt;br /&gt;
 # Die Intervalle bestimmen die Schaltzeit für volle/verminderte Spannung&lt;br /&gt;
 &lt;br /&gt;
 print &amp;quot;Zum Start Taste 1 drücken, zum Stoppen Taste 2&amp;quot;&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 while taste_1 == 0:&lt;br /&gt;
   sleep(intervall_a)&lt;br /&gt;
   taste_1=pfio.digital_read(1)&lt;br /&gt;
&lt;br /&gt;
 # Der o.g. &#039;sleep&#039;-Befehl bestimmt die Abfragepausen für Taste 1&lt;br /&gt;
 &lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
 print &amp;quot;Strom an!&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 while taste_2 == 0:&lt;br /&gt;
   pfio.digital_write(2,1)&lt;br /&gt;
   sleep(intervall_a)&lt;br /&gt;
   pfio.digital_write(2,0)&lt;br /&gt;
   sleep(intervall_b)&lt;br /&gt;
   taste_2=pfio.digital_read(2)&lt;br /&gt;
 &lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Strom aus!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
b. Falls beim Ausprobieren von Script-Änderungen mal was schief geht, kann das Script stets auch mit der Tastenkombination (CTRL-C) gestoppt werden. U.U. muss dann noch zusätzlich Relais 1 und/oder 2 via Emulator zurückgesetzt werden.&lt;br /&gt;
&lt;br /&gt;
c. Beim Verändern des Scripts fällt bald auf, dass die bisherige Programmsteuerung keine direkte Möglichkeit vorsieht, auf Ereignisse zu reagieren. Immerhin wird ein mechanisches Gerät gesteuert, bei dem mit Ausfällen, Fertigungstoleranzen, Umwelteinflüssen etc. zu rechnen ist (im Script wird dies bislang &#039;nur&#039; durch die Abbruchbedingung &#039;Taste 2&#039; berücksichtigt).&lt;br /&gt;
&lt;br /&gt;
== Einfache Sensor-Signale als steuernde Elemente eines Programms ==&lt;br /&gt;
&lt;br /&gt;
a. Eine wichtige Anwendung von D/A-Steuerungen ist die mögliche Reaktion dieser Steuerung auf &#039;äußere&#039; Ereignisse, die z.B. mit Hilfe von Sensoren leistbar ist.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Einf_Sens.jpg|thumb|right|250px|einfacher Sensor]]b. Für unsere Zwecke genügt zunächst ein sehr einfacher Sensor, der ein 0- oder 1-Signal liefert und idealerweise direkt am &#039;Input Pin 1&#039; des PiFace angeschlossen werden kann. So liegt beim Input Pin 1 das Signal &#039;1&#039; an, wenn eine Verbindung zu &#039;Input GND&#039; besteht.&lt;br /&gt;
Z.B. können 2 unisolierte Drähte so platziert werden, dass ein vorbeifahrendes Fahrzeug einen von ihnen genügend bewegt um den Kontakt kurze Zeit zu öffnen. Genau dann liefert dieser &#039;Sensor&#039; das Signal &#039;0&#039;. Eine - die Schwerkraft nutzende - mögliche Bauform ist rechts abgebildet ;-)&lt;br /&gt;
&lt;br /&gt;
c. Natürlich werden zusätzlich 2 isolierte Drähte benötigt, um jeden der beiden offenen Drähte geschützt mit Input Pin 1 und Input GND zu verbinden.&lt;br /&gt;
&lt;br /&gt;
d. Bei jeder Durchfahrt liefert der Sensor nun ein &#039;0&#039;-Signal, was im Script sowohl für eine Zeitmessung als auch für ein &#039;Schaltintervall-Array&#039; genutzt werden kann. Dort können abwechselnd für beide Spannungen Zeiten (die in etwa zum jeweiligen Streckenabschnitt passen) &#039;programmiert&#039; werden. Statt Taste 1 wird nun der Sensor ausgewertet (wobei Taste 1 als Sensor-Ersatz insoweit genutzt werden kann, dass sie gedrückt bleiben bzw. kurz losgelassen werden muss). Zur genaueren Zeitmessung wird noch das modul &#039;clock&#039; benötigt. &amp;quot;&amp;lt;tt&amp;gt;wandler3.py&amp;lt;/tt&amp;gt;&amp;quot; könnte also so aussehen:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler3.py&lt;br /&gt;
 &lt;br /&gt;
 from time import clock&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
 sensor_1=1&lt;br /&gt;
 sensor_2=0&lt;br /&gt;
 rundenzahl=0&lt;br /&gt;
 v_wechsel=0&lt;br /&gt;
 vorrunde=0&lt;br /&gt;
 index_zaehler=1&lt;br /&gt;
 &lt;br /&gt;
 zeit_array=[0,0.2,0.4,0.2,0.4,0.2,0.4,0.2,5,0.2,6]&lt;br /&gt;
 # dieses array enthält die sek. bis zum Spannungswechsel&lt;br /&gt;
&lt;br /&gt;
 array_laenge=9&lt;br /&gt;
 # legt fest, wie viel Werte des arrays genutzt werden sollen&lt;br /&gt;
 &lt;br /&gt;
 sensor_aus=1.3&lt;br /&gt;
 # bis der Sensor sicher in die Ruhestellung kippt, wird er nicht ausgelesen&lt;br /&gt;
  &lt;br /&gt;
 pfio.init()&lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
&lt;br /&gt;
 # das Fahrzeug wird langsam zum Start (=Sensor) bewegt&lt;br /&gt;
 while sensor_1 == 1 :&lt;br /&gt;
   sensor_1=pfio.digital_read(1)&lt;br /&gt;
  &lt;br /&gt;
 print &amp;quot;fliegender Start... zum Beenden Taste 2 drücken&amp;quot;&lt;br /&gt;
 print &amp;quot;Runde Nr., Ges.Zeit, Rundenzeit, mittlere Rundenzeit&amp;quot;&lt;br /&gt;
 start_zeit=clock()&lt;br /&gt;
 runden_start=start_zeit&lt;br /&gt;
  &lt;br /&gt;
 while sensor_2 == 0 :&lt;br /&gt;
   sensor_2=pfio.digital_read(2)&lt;br /&gt;
   v_wechsel=1-v_wechsel&lt;br /&gt;
   pfio.digital_write(2,v_wechsel)&lt;br /&gt;
   sensor_zeit=clock()&lt;br /&gt;
  &lt;br /&gt;
   while zeit_array[index_zaehler]+sensor_zeit &amp;gt; clock() :&lt;br /&gt;
     if runden_start+sensor_aus &amp;lt; clock() :&lt;br /&gt;
 &lt;br /&gt;
       sensor_1=pfio.digital_read(1) &lt;br /&gt;
       if sensor_1 == 0 :&lt;br /&gt;
         rundenzahl=rundenzahl+1&lt;br /&gt;
         runden_start=clock()&lt;br /&gt;
         zeit=runden_start-start_zeit&lt;br /&gt;
         print rundenzahl, zeit, zeit-vorrunde, zeit/rundenzahl&lt;br /&gt;
         vorrunde=zeit&lt;br /&gt;
         sensor_zeit=0&lt;br /&gt;
         index_zaehler=0&lt;br /&gt;
         v_wechsel=0&lt;br /&gt;
  &lt;br /&gt;
   index_zaehler=index_zaehler+1&lt;br /&gt;
   if index_zaehler &amp;gt; array_laenge :&lt;br /&gt;
     sensor_2=1&lt;br /&gt;
     print &amp;quot;array-Ende erreicht!&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Outp 1 &amp;amp; 2 auf 0!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wird das Array-Ende erreicht, wurden entweder zu wenige Einträge vorgesehen oder es befindet sich kein Fahrzeug (mehr) auf der Strecke, das den Sensor und damit des Zurücksetzen des Arrays auslösen konnte.&lt;br /&gt;
&lt;br /&gt;
e. Das Array ist an die jeweilige Strecke anzupassen, wobei der vorderste Eintrag ungenutzt bleibt und dann mit der Dauer für maximale Spannung begonnen wird. Solange man mit Relais arbeitet, sollten die Schaltzeiten nicht zu kurz sein (&amp;gt;0.1 sek.), da diese eine gewisse mechanische Trägheit besitzen.&lt;br /&gt;
&lt;br /&gt;
f. Eben diese mechanische Beschaffenheit der Relais (Verschleiß) ist auch ein guter Grund, auf &#039;volle&#039; digitale Signalumwandlung umzustellen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Optokoppler als Ersatz für Relais =&lt;br /&gt;
&lt;br /&gt;
Ähnlich wie ein Relais dient ein [[Optokoppler]] dazu, eine Signalübertragung zwischen zwei getrennten Stromkreisen zu ermöglichen. Bei diesem Projekt liegt der Einsatz von Optokopplern nahe, da sie schneller schalten und keine beweglichen Teile besitzen. Für unsere Zwecke benötigen wir nun als zusätzliche Elemente: Optokoppler (CNY 17-4), npn-[[Transistor]]en (BC 337-40) zur Signalverstärkung sowie einige Widerstände im Bereich von 2k und 400 Ohm. &lt;br /&gt;
&lt;br /&gt;
== Kaskadierung von Transistoren zur Signalverstärkung ==&lt;br /&gt;
&lt;br /&gt;
a. Entsprechend Schritt 2.4.d. (ein Relais bei 50 Ohm) wird zunächst ein [[Optokoppler]] eingesetzt, dessen Signal durch einen Transistor verstärkt wird, um die &#039;Grundspannung&#039; zu schalten (Pin 3 und 6 beim Optokoppler sollten unbeschaltet bleiben, allein der &#039;Lichtstrom&#039; reicht für eine Ansteuerung aus):&lt;br /&gt;
&lt;br /&gt;
[[Bild:PiF_CNY_BC_1.png|400px|Optokoppler mit Transistor]]&lt;br /&gt;
&lt;br /&gt;
b. Da immer mit einer gewissen Toleranz bei allen Komponenten zu rechnen ist, kann es sein, dass u.U. die Widerstände etwas größer oder kleiner gewählt werden müssen. Beim Ausprobieren sollte man hier in 10% Schritten variieren.&lt;br /&gt;
&lt;br /&gt;
c. Bei Austesten mit Emulator oder Script ist auch zu beachten, dass nun &#039;Output Pin 8&#039; genutzt wird, da dieser nicht mit den Relais verschaltet ist.&lt;br /&gt;
&lt;br /&gt;
== Umsetzung von 3 Schaltstufen mit Optokopplern ==&lt;br /&gt;
&lt;br /&gt;
a. Entsprechend dem Vorgehen beim Relais kann nun auch der kleine Widerstand zusätzlich beschaltet werden um seine gesteuerte Überbrückung zu ermöglichen. Da hier eine relativ geringe Spannung aufgeschaltet wird, kann zu Beginn eine Diode eingesetzt werden, die die Schaltstufe &#039;maximale Spannung&#039; anzeigt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:SmPiFu2ou2T.png|400px|Kombination von 2 Optokopplern]]&lt;br /&gt;
&lt;br /&gt;
b. Vor dem Testen ist wieder zu beachten, dass nun zusätzlich &#039;Output Pin 7&#039; genutzt wird (statt Output Pin 2).&lt;br /&gt;
&lt;br /&gt;
c. Neben dem Weglassen der Diode (was die Maximalgeschwindigkeit leicht erhöht), können auch statt der 400 Ohm Widerstände 1k-Werte oder höher gewählt werden, wenn dadurch der jeweilige Basisstrom noch hoch genug ist. Im vorliegenden Fall war erst ab 400 Ohm keine weitere Tempoerhöhung mehr feststellbar.&lt;br /&gt;
&lt;br /&gt;
d. Eine mögliche Realisierung sieht so aus: http://youtu.be/xQ7N-PrIULk&lt;br /&gt;
&lt;br /&gt;
== Zusätzliche Erhöhung der Schaltstufen bei D/A-Wandlern ==&lt;br /&gt;
&lt;br /&gt;
a. Zwar benötigen wir in unserem speziellen Beispiel eine &#039;Grundspannung&#039;, die sich dahingehend auswirkt, dass - wie unter 3.1.c. erwähnt - eine Signalkombination nicht ausgewertet wird, aber mit jeder weiteren Schaltstufe würde sich dieses Problem (theoretisch) relativieren, da bei geschickter Auswahl der Widerstände (z.B. im Verhältnis 1 zu 2) jeweils eine Verdoppelung der Kombinationsmöglichkeiten erreichbar ist.&lt;br /&gt;
&lt;br /&gt;
b. Wird hier der 50 Ohm Widerstand asymmetrisch geteilt (z.B. 15 + 35 Ohm, s.a. [[Spannungsteiler]]) um dort ein weiteres Signal umsetzen zu können, ergeben sich direkt folgende 5 Schaltstufen (aus, 50, 35, 15 und 0 Ohm) u.s.w.:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Sm3ou3t2.png|400px|Erhöhung der Schaltstufen]]&lt;br /&gt;
&lt;br /&gt;
c. Zur Ansteuerung dieser Schaltstufen wäre das Script so zu ändern, dass nun zwischen mehr als 2 Stufen gewechselt werden kann und im Array entsprechende Zusatzdaten vorgegeben und ausgelesen werden. Mehr als diese Stufen sind im konkreten Fall aber nicht sinnvoll, da die entstehende Verlustleistung in der Schaltung die maximal verfügbare Leistung reduziert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Weiterführende Ideen =&lt;br /&gt;
&lt;br /&gt;
Die Ausbaumöglichkeiten dieses Projektes sind vielfältig:&lt;br /&gt;
&lt;br /&gt;
== Hardwareseitige Ausbauvarianten ==&lt;br /&gt;
&lt;br /&gt;
- beispielhafte Umsetzung einer differenzierten Abstufung mittels eines möglichst oft durch 2 teilbaren Anfangswertes und der Teiler (640 Ohm, 320, 160...) oder in 10er Potenzen. Denkbar wäre auch eine Parallelschaltung der &#039;zuschaltbaren&#039; Widerstände - je nach Umsetzung wären natürlich die [[Vorwiderstände]] der Transistoren anzupassen;&lt;br /&gt;
&lt;br /&gt;
- Nachbau des Projekts mit einem Mikrocontroller (ggf. mit LCD-Anzeige);&lt;br /&gt;
&lt;br /&gt;
- Umbau der Steuerung mit dem Ziel, sie direkt an die GPIO-Pins des RPi anzuschließen;&lt;br /&gt;
&lt;br /&gt;
- Entwurf einer Zusatzschaltung, die in diesem Beispiel eine Rückmeldung liefert, ob ein Verbraucher aktiv ist oder nicht (Fahrzeug noch auf der Strecke?);&lt;br /&gt;
&lt;br /&gt;
- Entwurf einer Zusatzschaltung, die erkennt wie viel Strom fliesst: damit wären Rückschlüsse auf den Streckenverlauf möglich (Kurve=etwas mehr Strom, Steigung=noch mehr Strom nötig, etc.) und so auch eine programmgesteuerte Optimierung der Array-Schaltzeiten dankbar; &lt;br /&gt;
&lt;br /&gt;
- Einsatz anderer Sensortechniken und/oder mehrerer Sensoren zur Optimierung der Schnelligkeit oder parallelen Steuerung eines 2. Fahrzeuges;&lt;br /&gt;
&lt;br /&gt;
== Softwareseitige Ausbauvarianten ==&lt;br /&gt;
&lt;br /&gt;
- Optimierung des Scripts, indem die Sensor-Abfrage über einen &#039;Listener&#039; umgesetzt wird;&lt;br /&gt;
&lt;br /&gt;
- Erweiterung des Scripts um eine GUI mit Hilfe der python-lib Tkinter, um einen Nutzerzugriff auf das Steuerarray und/oder eine &#039;Verwaltung&#039; mehrerer Fahrzeuge;&lt;br /&gt;
&lt;br /&gt;
- Einbindung eines Web-Interface um eine &#039;Fernsteuerung&#039; zu ermöglichen...&lt;br /&gt;
&lt;br /&gt;
...in jedem Fall: viel Spaß beim Basteln!&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [http://hackaday.com/2013/01/23/replacement-controllers-for-slot-car-racing/ andere Variante der Ersetzung der Handregler bei &#039;hackaday&#039;] &lt;br /&gt;
* [https://docs.google.com/folder/d/0B-UAZ9CyJCLGQjJ3RDlqa2pqaDg/edit?pli=1&amp;amp;docId=0B-UAZ9CyJCLGNmpMeVpyYlZJUWc Relaisschaltung mit pädagogischer Erweiterung der Universität Manchester (englischspr.)]&lt;br /&gt;
* [http://elinux.org/RPi_Projects englischsp. Projektliste zum RPi]&lt;br /&gt;
* [http://elinux.org/RPi_Projects/PiFace_controlling_a_slot-car paralleler englischsp. Bericht des Autors zum RPi mit anderem Schwerpunkt] &lt;br /&gt;
* [http://www.mikrocontroller.net/articles/GhostCarProjekt Verlagerung der gesamten Steuerelektronik ins Fahrzeug]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Raspberry Pi]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Mknot9</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=RPi_als_D/A-Wandler&amp;diff=74515</id>
		<title>RPi als D/A-Wandler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=RPi_als_D/A-Wandler&amp;diff=74515"/>
		<updated>2013-03-08T22:15:12Z</updated>

		<summary type="html">&lt;p&gt;Mknot9: /* Hardwareseitige Ausbauvarianten */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;von M. Knoop&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
Oft wird ein Computer &#039;nur&#039; genutzt um darauf Software ablaufen zu lassen. Dessen Möglichkeit zur Steuerung von elektrischen und mechanischen Geräten wird dabei leicht übersehen.&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel richtet sich daher an Einsteiger, die mit dem [[Raspberry Pi]] (&#039;RPi&#039;) Grundlagen der Computersteuerung mit Relais und [[Spannungsteiler]]n nachvollziehen möchten. Es wird an einem konkreten Beispiel schrittweise dargestellt, wie mittels eines D/A-Wandlers (Digital/Analog-Wandler = Umwandlung von digitalen 1/0 Signale) die Steuerung einer stufenweise veränderbaren Ausgangsspannung aufgebaut werden kann.&lt;br /&gt;
&lt;br /&gt;
= Verwendete Hardware =&lt;br /&gt;
&lt;br /&gt;
== RPi in Kombination mit der &#039;PiFace&#039;-Karte als Bastelplattform ==&lt;br /&gt;
&lt;br /&gt;
Dank der einfachen Bauweise bietet sich der RPi mit seinen frei zugänglichen GPIO-Pins als ideale Bastelplattform an. Trotzdem kann es beim anfänglichen Experimentieren mit Schaltungen öfters zu kleinen Fehlern kommen, die schlimmstenfalls die empfindliche Elektronik des RPi dauerhaft beschädigen können.&lt;br /&gt;
&lt;br /&gt;
Daher wird bei diesem Projekt zusätzlich mit der &#039;PiFace[http://elinux.org/RPi_Expansion_Boards#Piface]&#039;-Karte gearbeitet, die man auf die GPIO-Pins stecken kann. Diese Erweiterungskarte verschaltet die GPIO-Pins auf je 8 digitale Ein- und Ausgänge sowie 2 Relais, die eine galvanische Trennung von Stromkreisen ermöglichen. Damit besteht auch für Einsteiger ein gewisser Schutz für die Steuerelektronik des RPi.&lt;br /&gt;
&lt;br /&gt;
Auch im weiteren Verlauf dieser Einführung soll noch auf eine Trennung der Stromkreise Wert gelegt werden, so dass für erste digitale Schaltexperimente ein Optokoppler genutzt wird. Die spätere Nutzung der &#039;Input Pins&#039; des PiFace um eine Steuerung der D/A-Wandlung durch bestimmte Ereignisse zu ermöglichen, erfolgt ebenfalls passiv.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Auch wenn mit vermeintlich &#039;sicheren&#039; Transformatoren gebastelt wird, muss stets bedacht werden, dass diese an einem 230V-Stromnetz betrieben werden und man eher einmal mehr als weniger prüfen sollte, ob man durch eventuelle Fehler mit lebensgefährlicher Spannung in Berührung kommt!&lt;br /&gt;
&lt;br /&gt;
== Auswahl eines Beispielprojektes ==&lt;br /&gt;
&lt;br /&gt;
Günstige Möglichkeiten ein Gerät zu finden, das mit analogen Spannungen arbeitet, bieten sich u.a. im Spielzeugbereich. Im Grunde eignet sich alles, was mit Batterien oder mit Gleichspannungen unter 24 V betrieben wird.&lt;br /&gt;
&lt;br /&gt;
Da jedoch ein Ziel das Steuern von analogen Spannungen ist, bietet sich insbesondere alles an, bei dem [[Potentiometer]] eingesetzt werden. Einen dieser &#039;Handregler&#039; sollte man übrig haben, da er von seinem Anschlusskabel abgetrennt werden muss, um den oft proprietären Steckanschluss nutzen zu können. In diesem Sinne wird hier eine handelsübliche Spielzeug-Autorennbahn mit Potentiometer-Handreglern genutzt.&lt;br /&gt;
&lt;br /&gt;
== Sonstige Bauteile ==&lt;br /&gt;
&lt;br /&gt;
Für die ersten Grundlagen (s. Teile 2 &amp;amp; 3) genügen bereits rund 2 m isolierter Draht, der nicht aus verdrillten feinen Adern (Litze) bestehen sollte, 50 cm nicht-isolierter Draht, einige niederohmige Widerstände (z.B. je 2 mal 100 Ohm, 80, 60, sowie 20) und ein &#039;Experimentierbrett&#039; (engl. [[Breadboard]]).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Grundlagen und Vorbereitung des Projekts =&lt;br /&gt;
&lt;br /&gt;
== Umwandlung von 1/0 zu Ein/Aus mit einem Relais ==&lt;br /&gt;
&lt;br /&gt;
Vom Prinzip her ist jede Umwandlung eines digitalen 0 oder 1 Signals (das über eine bestimmte Spannungsdifferenz festgelegt ist) in eine (nutzbare) Spannung bereits eine D/A-Wandlung. Dies wird schlicht so realisiert, dass mit einer Eingabe am RPi die Nutzspannung des &#039;Verbrauchers&#039; zunächst einfach an- und ausgeschaltet wird.&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung der zu steuernden Hardware ==&lt;br /&gt;
&lt;br /&gt;
a. Um Fehlerquellen auszuschließen sollte zunächst (und ggf. auch später!) kurz getestet werden, ob der vorhandene Regler wie erwartet funktioniert.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pif_Con9.jpg|thumb|right|400px|Fixierung der Reglerkabel]]&lt;br /&gt;
b. Nach dem Trennen des Reglers von der Einspeisung (und ggf. Ziehen des Netzsteckers) muss das Regler-Kabel abgeschnitten werden (eher nahe beim Regler, da das Kabel bald bis zum Breadboard reichen soll). Die neuen Enden des Einspeiseteils werden abisoliert und auf dem Breadboard diagonal zueinander mit einigen Spalten Abstand fixiert. Auch können bereits die Drähte, die später zum RPi führen, jeweils in den passenden kontaktführenden Spalten eingesteckt werden, z. B. wie rechts zu sehen (die nicht beschrifteten Drähte können vorerst ignoriert werden):&lt;br /&gt;
&lt;br /&gt;
c. Nun bietet sich eine gute Gelegenheit die maximale Spannung am Nutzgerät zu messen. Man verbindet das Regler-Kabel (nun ohne Regler) wieder mit der Einspeisung und die offenen Enden der Drähte mit dem Messgerät, bei dem zunächst ein Messbereich von ca. 10-50 Volt gewählt werden sollte. Dies sollte dann z.B. 14,8 V anzeigen. Natürlich können auch die beiden offenen Enden einen kleinen Moment kurz geschlossen werden, man sollte aber bedenken, dass das zu regelnde Nutzgerät dann die maximal vorgesehene Spannung erhält (hier: maximales Tempo).&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung des RPi ==&lt;br /&gt;
&lt;br /&gt;
Es wird davon ausgegangen, dass entsprechend des zugehörigen &#039;manual&#039; das PiFace bereits auf den RPi gesteckt ist, die nötigen python-Bibliotheken installiert sind und man sich im Terminal-Arbeitsverzeichnis &#039;pi&#039; befindet.&lt;br /&gt;
&lt;br /&gt;
a. Zunächst wird der PiFace-Emulator (im Terminal direkt aus dem Arbeitsverzeichnis) gestartet: &amp;lt;tt&amp;gt;piface/scripts/piface-emulator&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b. Wenn alles richtig installiert wurde, erscheint ein Fenster (unten links), bei dem die vorerst wichtigen blauen Signale am rechten Rand wie folgt angezeigt werden sollten: &lt;br /&gt;
 &lt;br /&gt;
[[Datei:RPi_PiF_em-scs.jpg|400px|Piface-Emulator im default-Zustand]] [[Datei:RPi_PiF_em_scs1.jpg|400px|Piface-Relais 1 auf &#039;1&#039; geschaltet]]&lt;br /&gt;
&lt;br /&gt;
c. Das rechte Fenster ergibt sich, wenn man nun im Fenster auf &amp;quot;Override Enable&amp;quot; und dann &amp;quot;Output Pin 1&amp;quot; klickt. Es müsste ein &amp;quot;Klick&amp;quot; vom Relais 1 zu hören sein sowie der Schaltzustand des unteren Relais 1 (das an den Output Pin 1 gekoppelt ist) auf die Verbindung der beiden unteren Anschlüsse wechseln. Zugleich wird das erste LED-Icon beim Output Pin 1 rot sowie das zugehörige LED-Icon blau.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pif_rel2.png|thumb|right|250px|Schema der Piface-Relais]]&lt;br /&gt;
d. Rechts ist der Schaltzustand der Relais, die zu Beginn genutzt werden, im Grundzustand dargestellt (jeweils der mittlere und obere Kontakt sind kurzgeschlossen, der jeweils untere Kontakt ist frei):&lt;br /&gt;
&lt;br /&gt;
e. Ein weiterer Klick auf &amp;quot;Output Pin 1&amp;quot; versetzt das Relais in den Ausgangszustand, der vor dem nächsten Schritt wieder eingestellt werden sollte.&lt;br /&gt;
&lt;br /&gt;
f. Das Relais lässt sich auch mittels eines Python-Scripts vom RPi aus ansteuern. Dazu wird folgende Textdatei &amp;quot;wandler.py&amp;quot; im Arbeitsverzeichnis abgespeichert und mit dem Befehl &amp;quot;&amp;lt;tt&amp;gt;python wandler.py&amp;lt;/tt&amp;gt;&amp;quot; gestartet:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler.py&lt;br /&gt;
&lt;br /&gt;
 from time import sleep&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
&lt;br /&gt;
 pfio.init()&lt;br /&gt;
&lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
 print &amp;quot;Strom an&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 sleep(2)&lt;br /&gt;
&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Strom aus&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Nach dem Absetzen des Befehls wechselt nun das blaue Signal an Relais 1 für 2 Sekunden und das Relais klickt entsprechend.&lt;br /&gt;
&lt;br /&gt;
== Einsatz eines Relais&#039; zur Umsetzung von Spannungsänderungen ==&lt;br /&gt;
&lt;br /&gt;
a. Ist das Relais wieder im Ausgangszustand, befestigt man nun einen der vom Breadboard führenden Drähte am unteren und einen am mittleren Relaiseingang (im Moment ist die Polarität noch egal). Zunächst sollte nichts passieren (das Relais hält diesen ja Stromkreis noch offen).&lt;br /&gt;
&lt;br /&gt;
b. Startet man aber das Script wieder (&amp;lt;tt&amp;gt;python wandler.py&amp;lt;/tt&amp;gt;) oder klickt auf &#039;Output Pin 1&#039; wird der Nutzstromkreis geschlossen. Nochmals aufgepasst: unser Nutzer erhält wieder die maximal vorgesehene Spannung - also besser vorher im Script &amp;quot;&amp;lt;tt&amp;gt;sleep(0.3)&amp;lt;/tt&amp;gt;&amp;quot; setzen und speichern.&lt;br /&gt;
&lt;br /&gt;
c. Im Prinzip ist damit die programmgesteuerte Umsetzung eines 0/1 Signals in z.B. eine 0V/15V Spannung erreicht.&lt;br /&gt;
&lt;br /&gt;
d. Da wir bald verschiedene Steuerspannungen schalten wollen, geht es jetzt darum herauszufinden, bei welcher Spannung unser Nutzgerät gerade noch bewegt wird. Dies probiert man aus - mit dem kleinsten Widerstand beginnend: indem einer der Drähte in eine freie Breadboardspalte gesteckt wird und aus dieser Spalte der Widerstand zu dem &#039;alten&#039; Steckplatz des Drahtes geführt wird. Nun startet man jeweils das Script bis der Widerstand so hoch ist, dass die Anlaufspannung beim Nutzgerätes gut ausreicht, eine Reaktion des Nutzgerät (Fahrzeug bewegt sich) zu bewirken (z.B. bei 50 Ohm beträgt der Strom im Mittel ca. 130 mA während ohne 190 mA fließen).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Ansteuerung von 3 Schaltstufen =&lt;br /&gt;
&lt;br /&gt;
== Kombination von 2 Relais ==&lt;br /&gt;
&lt;br /&gt;
[[Bild:ZrelMww2.png|thumb|right|250px|Beschaltung der Relais]] a. Die einfachste Stufe der weiteren Verschaltung erreicht man, indem der Widerstand mit einem 2. Relais überbrückt wird. Relais 1 kann dann als &#039;Hauptschalter&#039;, Relais 2 als Spannungsumschalter genutzt werden:&lt;br /&gt;
&lt;br /&gt;
b. Diese Beschaltung kann sogleich mit dem PiFace-Emulator ausprobiert werden. Damit können wir bereits 3 Schaltstufen steuern: keine, verminderte und volle Spannung.&lt;br /&gt;
&lt;br /&gt;
c. Theoretisch ließe sich auch noch eine 4. Spannungsstufe erzeugen, da mit 2 &#039;Bits&#039; (Ein/Aus bei 2 Relais) bereits 4 verschiedene Signale darstellbar sind. Beim jetzigen Aufbau werden aber lediglich die (pin1,pin2)-Signale (0,0), (1,0) und (1,1) &#039;genutzt&#039;, da Relais 1 als Hauptschalter vorgesehen ist und die Kombination (0,1) so nicht ausgewertet wird.&lt;br /&gt;
&lt;br /&gt;
== Programmgesteuerte Schaltung von 2 Relais ==&lt;br /&gt;
&lt;br /&gt;
a. Mit einem veränderten python-Script &amp;quot;wandler2.py&amp;quot; ist auch die programmgesteuerte Schaltung möglich. Dabei werden zusätzlich die Tasten 1 und 2 des PiFace genutzt, um nach dem Start des Scripts (&amp;lt;tt&amp;gt;python wandler2.py&amp;lt;/tt&amp;gt;) den Hauptschalter (Relais 1) zu steuern:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler2.py&lt;br /&gt;
 &lt;br /&gt;
 from time import sleep&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
 pfio.init()&lt;br /&gt;
 &lt;br /&gt;
 taste_1=0&lt;br /&gt;
 taste_2=0&lt;br /&gt;
 intervall_a=0.1&lt;br /&gt;
 intervall_b=0.5&lt;br /&gt;
 # Die Intervalle bestimmen die Schaltzeit für volle/verminderte Spannung&lt;br /&gt;
 &lt;br /&gt;
 print &amp;quot;Zum Start Taste 1 drücken, zum Stoppen Taste 2&amp;quot;&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 while taste_1 == 0:&lt;br /&gt;
   sleep(intervall_a)&lt;br /&gt;
   taste_1=pfio.digital_read(1)&lt;br /&gt;
&lt;br /&gt;
 # Der o.g. &#039;sleep&#039;-Befehl bestimmt die Abfragepausen für Taste 1&lt;br /&gt;
 &lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
 print &amp;quot;Strom an!&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 while taste_2 == 0:&lt;br /&gt;
   pfio.digital_write(2,1)&lt;br /&gt;
   sleep(intervall_a)&lt;br /&gt;
   pfio.digital_write(2,0)&lt;br /&gt;
   sleep(intervall_b)&lt;br /&gt;
   taste_2=pfio.digital_read(2)&lt;br /&gt;
 &lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Strom aus!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
b. Falls beim Ausprobieren von Script-Änderungen mal was schief geht, kann das Script stets auch mit der Tastenkombination (CTRL-C) gestoppt werden. U.U. muss dann noch zusätzlich Relais 1 und/oder 2 via Emulator zurückgesetzt werden.&lt;br /&gt;
&lt;br /&gt;
c. Beim Verändern des Scripts fällt bald auf, dass die bisherige Programmsteuerung keine direkte Möglichkeit vorsieht, auf Ereignisse zu reagieren. Immerhin wird ein mechanisches Gerät gesteuert, bei dem mit Ausfällen, Fertigungstoleranzen, Umwelteinflüssen etc. zu rechnen ist (im Script wird dies bislang &#039;nur&#039; durch die Abbruchbedingung &#039;Taste 2&#039; berücksichtigt).&lt;br /&gt;
&lt;br /&gt;
== Einfache Sensor-Signale als steuernde Elemente eines Programms ==&lt;br /&gt;
&lt;br /&gt;
a. Eine wichtige Anwendung von D/A-Steuerungen ist die mögliche Reaktion dieser Steuerung auf &#039;äußere&#039; Ereignisse, die z.B. mit Hilfe von Sensoren leistbar ist.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Einf_Sens.jpg|thumb|right|250px|einfacher Sensor]]b. Für unsere Zwecke genügt zunächst ein sehr einfacher Sensor, der ein 0- oder 1-Signal liefert und idealerweise direkt am &#039;Input Pin 1&#039; des PiFace angeschlossen werden kann. So liegt beim Input Pin 1 das Signal &#039;1&#039; an, wenn eine Verbindung zu &#039;Input GND&#039; besteht.&lt;br /&gt;
Z.B. können 2 unisolierte Drähte so platziert werden, dass ein vorbeifahrendes Fahrzeug einen von ihnen genügend bewegt um den Kontakt kurze Zeit zu öffnen. Genau dann liefert dieser &#039;Sensor&#039; das Signal &#039;0&#039;. Eine - die Schwerkraft nutzende - mögliche Bauform ist rechts abgebildet ;-)&lt;br /&gt;
&lt;br /&gt;
c. Natürlich werden zusätzlich 2 isolierte Drähte benötigt, um jeden der beiden offenen Drähte geschützt mit Input Pin 1 und Input GND zu verbinden.&lt;br /&gt;
&lt;br /&gt;
d. Bei jeder Durchfahrt liefert der Sensor nun ein &#039;0&#039;-Signal, was im Script sowohl für eine Zeitmessung als auch für ein &#039;Schaltintervall-Array&#039; genutzt werden kann. Dort können abwechselnd für beide Spannungen Zeiten (die in etwa zum jeweiligen Streckenabschnitt passen) &#039;programmiert&#039; werden. Statt Taste 1 wird nun der Sensor ausgewertet (wobei Taste 1 als Sensor-Ersatz insoweit genutzt werden kann, dass sie gedrückt bleiben bzw. kurz losgelassen werden muss). Zur genaueren Zeitmessung wird noch das modul &#039;clock&#039; benötigt. &amp;quot;&amp;lt;tt&amp;gt;wandler3.py&amp;lt;/tt&amp;gt;&amp;quot; könnte also so aussehen:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler3.py&lt;br /&gt;
 &lt;br /&gt;
 from time import clock&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
 sensor_1=1&lt;br /&gt;
 sensor_2=0&lt;br /&gt;
 rundenzahl=0&lt;br /&gt;
 v_wechsel=0&lt;br /&gt;
 vorrunde=0&lt;br /&gt;
 index_zaehler=1&lt;br /&gt;
 &lt;br /&gt;
 zeit_array=[0,0.2,0.4,0.2,0.4,0.2,0.4,0.2,5,0.2,6]&lt;br /&gt;
 # dieses array enthält die sek. bis zum Spannungswechsel&lt;br /&gt;
&lt;br /&gt;
 array_laenge=9&lt;br /&gt;
 # legt fest, wie viel Werte des arrays genutzt werden sollen&lt;br /&gt;
 &lt;br /&gt;
 sensor_aus=1.3&lt;br /&gt;
 # bis der Sensor sicher in die Ruhestellung kippt, wird er nicht ausgelesen&lt;br /&gt;
  &lt;br /&gt;
 pfio.init()&lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
&lt;br /&gt;
 # das Fahrzeug wird langsam zum Start (=Sensor) bewegt&lt;br /&gt;
 while sensor_1 == 1 :&lt;br /&gt;
   sensor_1=pfio.digital_read(1)&lt;br /&gt;
  &lt;br /&gt;
 print &amp;quot;fliegender Start... zum Beenden Taste 2 drücken&amp;quot;&lt;br /&gt;
 print &amp;quot;Runde Nr., Ges.Zeit, Rundenzeit, mittlere Rundenzeit&amp;quot;&lt;br /&gt;
 start_zeit=clock()&lt;br /&gt;
 runden_start=start_zeit&lt;br /&gt;
  &lt;br /&gt;
 while sensor_2 == 0 :&lt;br /&gt;
   sensor_2=pfio.digital_read(2)&lt;br /&gt;
   v_wechsel=1-v_wechsel&lt;br /&gt;
   pfio.digital_write(2,v_wechsel)&lt;br /&gt;
   sensor_zeit=clock()&lt;br /&gt;
  &lt;br /&gt;
   while zeit_array[index_zaehler]+sensor_zeit &amp;gt; clock() :&lt;br /&gt;
     if runden_start+sensor_aus &amp;lt; clock() :&lt;br /&gt;
 &lt;br /&gt;
       sensor_1=pfio.digital_read(1) &lt;br /&gt;
       if sensor_1 == 0 :&lt;br /&gt;
         rundenzahl=rundenzahl+1&lt;br /&gt;
         runden_start=clock()&lt;br /&gt;
         zeit=runden_start-start_zeit&lt;br /&gt;
         print rundenzahl, zeit, zeit-vorrunde, zeit/rundenzahl&lt;br /&gt;
         vorrunde=zeit&lt;br /&gt;
         sensor_zeit=0&lt;br /&gt;
         index_zaehler=0&lt;br /&gt;
         v_wechsel=0&lt;br /&gt;
  &lt;br /&gt;
   index_zaehler=index_zaehler+1&lt;br /&gt;
   if index_zaehler &amp;gt; array_laenge :&lt;br /&gt;
     sensor_2=1&lt;br /&gt;
     print &amp;quot;array-Ende erreicht!&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Outp 1 &amp;amp; 2 auf 0!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wird das Array-Ende erreicht, wurden entweder zu wenige Einträge vorgesehen oder es befindet sich kein Fahrzeug (mehr) auf der Strecke, das den Sensor und damit des Zurücksetzen des Arrays auslösen konnte.&lt;br /&gt;
&lt;br /&gt;
e. Das Array ist an die jeweilige Strecke anzupassen, wobei der vorderste Eintrag ungenutzt bleibt und dann mit der Dauer für maximale Spannung begonnen wird. Solange man mit Relais arbeitet, sollten die Schaltzeiten nicht zu kurz sein (&amp;gt;0.1 sek.), da diese eine gewisse mechanische Trägheit besitzen.&lt;br /&gt;
&lt;br /&gt;
f. Eben diese mechanische Beschaffenheit der Relais (Verschleiß) ist auch ein guter Grund, auf &#039;volle&#039; digitale Signalumwandlung umzustellen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Optokoppler als Ersatz für Relais =&lt;br /&gt;
&lt;br /&gt;
Ähnlich wie ein Relais dient ein [[Optokoppler]] dazu, eine Signalübertragung zwischen zwei getrennten Stromkreisen zu ermöglichen. Bei diesem Projekt liegt der Einsatz von Optokopplern nahe, da sie schneller schalten und keine beweglichen Teile besitzen. Für unsere Zwecke benötigen wir nun als zusätzliche Elemente: Optokoppler (CNY 17-4), npn-[[Transistor]]en (BC 337-40) zur Signalverstärkung sowie einige Widerstände im Bereich von 2k und 400 Ohm. &lt;br /&gt;
&lt;br /&gt;
== Kaskadierung von Transistoren zur Signalverstärkung ==&lt;br /&gt;
&lt;br /&gt;
a. Entsprechend Schritt 2.4.d. (ein Relais bei 50 Ohm) wird zunächst ein [[Optokoppler]] eingesetzt, dessen Signal durch einen Transistor verstärkt wird, um die &#039;Grundspannung&#039; zu schalten (Pin 3 und 6 beim Optokoppler sollten unbeschaltet bleiben, allein der &#039;Lichtstrom&#039; reicht für eine Ansteuerung aus):&lt;br /&gt;
&lt;br /&gt;
[[Bild:PiF_CNY_BC_1.png|400px|Optokoppler mit Transistor]]&lt;br /&gt;
&lt;br /&gt;
b. Da immer mit einer gewissen Toleranz bei allen Komponenten zu rechnen ist, kann es sein, dass u.U. die Widerstände etwas größer oder kleiner gewählt werden müssen. Beim Ausprobieren sollte man hier in 10% Schritten variieren.&lt;br /&gt;
&lt;br /&gt;
c. Bei Austesten mit Emulator oder Script ist auch zu beachten, dass nun &#039;Output Pin 8&#039; genutzt wird, da dieser nicht mit den Relais verschaltet ist.&lt;br /&gt;
&lt;br /&gt;
== Umsetzung von 3 Schaltstufen mit Optokopplern ==&lt;br /&gt;
&lt;br /&gt;
a. Entsprechend dem Vorgehen beim Relais kann nun auch der kleine Widerstand zusätzlich beschaltet werden um seine gesteuerte Überbrückung zu ermöglichen. Da hier eine relativ geringe Spannung aufgeschaltet wird, kann zu Beginn eine Diode eingesetzt werden, die die Schaltstufe &#039;maximale Spannung&#039; anzeigt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:SmPiFu2ou2T.png|400px|Kombination von 2 Optokopplern]]&lt;br /&gt;
&lt;br /&gt;
b. Vor dem Testen ist wieder zu beachten, dass nun zusätzlich &#039;Output Pin 7&#039; genutzt wird (statt Output Pin 2).&lt;br /&gt;
&lt;br /&gt;
c. Neben dem Weglassen der Diode (was die Maximalgeschwindigkeit leicht erhöht), können auch statt der 400 Ohm Widerstände 1k-Werte oder höher gewählt werden, wenn dadurch der jeweilige Basisstrom noch hoch genug ist. Im vorliegenden Fall war erst ab 400 Ohm keine weitere Tempoerhöhung mehr feststellbar.&lt;br /&gt;
&lt;br /&gt;
d. Eine mögliche Realisierung sieht so aus: http://youtu.be/xQ7N-PrIULk&lt;br /&gt;
&lt;br /&gt;
== Zusätzliche Erhöhung der Schaltstufen bei D/A-Wandlern ==&lt;br /&gt;
&lt;br /&gt;
a. Zwar benötigen wir in unserem speziellen Beispiel eine &#039;Grundspannung&#039;, die sich dahingehend auswirkt, dass - wie unter 3.1.c. erwähnt - eine Signalkombination nicht ausgewertet wird, aber mit jeder weiteren Schaltstufe würde sich dieses Problem (theoretisch) relativieren, da bei geschickter Auswahl der Widerstände (z.B. im Verhältnis 1 zu 2) jeweils eine Verdoppelung der Kombinationsmöglichkeiten erreichbar ist.&lt;br /&gt;
&lt;br /&gt;
b. Wird hier der 50 Ohm Widerstand asymmetrisch geteilt (z.B. 15 + 35 Ohm, s.a. [[Spannungsteiler]]) um dort ein weiteres Signal umsetzen zu können, ergeben sich direkt folgende 5 Schaltstufen (aus, 50, 35, 15 und 0 Ohm) u.s.w.:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Sm3ou3t2.png|400px|Erhöhung der Schaltstufen]]&lt;br /&gt;
&lt;br /&gt;
c. Zur Ansteuerung dieser Schaltstufen wäre das Script so zu ändern, dass nun zwischen mehr als 2 Stufen gewechselt werden kann und im Array entsprechende Zusatzdaten vorgegeben und ausgelesen werden. Mehr als diese Stufen sind im konkreten Fall aber nicht sinnvoll, da die entstehende Verlustleistung in der Schaltung die maximal verfügbare Leistung reduziert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Weiterführende Ideen =&lt;br /&gt;
&lt;br /&gt;
Die Ausbaumöglichkeiten dieses Projektes sind vielfältig:&lt;br /&gt;
&lt;br /&gt;
== Hardwareseitige Ausbauvarianten ==&lt;br /&gt;
&lt;br /&gt;
- beispielhafte Umsetzung einer differenzierten Abstufung mittels eines möglichst oft durch 2 teilbaren Anfangswertes und der Teiler (640 Ohm, 320, 160...) oder in 10er Potenzen;&lt;br /&gt;
&lt;br /&gt;
- Nachbau des Projekts mit einem Mikrocontroller (ggf. mit LCD-Anzeige);&lt;br /&gt;
&lt;br /&gt;
- Umbau der Steuerung mit dem Ziel, sie direkt an die GPIO-Pins des RPi anzuschließen;&lt;br /&gt;
&lt;br /&gt;
- Entwurf einer Zusatzschaltung, die in diesem Beispiel eine Rückmeldung liefert, ob ein Verbraucher aktiv ist oder nicht (Fahrzeug noch auf der Strecke?);&lt;br /&gt;
&lt;br /&gt;
- Entwurf einer Zusatzschaltung, die erkennt wie viel Strom fliesst: damit wären Rückschlüsse auf den Streckenverlauf möglich (Kurve=etwas mehr Strom, Steigung=noch mehr Strom nötig, etc.) und so auch eine programmgesteuerte Optimierung der Array-Schaltzeiten dankbar; &lt;br /&gt;
&lt;br /&gt;
- Einsatz anderer Sensortechniken und/oder mehrerer Sensoren zur Optimierung der Schnelligkeit oder parallelen Steuerung eines 2. Fahrzeuges;&lt;br /&gt;
&lt;br /&gt;
== Softwareseitige Ausbauvarianten ==&lt;br /&gt;
&lt;br /&gt;
- Optimierung des Scripts, indem die Sensor-Abfrage über einen &#039;Listener&#039; umgesetzt wird;&lt;br /&gt;
&lt;br /&gt;
- Erweiterung des Scripts um eine GUI mit Hilfe der python-lib Tkinter, um einen Nutzerzugriff auf das Steuerarray und/oder eine &#039;Verwaltung&#039; mehrerer Fahrzeuge;&lt;br /&gt;
&lt;br /&gt;
- Einbindung eines Web-Interface um eine &#039;Fernsteuerung&#039; zu ermöglichen...&lt;br /&gt;
&lt;br /&gt;
...in jedem Fall: viel Spaß beim Basteln!&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [http://hackaday.com/2013/01/23/replacement-controllers-for-slot-car-racing/ andere Variante der Ersetzung der Handregler bei &#039;hackaday&#039;] &lt;br /&gt;
* [https://docs.google.com/folder/d/0B-UAZ9CyJCLGQjJ3RDlqa2pqaDg/edit?pli=1&amp;amp;docId=0B-UAZ9CyJCLGNmpMeVpyYlZJUWc Relaisschaltung mit pädagogischer Erweiterung der Universität Manchester (englischspr.)]&lt;br /&gt;
* [http://elinux.org/RPi_Projects englischsp. Projektliste zum RPi]&lt;br /&gt;
* [http://elinux.org/RPi_Projects/PiFace_controlling_a_slot-car paralleler englischsp. Bericht des Autors zum RPi mit anderem Schwerpunkt] &lt;br /&gt;
* [http://www.mikrocontroller.net/articles/GhostCarProjekt Verlagerung der gesamten Steuerelektronik ins Fahrzeug]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Raspberry Pi]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Mknot9</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=RPi_als_D/A-Wandler&amp;diff=74514</id>
		<title>RPi als D/A-Wandler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=RPi_als_D/A-Wandler&amp;diff=74514"/>
		<updated>2013-03-08T22:13:54Z</updated>

		<summary type="html">&lt;p&gt;Mknot9: /* Siehe auch */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;von M. Knoop&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
Oft wird ein Computer &#039;nur&#039; genutzt um darauf Software ablaufen zu lassen. Dessen Möglichkeit zur Steuerung von elektrischen und mechanischen Geräten wird dabei leicht übersehen.&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel richtet sich daher an Einsteiger, die mit dem [[Raspberry Pi]] (&#039;RPi&#039;) Grundlagen der Computersteuerung mit Relais und [[Spannungsteiler]]n nachvollziehen möchten. Es wird an einem konkreten Beispiel schrittweise dargestellt, wie mittels eines D/A-Wandlers (Digital/Analog-Wandler = Umwandlung von digitalen 1/0 Signale) die Steuerung einer stufenweise veränderbaren Ausgangsspannung aufgebaut werden kann.&lt;br /&gt;
&lt;br /&gt;
= Verwendete Hardware =&lt;br /&gt;
&lt;br /&gt;
== RPi in Kombination mit der &#039;PiFace&#039;-Karte als Bastelplattform ==&lt;br /&gt;
&lt;br /&gt;
Dank der einfachen Bauweise bietet sich der RPi mit seinen frei zugänglichen GPIO-Pins als ideale Bastelplattform an. Trotzdem kann es beim anfänglichen Experimentieren mit Schaltungen öfters zu kleinen Fehlern kommen, die schlimmstenfalls die empfindliche Elektronik des RPi dauerhaft beschädigen können.&lt;br /&gt;
&lt;br /&gt;
Daher wird bei diesem Projekt zusätzlich mit der &#039;PiFace[http://elinux.org/RPi_Expansion_Boards#Piface]&#039;-Karte gearbeitet, die man auf die GPIO-Pins stecken kann. Diese Erweiterungskarte verschaltet die GPIO-Pins auf je 8 digitale Ein- und Ausgänge sowie 2 Relais, die eine galvanische Trennung von Stromkreisen ermöglichen. Damit besteht auch für Einsteiger ein gewisser Schutz für die Steuerelektronik des RPi.&lt;br /&gt;
&lt;br /&gt;
Auch im weiteren Verlauf dieser Einführung soll noch auf eine Trennung der Stromkreise Wert gelegt werden, so dass für erste digitale Schaltexperimente ein Optokoppler genutzt wird. Die spätere Nutzung der &#039;Input Pins&#039; des PiFace um eine Steuerung der D/A-Wandlung durch bestimmte Ereignisse zu ermöglichen, erfolgt ebenfalls passiv.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Auch wenn mit vermeintlich &#039;sicheren&#039; Transformatoren gebastelt wird, muss stets bedacht werden, dass diese an einem 230V-Stromnetz betrieben werden und man eher einmal mehr als weniger prüfen sollte, ob man durch eventuelle Fehler mit lebensgefährlicher Spannung in Berührung kommt!&lt;br /&gt;
&lt;br /&gt;
== Auswahl eines Beispielprojektes ==&lt;br /&gt;
&lt;br /&gt;
Günstige Möglichkeiten ein Gerät zu finden, das mit analogen Spannungen arbeitet, bieten sich u.a. im Spielzeugbereich. Im Grunde eignet sich alles, was mit Batterien oder mit Gleichspannungen unter 24 V betrieben wird.&lt;br /&gt;
&lt;br /&gt;
Da jedoch ein Ziel das Steuern von analogen Spannungen ist, bietet sich insbesondere alles an, bei dem [[Potentiometer]] eingesetzt werden. Einen dieser &#039;Handregler&#039; sollte man übrig haben, da er von seinem Anschlusskabel abgetrennt werden muss, um den oft proprietären Steckanschluss nutzen zu können. In diesem Sinne wird hier eine handelsübliche Spielzeug-Autorennbahn mit Potentiometer-Handreglern genutzt.&lt;br /&gt;
&lt;br /&gt;
== Sonstige Bauteile ==&lt;br /&gt;
&lt;br /&gt;
Für die ersten Grundlagen (s. Teile 2 &amp;amp; 3) genügen bereits rund 2 m isolierter Draht, der nicht aus verdrillten feinen Adern (Litze) bestehen sollte, 50 cm nicht-isolierter Draht, einige niederohmige Widerstände (z.B. je 2 mal 100 Ohm, 80, 60, sowie 20) und ein &#039;Experimentierbrett&#039; (engl. [[Breadboard]]).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Grundlagen und Vorbereitung des Projekts =&lt;br /&gt;
&lt;br /&gt;
== Umwandlung von 1/0 zu Ein/Aus mit einem Relais ==&lt;br /&gt;
&lt;br /&gt;
Vom Prinzip her ist jede Umwandlung eines digitalen 0 oder 1 Signals (das über eine bestimmte Spannungsdifferenz festgelegt ist) in eine (nutzbare) Spannung bereits eine D/A-Wandlung. Dies wird schlicht so realisiert, dass mit einer Eingabe am RPi die Nutzspannung des &#039;Verbrauchers&#039; zunächst einfach an- und ausgeschaltet wird.&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung der zu steuernden Hardware ==&lt;br /&gt;
&lt;br /&gt;
a. Um Fehlerquellen auszuschließen sollte zunächst (und ggf. auch später!) kurz getestet werden, ob der vorhandene Regler wie erwartet funktioniert.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pif_Con9.jpg|thumb|right|400px|Fixierung der Reglerkabel]]&lt;br /&gt;
b. Nach dem Trennen des Reglers von der Einspeisung (und ggf. Ziehen des Netzsteckers) muss das Regler-Kabel abgeschnitten werden (eher nahe beim Regler, da das Kabel bald bis zum Breadboard reichen soll). Die neuen Enden des Einspeiseteils werden abisoliert und auf dem Breadboard diagonal zueinander mit einigen Spalten Abstand fixiert. Auch können bereits die Drähte, die später zum RPi führen, jeweils in den passenden kontaktführenden Spalten eingesteckt werden, z. B. wie rechts zu sehen (die nicht beschrifteten Drähte können vorerst ignoriert werden):&lt;br /&gt;
&lt;br /&gt;
c. Nun bietet sich eine gute Gelegenheit die maximale Spannung am Nutzgerät zu messen. Man verbindet das Regler-Kabel (nun ohne Regler) wieder mit der Einspeisung und die offenen Enden der Drähte mit dem Messgerät, bei dem zunächst ein Messbereich von ca. 10-50 Volt gewählt werden sollte. Dies sollte dann z.B. 14,8 V anzeigen. Natürlich können auch die beiden offenen Enden einen kleinen Moment kurz geschlossen werden, man sollte aber bedenken, dass das zu regelnde Nutzgerät dann die maximal vorgesehene Spannung erhält (hier: maximales Tempo).&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung des RPi ==&lt;br /&gt;
&lt;br /&gt;
Es wird davon ausgegangen, dass entsprechend des zugehörigen &#039;manual&#039; das PiFace bereits auf den RPi gesteckt ist, die nötigen python-Bibliotheken installiert sind und man sich im Terminal-Arbeitsverzeichnis &#039;pi&#039; befindet.&lt;br /&gt;
&lt;br /&gt;
a. Zunächst wird der PiFace-Emulator (im Terminal direkt aus dem Arbeitsverzeichnis) gestartet: &amp;lt;tt&amp;gt;piface/scripts/piface-emulator&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b. Wenn alles richtig installiert wurde, erscheint ein Fenster (unten links), bei dem die vorerst wichtigen blauen Signale am rechten Rand wie folgt angezeigt werden sollten: &lt;br /&gt;
 &lt;br /&gt;
[[Datei:RPi_PiF_em-scs.jpg|400px|Piface-Emulator im default-Zustand]] [[Datei:RPi_PiF_em_scs1.jpg|400px|Piface-Relais 1 auf &#039;1&#039; geschaltet]]&lt;br /&gt;
&lt;br /&gt;
c. Das rechte Fenster ergibt sich, wenn man nun im Fenster auf &amp;quot;Override Enable&amp;quot; und dann &amp;quot;Output Pin 1&amp;quot; klickt. Es müsste ein &amp;quot;Klick&amp;quot; vom Relais 1 zu hören sein sowie der Schaltzustand des unteren Relais 1 (das an den Output Pin 1 gekoppelt ist) auf die Verbindung der beiden unteren Anschlüsse wechseln. Zugleich wird das erste LED-Icon beim Output Pin 1 rot sowie das zugehörige LED-Icon blau.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pif_rel2.png|thumb|right|250px|Schema der Piface-Relais]]&lt;br /&gt;
d. Rechts ist der Schaltzustand der Relais, die zu Beginn genutzt werden, im Grundzustand dargestellt (jeweils der mittlere und obere Kontakt sind kurzgeschlossen, der jeweils untere Kontakt ist frei):&lt;br /&gt;
&lt;br /&gt;
e. Ein weiterer Klick auf &amp;quot;Output Pin 1&amp;quot; versetzt das Relais in den Ausgangszustand, der vor dem nächsten Schritt wieder eingestellt werden sollte.&lt;br /&gt;
&lt;br /&gt;
f. Das Relais lässt sich auch mittels eines Python-Scripts vom RPi aus ansteuern. Dazu wird folgende Textdatei &amp;quot;wandler.py&amp;quot; im Arbeitsverzeichnis abgespeichert und mit dem Befehl &amp;quot;&amp;lt;tt&amp;gt;python wandler.py&amp;lt;/tt&amp;gt;&amp;quot; gestartet:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler.py&lt;br /&gt;
&lt;br /&gt;
 from time import sleep&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
&lt;br /&gt;
 pfio.init()&lt;br /&gt;
&lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
 print &amp;quot;Strom an&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 sleep(2)&lt;br /&gt;
&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Strom aus&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Nach dem Absetzen des Befehls wechselt nun das blaue Signal an Relais 1 für 2 Sekunden und das Relais klickt entsprechend.&lt;br /&gt;
&lt;br /&gt;
== Einsatz eines Relais&#039; zur Umsetzung von Spannungsänderungen ==&lt;br /&gt;
&lt;br /&gt;
a. Ist das Relais wieder im Ausgangszustand, befestigt man nun einen der vom Breadboard führenden Drähte am unteren und einen am mittleren Relaiseingang (im Moment ist die Polarität noch egal). Zunächst sollte nichts passieren (das Relais hält diesen ja Stromkreis noch offen).&lt;br /&gt;
&lt;br /&gt;
b. Startet man aber das Script wieder (&amp;lt;tt&amp;gt;python wandler.py&amp;lt;/tt&amp;gt;) oder klickt auf &#039;Output Pin 1&#039; wird der Nutzstromkreis geschlossen. Nochmals aufgepasst: unser Nutzer erhält wieder die maximal vorgesehene Spannung - also besser vorher im Script &amp;quot;&amp;lt;tt&amp;gt;sleep(0.3)&amp;lt;/tt&amp;gt;&amp;quot; setzen und speichern.&lt;br /&gt;
&lt;br /&gt;
c. Im Prinzip ist damit die programmgesteuerte Umsetzung eines 0/1 Signals in z.B. eine 0V/15V Spannung erreicht.&lt;br /&gt;
&lt;br /&gt;
d. Da wir bald verschiedene Steuerspannungen schalten wollen, geht es jetzt darum herauszufinden, bei welcher Spannung unser Nutzgerät gerade noch bewegt wird. Dies probiert man aus - mit dem kleinsten Widerstand beginnend: indem einer der Drähte in eine freie Breadboardspalte gesteckt wird und aus dieser Spalte der Widerstand zu dem &#039;alten&#039; Steckplatz des Drahtes geführt wird. Nun startet man jeweils das Script bis der Widerstand so hoch ist, dass die Anlaufspannung beim Nutzgerätes gut ausreicht, eine Reaktion des Nutzgerät (Fahrzeug bewegt sich) zu bewirken (z.B. bei 50 Ohm beträgt der Strom im Mittel ca. 130 mA während ohne 190 mA fließen).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Ansteuerung von 3 Schaltstufen =&lt;br /&gt;
&lt;br /&gt;
== Kombination von 2 Relais ==&lt;br /&gt;
&lt;br /&gt;
[[Bild:ZrelMww2.png|thumb|right|250px|Beschaltung der Relais]] a. Die einfachste Stufe der weiteren Verschaltung erreicht man, indem der Widerstand mit einem 2. Relais überbrückt wird. Relais 1 kann dann als &#039;Hauptschalter&#039;, Relais 2 als Spannungsumschalter genutzt werden:&lt;br /&gt;
&lt;br /&gt;
b. Diese Beschaltung kann sogleich mit dem PiFace-Emulator ausprobiert werden. Damit können wir bereits 3 Schaltstufen steuern: keine, verminderte und volle Spannung.&lt;br /&gt;
&lt;br /&gt;
c. Theoretisch ließe sich auch noch eine 4. Spannungsstufe erzeugen, da mit 2 &#039;Bits&#039; (Ein/Aus bei 2 Relais) bereits 4 verschiedene Signale darstellbar sind. Beim jetzigen Aufbau werden aber lediglich die (pin1,pin2)-Signale (0,0), (1,0) und (1,1) &#039;genutzt&#039;, da Relais 1 als Hauptschalter vorgesehen ist und die Kombination (0,1) so nicht ausgewertet wird.&lt;br /&gt;
&lt;br /&gt;
== Programmgesteuerte Schaltung von 2 Relais ==&lt;br /&gt;
&lt;br /&gt;
a. Mit einem veränderten python-Script &amp;quot;wandler2.py&amp;quot; ist auch die programmgesteuerte Schaltung möglich. Dabei werden zusätzlich die Tasten 1 und 2 des PiFace genutzt, um nach dem Start des Scripts (&amp;lt;tt&amp;gt;python wandler2.py&amp;lt;/tt&amp;gt;) den Hauptschalter (Relais 1) zu steuern:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler2.py&lt;br /&gt;
 &lt;br /&gt;
 from time import sleep&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
 pfio.init()&lt;br /&gt;
 &lt;br /&gt;
 taste_1=0&lt;br /&gt;
 taste_2=0&lt;br /&gt;
 intervall_a=0.1&lt;br /&gt;
 intervall_b=0.5&lt;br /&gt;
 # Die Intervalle bestimmen die Schaltzeit für volle/verminderte Spannung&lt;br /&gt;
 &lt;br /&gt;
 print &amp;quot;Zum Start Taste 1 drücken, zum Stoppen Taste 2&amp;quot;&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 while taste_1 == 0:&lt;br /&gt;
   sleep(intervall_a)&lt;br /&gt;
   taste_1=pfio.digital_read(1)&lt;br /&gt;
&lt;br /&gt;
 # Der o.g. &#039;sleep&#039;-Befehl bestimmt die Abfragepausen für Taste 1&lt;br /&gt;
 &lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
 print &amp;quot;Strom an!&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 while taste_2 == 0:&lt;br /&gt;
   pfio.digital_write(2,1)&lt;br /&gt;
   sleep(intervall_a)&lt;br /&gt;
   pfio.digital_write(2,0)&lt;br /&gt;
   sleep(intervall_b)&lt;br /&gt;
   taste_2=pfio.digital_read(2)&lt;br /&gt;
 &lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Strom aus!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
b. Falls beim Ausprobieren von Script-Änderungen mal was schief geht, kann das Script stets auch mit der Tastenkombination (CTRL-C) gestoppt werden. U.U. muss dann noch zusätzlich Relais 1 und/oder 2 via Emulator zurückgesetzt werden.&lt;br /&gt;
&lt;br /&gt;
c. Beim Verändern des Scripts fällt bald auf, dass die bisherige Programmsteuerung keine direkte Möglichkeit vorsieht, auf Ereignisse zu reagieren. Immerhin wird ein mechanisches Gerät gesteuert, bei dem mit Ausfällen, Fertigungstoleranzen, Umwelteinflüssen etc. zu rechnen ist (im Script wird dies bislang &#039;nur&#039; durch die Abbruchbedingung &#039;Taste 2&#039; berücksichtigt).&lt;br /&gt;
&lt;br /&gt;
== Einfache Sensor-Signale als steuernde Elemente eines Programms ==&lt;br /&gt;
&lt;br /&gt;
a. Eine wichtige Anwendung von D/A-Steuerungen ist die mögliche Reaktion dieser Steuerung auf &#039;äußere&#039; Ereignisse, die z.B. mit Hilfe von Sensoren leistbar ist.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Einf_Sens.jpg|thumb|right|250px|einfacher Sensor]]b. Für unsere Zwecke genügt zunächst ein sehr einfacher Sensor, der ein 0- oder 1-Signal liefert und idealerweise direkt am &#039;Input Pin 1&#039; des PiFace angeschlossen werden kann. So liegt beim Input Pin 1 das Signal &#039;1&#039; an, wenn eine Verbindung zu &#039;Input GND&#039; besteht.&lt;br /&gt;
Z.B. können 2 unisolierte Drähte so platziert werden, dass ein vorbeifahrendes Fahrzeug einen von ihnen genügend bewegt um den Kontakt kurze Zeit zu öffnen. Genau dann liefert dieser &#039;Sensor&#039; das Signal &#039;0&#039;. Eine - die Schwerkraft nutzende - mögliche Bauform ist rechts abgebildet ;-)&lt;br /&gt;
&lt;br /&gt;
c. Natürlich werden zusätzlich 2 isolierte Drähte benötigt, um jeden der beiden offenen Drähte geschützt mit Input Pin 1 und Input GND zu verbinden.&lt;br /&gt;
&lt;br /&gt;
d. Bei jeder Durchfahrt liefert der Sensor nun ein &#039;0&#039;-Signal, was im Script sowohl für eine Zeitmessung als auch für ein &#039;Schaltintervall-Array&#039; genutzt werden kann. Dort können abwechselnd für beide Spannungen Zeiten (die in etwa zum jeweiligen Streckenabschnitt passen) &#039;programmiert&#039; werden. Statt Taste 1 wird nun der Sensor ausgewertet (wobei Taste 1 als Sensor-Ersatz insoweit genutzt werden kann, dass sie gedrückt bleiben bzw. kurz losgelassen werden muss). Zur genaueren Zeitmessung wird noch das modul &#039;clock&#039; benötigt. &amp;quot;&amp;lt;tt&amp;gt;wandler3.py&amp;lt;/tt&amp;gt;&amp;quot; könnte also so aussehen:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler3.py&lt;br /&gt;
 &lt;br /&gt;
 from time import clock&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
 sensor_1=1&lt;br /&gt;
 sensor_2=0&lt;br /&gt;
 rundenzahl=0&lt;br /&gt;
 v_wechsel=0&lt;br /&gt;
 vorrunde=0&lt;br /&gt;
 index_zaehler=1&lt;br /&gt;
 &lt;br /&gt;
 zeit_array=[0,0.2,0.4,0.2,0.4,0.2,0.4,0.2,5,0.2,6]&lt;br /&gt;
 # dieses array enthält die sek. bis zum Spannungswechsel&lt;br /&gt;
&lt;br /&gt;
 array_laenge=9&lt;br /&gt;
 # legt fest, wie viel Werte des arrays genutzt werden sollen&lt;br /&gt;
 &lt;br /&gt;
 sensor_aus=1.3&lt;br /&gt;
 # bis der Sensor sicher in die Ruhestellung kippt, wird er nicht ausgelesen&lt;br /&gt;
  &lt;br /&gt;
 pfio.init()&lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
&lt;br /&gt;
 # das Fahrzeug wird langsam zum Start (=Sensor) bewegt&lt;br /&gt;
 while sensor_1 == 1 :&lt;br /&gt;
   sensor_1=pfio.digital_read(1)&lt;br /&gt;
  &lt;br /&gt;
 print &amp;quot;fliegender Start... zum Beenden Taste 2 drücken&amp;quot;&lt;br /&gt;
 print &amp;quot;Runde Nr., Ges.Zeit, Rundenzeit, mittlere Rundenzeit&amp;quot;&lt;br /&gt;
 start_zeit=clock()&lt;br /&gt;
 runden_start=start_zeit&lt;br /&gt;
  &lt;br /&gt;
 while sensor_2 == 0 :&lt;br /&gt;
   sensor_2=pfio.digital_read(2)&lt;br /&gt;
   v_wechsel=1-v_wechsel&lt;br /&gt;
   pfio.digital_write(2,v_wechsel)&lt;br /&gt;
   sensor_zeit=clock()&lt;br /&gt;
  &lt;br /&gt;
   while zeit_array[index_zaehler]+sensor_zeit &amp;gt; clock() :&lt;br /&gt;
     if runden_start+sensor_aus &amp;lt; clock() :&lt;br /&gt;
 &lt;br /&gt;
       sensor_1=pfio.digital_read(1) &lt;br /&gt;
       if sensor_1 == 0 :&lt;br /&gt;
         rundenzahl=rundenzahl+1&lt;br /&gt;
         runden_start=clock()&lt;br /&gt;
         zeit=runden_start-start_zeit&lt;br /&gt;
         print rundenzahl, zeit, zeit-vorrunde, zeit/rundenzahl&lt;br /&gt;
         vorrunde=zeit&lt;br /&gt;
         sensor_zeit=0&lt;br /&gt;
         index_zaehler=0&lt;br /&gt;
         v_wechsel=0&lt;br /&gt;
  &lt;br /&gt;
   index_zaehler=index_zaehler+1&lt;br /&gt;
   if index_zaehler &amp;gt; array_laenge :&lt;br /&gt;
     sensor_2=1&lt;br /&gt;
     print &amp;quot;array-Ende erreicht!&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Outp 1 &amp;amp; 2 auf 0!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wird das Array-Ende erreicht, wurden entweder zu wenige Einträge vorgesehen oder es befindet sich kein Fahrzeug (mehr) auf der Strecke, das den Sensor und damit des Zurücksetzen des Arrays auslösen konnte.&lt;br /&gt;
&lt;br /&gt;
e. Das Array ist an die jeweilige Strecke anzupassen, wobei der vorderste Eintrag ungenutzt bleibt und dann mit der Dauer für maximale Spannung begonnen wird. Solange man mit Relais arbeitet, sollten die Schaltzeiten nicht zu kurz sein (&amp;gt;0.1 sek.), da diese eine gewisse mechanische Trägheit besitzen.&lt;br /&gt;
&lt;br /&gt;
f. Eben diese mechanische Beschaffenheit der Relais (Verschleiß) ist auch ein guter Grund, auf &#039;volle&#039; digitale Signalumwandlung umzustellen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Optokoppler als Ersatz für Relais =&lt;br /&gt;
&lt;br /&gt;
Ähnlich wie ein Relais dient ein [[Optokoppler]] dazu, eine Signalübertragung zwischen zwei getrennten Stromkreisen zu ermöglichen. Bei diesem Projekt liegt der Einsatz von Optokopplern nahe, da sie schneller schalten und keine beweglichen Teile besitzen. Für unsere Zwecke benötigen wir nun als zusätzliche Elemente: Optokoppler (CNY 17-4), npn-[[Transistor]]en (BC 337-40) zur Signalverstärkung sowie einige Widerstände im Bereich von 2k und 400 Ohm. &lt;br /&gt;
&lt;br /&gt;
== Kaskadierung von Transistoren zur Signalverstärkung ==&lt;br /&gt;
&lt;br /&gt;
a. Entsprechend Schritt 2.4.d. (ein Relais bei 50 Ohm) wird zunächst ein [[Optokoppler]] eingesetzt, dessen Signal durch einen Transistor verstärkt wird, um die &#039;Grundspannung&#039; zu schalten (Pin 3 und 6 beim Optokoppler sollten unbeschaltet bleiben, allein der &#039;Lichtstrom&#039; reicht für eine Ansteuerung aus):&lt;br /&gt;
&lt;br /&gt;
[[Bild:PiF_CNY_BC_1.png|400px|Optokoppler mit Transistor]]&lt;br /&gt;
&lt;br /&gt;
b. Da immer mit einer gewissen Toleranz bei allen Komponenten zu rechnen ist, kann es sein, dass u.U. die Widerstände etwas größer oder kleiner gewählt werden müssen. Beim Ausprobieren sollte man hier in 10% Schritten variieren.&lt;br /&gt;
&lt;br /&gt;
c. Bei Austesten mit Emulator oder Script ist auch zu beachten, dass nun &#039;Output Pin 8&#039; genutzt wird, da dieser nicht mit den Relais verschaltet ist.&lt;br /&gt;
&lt;br /&gt;
== Umsetzung von 3 Schaltstufen mit Optokopplern ==&lt;br /&gt;
&lt;br /&gt;
a. Entsprechend dem Vorgehen beim Relais kann nun auch der kleine Widerstand zusätzlich beschaltet werden um seine gesteuerte Überbrückung zu ermöglichen. Da hier eine relativ geringe Spannung aufgeschaltet wird, kann zu Beginn eine Diode eingesetzt werden, die die Schaltstufe &#039;maximale Spannung&#039; anzeigt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:SmPiFu2ou2T.png|400px|Kombination von 2 Optokopplern]]&lt;br /&gt;
&lt;br /&gt;
b. Vor dem Testen ist wieder zu beachten, dass nun zusätzlich &#039;Output Pin 7&#039; genutzt wird (statt Output Pin 2).&lt;br /&gt;
&lt;br /&gt;
c. Neben dem Weglassen der Diode (was die Maximalgeschwindigkeit leicht erhöht), können auch statt der 400 Ohm Widerstände 1k-Werte oder höher gewählt werden, wenn dadurch der jeweilige Basisstrom noch hoch genug ist. Im vorliegenden Fall war erst ab 400 Ohm keine weitere Tempoerhöhung mehr feststellbar.&lt;br /&gt;
&lt;br /&gt;
d. Eine mögliche Realisierung sieht so aus: http://youtu.be/xQ7N-PrIULk&lt;br /&gt;
&lt;br /&gt;
== Zusätzliche Erhöhung der Schaltstufen bei D/A-Wandlern ==&lt;br /&gt;
&lt;br /&gt;
a. Zwar benötigen wir in unserem speziellen Beispiel eine &#039;Grundspannung&#039;, die sich dahingehend auswirkt, dass - wie unter 3.1.c. erwähnt - eine Signalkombination nicht ausgewertet wird, aber mit jeder weiteren Schaltstufe würde sich dieses Problem (theoretisch) relativieren, da bei geschickter Auswahl der Widerstände (z.B. im Verhältnis 1 zu 2) jeweils eine Verdoppelung der Kombinationsmöglichkeiten erreichbar ist.&lt;br /&gt;
&lt;br /&gt;
b. Wird hier der 50 Ohm Widerstand asymmetrisch geteilt (z.B. 15 + 35 Ohm, s.a. [[Spannungsteiler]]) um dort ein weiteres Signal umsetzen zu können, ergeben sich direkt folgende 5 Schaltstufen (aus, 50, 35, 15 und 0 Ohm) u.s.w.:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Sm3ou3t2.png|400px|Erhöhung der Schaltstufen]]&lt;br /&gt;
&lt;br /&gt;
c. Zur Ansteuerung dieser Schaltstufen wäre das Script so zu ändern, dass nun zwischen mehr als 2 Stufen gewechselt werden kann und im Array entsprechende Zusatzdaten vorgegeben und ausgelesen werden. Mehr als diese Stufen sind im konkreten Fall aber nicht sinnvoll, da die entstehende Verlustleistung in der Schaltung die maximal verfügbare Leistung reduziert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Weiterführende Ideen =&lt;br /&gt;
&lt;br /&gt;
Die Ausbaumöglichkeiten dieses Projektes sind vielfältig:&lt;br /&gt;
&lt;br /&gt;
== Hardwareseitige Ausbauvarianten ==&lt;br /&gt;
&lt;br /&gt;
- beispielhafte Umsetzung einer differenzierten Abstufung mittels eines möglichst oft durch 2 teilbaren Anfangswertes und der Teiler (640 Ohm, 320, 160...) oder in 10er Potenzen;&lt;br /&gt;
&lt;br /&gt;
- Nachbau des Projekts mit einem Mikrocontroller (ggf. mit LCD-Anzeige);&lt;br /&gt;
&lt;br /&gt;
- Umbau der Steuerung mit dem Ziel, sie direkt an die GPIO-Pins des RPi anzuschließen;&lt;br /&gt;
&lt;br /&gt;
- Entwurf einer Zusatzschaltung, die in diesem Beispiel eine Rückmeldung liefert, ob ein Verbraucher aktiv ist oder nicht (Fahrzeug noch auf der Strecke?);&lt;br /&gt;
&lt;br /&gt;
- Entwurf einer Zusatzschaltung, die erkennt wie viel Strom fliesst: damit wären Rückschlüsse auf den Streckenverlauf möglich (Kurve=etwas mehr Strom, Steigung=noch mehr Strom nötig, etc.) und auch eine programmgesteuerte Optimierung der Array-Schaltzeiten dankbar; &lt;br /&gt;
&lt;br /&gt;
- Einsatz anderer Sensortechniken und/oder mehrerer Sensoren zur Optimierung der Schnelligkeit oder parallelen Steuerung eines 2. Fahrzeuges;&lt;br /&gt;
&lt;br /&gt;
== Softwareseitige Ausbauvarianten ==&lt;br /&gt;
&lt;br /&gt;
- Optimierung des Scripts, indem die Sensor-Abfrage über einen &#039;Listener&#039; umgesetzt wird;&lt;br /&gt;
&lt;br /&gt;
- Erweiterung des Scripts um eine GUI mit Hilfe der python-lib Tkinter, um einen Nutzerzugriff auf das Steuerarray und/oder eine &#039;Verwaltung&#039; mehrerer Fahrzeuge;&lt;br /&gt;
&lt;br /&gt;
- Einbindung eines Web-Interface um eine &#039;Fernsteuerung&#039; zu ermöglichen...&lt;br /&gt;
&lt;br /&gt;
...in jedem Fall: viel Spaß beim Basteln!&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [http://hackaday.com/2013/01/23/replacement-controllers-for-slot-car-racing/ andere Variante der Ersetzung der Handregler bei &#039;hackaday&#039;] &lt;br /&gt;
* [https://docs.google.com/folder/d/0B-UAZ9CyJCLGQjJ3RDlqa2pqaDg/edit?pli=1&amp;amp;docId=0B-UAZ9CyJCLGNmpMeVpyYlZJUWc Relaisschaltung mit pädagogischer Erweiterung der Universität Manchester (englischspr.)]&lt;br /&gt;
* [http://elinux.org/RPi_Projects englischsp. Projektliste zum RPi]&lt;br /&gt;
* [http://elinux.org/RPi_Projects/PiFace_controlling_a_slot-car paralleler englischsp. Bericht des Autors zum RPi mit anderem Schwerpunkt] &lt;br /&gt;
* [http://www.mikrocontroller.net/articles/GhostCarProjekt Verlagerung der gesamten Steuerelektronik ins Fahrzeug]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Raspberry Pi]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Mknot9</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=RPi_als_D/A-Wandler&amp;diff=74513</id>
		<title>RPi als D/A-Wandler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=RPi_als_D/A-Wandler&amp;diff=74513"/>
		<updated>2013-03-08T22:13:02Z</updated>

		<summary type="html">&lt;p&gt;Mknot9: /* Siehe auch */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;von M. Knoop&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
Oft wird ein Computer &#039;nur&#039; genutzt um darauf Software ablaufen zu lassen. Dessen Möglichkeit zur Steuerung von elektrischen und mechanischen Geräten wird dabei leicht übersehen.&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel richtet sich daher an Einsteiger, die mit dem [[Raspberry Pi]] (&#039;RPi&#039;) Grundlagen der Computersteuerung mit Relais und [[Spannungsteiler]]n nachvollziehen möchten. Es wird an einem konkreten Beispiel schrittweise dargestellt, wie mittels eines D/A-Wandlers (Digital/Analog-Wandler = Umwandlung von digitalen 1/0 Signale) die Steuerung einer stufenweise veränderbaren Ausgangsspannung aufgebaut werden kann.&lt;br /&gt;
&lt;br /&gt;
= Verwendete Hardware =&lt;br /&gt;
&lt;br /&gt;
== RPi in Kombination mit der &#039;PiFace&#039;-Karte als Bastelplattform ==&lt;br /&gt;
&lt;br /&gt;
Dank der einfachen Bauweise bietet sich der RPi mit seinen frei zugänglichen GPIO-Pins als ideale Bastelplattform an. Trotzdem kann es beim anfänglichen Experimentieren mit Schaltungen öfters zu kleinen Fehlern kommen, die schlimmstenfalls die empfindliche Elektronik des RPi dauerhaft beschädigen können.&lt;br /&gt;
&lt;br /&gt;
Daher wird bei diesem Projekt zusätzlich mit der &#039;PiFace[http://elinux.org/RPi_Expansion_Boards#Piface]&#039;-Karte gearbeitet, die man auf die GPIO-Pins stecken kann. Diese Erweiterungskarte verschaltet die GPIO-Pins auf je 8 digitale Ein- und Ausgänge sowie 2 Relais, die eine galvanische Trennung von Stromkreisen ermöglichen. Damit besteht auch für Einsteiger ein gewisser Schutz für die Steuerelektronik des RPi.&lt;br /&gt;
&lt;br /&gt;
Auch im weiteren Verlauf dieser Einführung soll noch auf eine Trennung der Stromkreise Wert gelegt werden, so dass für erste digitale Schaltexperimente ein Optokoppler genutzt wird. Die spätere Nutzung der &#039;Input Pins&#039; des PiFace um eine Steuerung der D/A-Wandlung durch bestimmte Ereignisse zu ermöglichen, erfolgt ebenfalls passiv.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Auch wenn mit vermeintlich &#039;sicheren&#039; Transformatoren gebastelt wird, muss stets bedacht werden, dass diese an einem 230V-Stromnetz betrieben werden und man eher einmal mehr als weniger prüfen sollte, ob man durch eventuelle Fehler mit lebensgefährlicher Spannung in Berührung kommt!&lt;br /&gt;
&lt;br /&gt;
== Auswahl eines Beispielprojektes ==&lt;br /&gt;
&lt;br /&gt;
Günstige Möglichkeiten ein Gerät zu finden, das mit analogen Spannungen arbeitet, bieten sich u.a. im Spielzeugbereich. Im Grunde eignet sich alles, was mit Batterien oder mit Gleichspannungen unter 24 V betrieben wird.&lt;br /&gt;
&lt;br /&gt;
Da jedoch ein Ziel das Steuern von analogen Spannungen ist, bietet sich insbesondere alles an, bei dem [[Potentiometer]] eingesetzt werden. Einen dieser &#039;Handregler&#039; sollte man übrig haben, da er von seinem Anschlusskabel abgetrennt werden muss, um den oft proprietären Steckanschluss nutzen zu können. In diesem Sinne wird hier eine handelsübliche Spielzeug-Autorennbahn mit Potentiometer-Handreglern genutzt.&lt;br /&gt;
&lt;br /&gt;
== Sonstige Bauteile ==&lt;br /&gt;
&lt;br /&gt;
Für die ersten Grundlagen (s. Teile 2 &amp;amp; 3) genügen bereits rund 2 m isolierter Draht, der nicht aus verdrillten feinen Adern (Litze) bestehen sollte, 50 cm nicht-isolierter Draht, einige niederohmige Widerstände (z.B. je 2 mal 100 Ohm, 80, 60, sowie 20) und ein &#039;Experimentierbrett&#039; (engl. [[Breadboard]]).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Grundlagen und Vorbereitung des Projekts =&lt;br /&gt;
&lt;br /&gt;
== Umwandlung von 1/0 zu Ein/Aus mit einem Relais ==&lt;br /&gt;
&lt;br /&gt;
Vom Prinzip her ist jede Umwandlung eines digitalen 0 oder 1 Signals (das über eine bestimmte Spannungsdifferenz festgelegt ist) in eine (nutzbare) Spannung bereits eine D/A-Wandlung. Dies wird schlicht so realisiert, dass mit einer Eingabe am RPi die Nutzspannung des &#039;Verbrauchers&#039; zunächst einfach an- und ausgeschaltet wird.&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung der zu steuernden Hardware ==&lt;br /&gt;
&lt;br /&gt;
a. Um Fehlerquellen auszuschließen sollte zunächst (und ggf. auch später!) kurz getestet werden, ob der vorhandene Regler wie erwartet funktioniert.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pif_Con9.jpg|thumb|right|400px|Fixierung der Reglerkabel]]&lt;br /&gt;
b. Nach dem Trennen des Reglers von der Einspeisung (und ggf. Ziehen des Netzsteckers) muss das Regler-Kabel abgeschnitten werden (eher nahe beim Regler, da das Kabel bald bis zum Breadboard reichen soll). Die neuen Enden des Einspeiseteils werden abisoliert und auf dem Breadboard diagonal zueinander mit einigen Spalten Abstand fixiert. Auch können bereits die Drähte, die später zum RPi führen, jeweils in den passenden kontaktführenden Spalten eingesteckt werden, z. B. wie rechts zu sehen (die nicht beschrifteten Drähte können vorerst ignoriert werden):&lt;br /&gt;
&lt;br /&gt;
c. Nun bietet sich eine gute Gelegenheit die maximale Spannung am Nutzgerät zu messen. Man verbindet das Regler-Kabel (nun ohne Regler) wieder mit der Einspeisung und die offenen Enden der Drähte mit dem Messgerät, bei dem zunächst ein Messbereich von ca. 10-50 Volt gewählt werden sollte. Dies sollte dann z.B. 14,8 V anzeigen. Natürlich können auch die beiden offenen Enden einen kleinen Moment kurz geschlossen werden, man sollte aber bedenken, dass das zu regelnde Nutzgerät dann die maximal vorgesehene Spannung erhält (hier: maximales Tempo).&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung des RPi ==&lt;br /&gt;
&lt;br /&gt;
Es wird davon ausgegangen, dass entsprechend des zugehörigen &#039;manual&#039; das PiFace bereits auf den RPi gesteckt ist, die nötigen python-Bibliotheken installiert sind und man sich im Terminal-Arbeitsverzeichnis &#039;pi&#039; befindet.&lt;br /&gt;
&lt;br /&gt;
a. Zunächst wird der PiFace-Emulator (im Terminal direkt aus dem Arbeitsverzeichnis) gestartet: &amp;lt;tt&amp;gt;piface/scripts/piface-emulator&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b. Wenn alles richtig installiert wurde, erscheint ein Fenster (unten links), bei dem die vorerst wichtigen blauen Signale am rechten Rand wie folgt angezeigt werden sollten: &lt;br /&gt;
 &lt;br /&gt;
[[Datei:RPi_PiF_em-scs.jpg|400px|Piface-Emulator im default-Zustand]] [[Datei:RPi_PiF_em_scs1.jpg|400px|Piface-Relais 1 auf &#039;1&#039; geschaltet]]&lt;br /&gt;
&lt;br /&gt;
c. Das rechte Fenster ergibt sich, wenn man nun im Fenster auf &amp;quot;Override Enable&amp;quot; und dann &amp;quot;Output Pin 1&amp;quot; klickt. Es müsste ein &amp;quot;Klick&amp;quot; vom Relais 1 zu hören sein sowie der Schaltzustand des unteren Relais 1 (das an den Output Pin 1 gekoppelt ist) auf die Verbindung der beiden unteren Anschlüsse wechseln. Zugleich wird das erste LED-Icon beim Output Pin 1 rot sowie das zugehörige LED-Icon blau.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pif_rel2.png|thumb|right|250px|Schema der Piface-Relais]]&lt;br /&gt;
d. Rechts ist der Schaltzustand der Relais, die zu Beginn genutzt werden, im Grundzustand dargestellt (jeweils der mittlere und obere Kontakt sind kurzgeschlossen, der jeweils untere Kontakt ist frei):&lt;br /&gt;
&lt;br /&gt;
e. Ein weiterer Klick auf &amp;quot;Output Pin 1&amp;quot; versetzt das Relais in den Ausgangszustand, der vor dem nächsten Schritt wieder eingestellt werden sollte.&lt;br /&gt;
&lt;br /&gt;
f. Das Relais lässt sich auch mittels eines Python-Scripts vom RPi aus ansteuern. Dazu wird folgende Textdatei &amp;quot;wandler.py&amp;quot; im Arbeitsverzeichnis abgespeichert und mit dem Befehl &amp;quot;&amp;lt;tt&amp;gt;python wandler.py&amp;lt;/tt&amp;gt;&amp;quot; gestartet:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler.py&lt;br /&gt;
&lt;br /&gt;
 from time import sleep&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
&lt;br /&gt;
 pfio.init()&lt;br /&gt;
&lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
 print &amp;quot;Strom an&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 sleep(2)&lt;br /&gt;
&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Strom aus&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Nach dem Absetzen des Befehls wechselt nun das blaue Signal an Relais 1 für 2 Sekunden und das Relais klickt entsprechend.&lt;br /&gt;
&lt;br /&gt;
== Einsatz eines Relais&#039; zur Umsetzung von Spannungsänderungen ==&lt;br /&gt;
&lt;br /&gt;
a. Ist das Relais wieder im Ausgangszustand, befestigt man nun einen der vom Breadboard führenden Drähte am unteren und einen am mittleren Relaiseingang (im Moment ist die Polarität noch egal). Zunächst sollte nichts passieren (das Relais hält diesen ja Stromkreis noch offen).&lt;br /&gt;
&lt;br /&gt;
b. Startet man aber das Script wieder (&amp;lt;tt&amp;gt;python wandler.py&amp;lt;/tt&amp;gt;) oder klickt auf &#039;Output Pin 1&#039; wird der Nutzstromkreis geschlossen. Nochmals aufgepasst: unser Nutzer erhält wieder die maximal vorgesehene Spannung - also besser vorher im Script &amp;quot;&amp;lt;tt&amp;gt;sleep(0.3)&amp;lt;/tt&amp;gt;&amp;quot; setzen und speichern.&lt;br /&gt;
&lt;br /&gt;
c. Im Prinzip ist damit die programmgesteuerte Umsetzung eines 0/1 Signals in z.B. eine 0V/15V Spannung erreicht.&lt;br /&gt;
&lt;br /&gt;
d. Da wir bald verschiedene Steuerspannungen schalten wollen, geht es jetzt darum herauszufinden, bei welcher Spannung unser Nutzgerät gerade noch bewegt wird. Dies probiert man aus - mit dem kleinsten Widerstand beginnend: indem einer der Drähte in eine freie Breadboardspalte gesteckt wird und aus dieser Spalte der Widerstand zu dem &#039;alten&#039; Steckplatz des Drahtes geführt wird. Nun startet man jeweils das Script bis der Widerstand so hoch ist, dass die Anlaufspannung beim Nutzgerätes gut ausreicht, eine Reaktion des Nutzgerät (Fahrzeug bewegt sich) zu bewirken (z.B. bei 50 Ohm beträgt der Strom im Mittel ca. 130 mA während ohne 190 mA fließen).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Ansteuerung von 3 Schaltstufen =&lt;br /&gt;
&lt;br /&gt;
== Kombination von 2 Relais ==&lt;br /&gt;
&lt;br /&gt;
[[Bild:ZrelMww2.png|thumb|right|250px|Beschaltung der Relais]] a. Die einfachste Stufe der weiteren Verschaltung erreicht man, indem der Widerstand mit einem 2. Relais überbrückt wird. Relais 1 kann dann als &#039;Hauptschalter&#039;, Relais 2 als Spannungsumschalter genutzt werden:&lt;br /&gt;
&lt;br /&gt;
b. Diese Beschaltung kann sogleich mit dem PiFace-Emulator ausprobiert werden. Damit können wir bereits 3 Schaltstufen steuern: keine, verminderte und volle Spannung.&lt;br /&gt;
&lt;br /&gt;
c. Theoretisch ließe sich auch noch eine 4. Spannungsstufe erzeugen, da mit 2 &#039;Bits&#039; (Ein/Aus bei 2 Relais) bereits 4 verschiedene Signale darstellbar sind. Beim jetzigen Aufbau werden aber lediglich die (pin1,pin2)-Signale (0,0), (1,0) und (1,1) &#039;genutzt&#039;, da Relais 1 als Hauptschalter vorgesehen ist und die Kombination (0,1) so nicht ausgewertet wird.&lt;br /&gt;
&lt;br /&gt;
== Programmgesteuerte Schaltung von 2 Relais ==&lt;br /&gt;
&lt;br /&gt;
a. Mit einem veränderten python-Script &amp;quot;wandler2.py&amp;quot; ist auch die programmgesteuerte Schaltung möglich. Dabei werden zusätzlich die Tasten 1 und 2 des PiFace genutzt, um nach dem Start des Scripts (&amp;lt;tt&amp;gt;python wandler2.py&amp;lt;/tt&amp;gt;) den Hauptschalter (Relais 1) zu steuern:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler2.py&lt;br /&gt;
 &lt;br /&gt;
 from time import sleep&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
 pfio.init()&lt;br /&gt;
 &lt;br /&gt;
 taste_1=0&lt;br /&gt;
 taste_2=0&lt;br /&gt;
 intervall_a=0.1&lt;br /&gt;
 intervall_b=0.5&lt;br /&gt;
 # Die Intervalle bestimmen die Schaltzeit für volle/verminderte Spannung&lt;br /&gt;
 &lt;br /&gt;
 print &amp;quot;Zum Start Taste 1 drücken, zum Stoppen Taste 2&amp;quot;&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 while taste_1 == 0:&lt;br /&gt;
   sleep(intervall_a)&lt;br /&gt;
   taste_1=pfio.digital_read(1)&lt;br /&gt;
&lt;br /&gt;
 # Der o.g. &#039;sleep&#039;-Befehl bestimmt die Abfragepausen für Taste 1&lt;br /&gt;
 &lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
 print &amp;quot;Strom an!&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 while taste_2 == 0:&lt;br /&gt;
   pfio.digital_write(2,1)&lt;br /&gt;
   sleep(intervall_a)&lt;br /&gt;
   pfio.digital_write(2,0)&lt;br /&gt;
   sleep(intervall_b)&lt;br /&gt;
   taste_2=pfio.digital_read(2)&lt;br /&gt;
 &lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Strom aus!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
b. Falls beim Ausprobieren von Script-Änderungen mal was schief geht, kann das Script stets auch mit der Tastenkombination (CTRL-C) gestoppt werden. U.U. muss dann noch zusätzlich Relais 1 und/oder 2 via Emulator zurückgesetzt werden.&lt;br /&gt;
&lt;br /&gt;
c. Beim Verändern des Scripts fällt bald auf, dass die bisherige Programmsteuerung keine direkte Möglichkeit vorsieht, auf Ereignisse zu reagieren. Immerhin wird ein mechanisches Gerät gesteuert, bei dem mit Ausfällen, Fertigungstoleranzen, Umwelteinflüssen etc. zu rechnen ist (im Script wird dies bislang &#039;nur&#039; durch die Abbruchbedingung &#039;Taste 2&#039; berücksichtigt).&lt;br /&gt;
&lt;br /&gt;
== Einfache Sensor-Signale als steuernde Elemente eines Programms ==&lt;br /&gt;
&lt;br /&gt;
a. Eine wichtige Anwendung von D/A-Steuerungen ist die mögliche Reaktion dieser Steuerung auf &#039;äußere&#039; Ereignisse, die z.B. mit Hilfe von Sensoren leistbar ist.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Einf_Sens.jpg|thumb|right|250px|einfacher Sensor]]b. Für unsere Zwecke genügt zunächst ein sehr einfacher Sensor, der ein 0- oder 1-Signal liefert und idealerweise direkt am &#039;Input Pin 1&#039; des PiFace angeschlossen werden kann. So liegt beim Input Pin 1 das Signal &#039;1&#039; an, wenn eine Verbindung zu &#039;Input GND&#039; besteht.&lt;br /&gt;
Z.B. können 2 unisolierte Drähte so platziert werden, dass ein vorbeifahrendes Fahrzeug einen von ihnen genügend bewegt um den Kontakt kurze Zeit zu öffnen. Genau dann liefert dieser &#039;Sensor&#039; das Signal &#039;0&#039;. Eine - die Schwerkraft nutzende - mögliche Bauform ist rechts abgebildet ;-)&lt;br /&gt;
&lt;br /&gt;
c. Natürlich werden zusätzlich 2 isolierte Drähte benötigt, um jeden der beiden offenen Drähte geschützt mit Input Pin 1 und Input GND zu verbinden.&lt;br /&gt;
&lt;br /&gt;
d. Bei jeder Durchfahrt liefert der Sensor nun ein &#039;0&#039;-Signal, was im Script sowohl für eine Zeitmessung als auch für ein &#039;Schaltintervall-Array&#039; genutzt werden kann. Dort können abwechselnd für beide Spannungen Zeiten (die in etwa zum jeweiligen Streckenabschnitt passen) &#039;programmiert&#039; werden. Statt Taste 1 wird nun der Sensor ausgewertet (wobei Taste 1 als Sensor-Ersatz insoweit genutzt werden kann, dass sie gedrückt bleiben bzw. kurz losgelassen werden muss). Zur genaueren Zeitmessung wird noch das modul &#039;clock&#039; benötigt. &amp;quot;&amp;lt;tt&amp;gt;wandler3.py&amp;lt;/tt&amp;gt;&amp;quot; könnte also so aussehen:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler3.py&lt;br /&gt;
 &lt;br /&gt;
 from time import clock&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
 sensor_1=1&lt;br /&gt;
 sensor_2=0&lt;br /&gt;
 rundenzahl=0&lt;br /&gt;
 v_wechsel=0&lt;br /&gt;
 vorrunde=0&lt;br /&gt;
 index_zaehler=1&lt;br /&gt;
 &lt;br /&gt;
 zeit_array=[0,0.2,0.4,0.2,0.4,0.2,0.4,0.2,5,0.2,6]&lt;br /&gt;
 # dieses array enthält die sek. bis zum Spannungswechsel&lt;br /&gt;
&lt;br /&gt;
 array_laenge=9&lt;br /&gt;
 # legt fest, wie viel Werte des arrays genutzt werden sollen&lt;br /&gt;
 &lt;br /&gt;
 sensor_aus=1.3&lt;br /&gt;
 # bis der Sensor sicher in die Ruhestellung kippt, wird er nicht ausgelesen&lt;br /&gt;
  &lt;br /&gt;
 pfio.init()&lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
&lt;br /&gt;
 # das Fahrzeug wird langsam zum Start (=Sensor) bewegt&lt;br /&gt;
 while sensor_1 == 1 :&lt;br /&gt;
   sensor_1=pfio.digital_read(1)&lt;br /&gt;
  &lt;br /&gt;
 print &amp;quot;fliegender Start... zum Beenden Taste 2 drücken&amp;quot;&lt;br /&gt;
 print &amp;quot;Runde Nr., Ges.Zeit, Rundenzeit, mittlere Rundenzeit&amp;quot;&lt;br /&gt;
 start_zeit=clock()&lt;br /&gt;
 runden_start=start_zeit&lt;br /&gt;
  &lt;br /&gt;
 while sensor_2 == 0 :&lt;br /&gt;
   sensor_2=pfio.digital_read(2)&lt;br /&gt;
   v_wechsel=1-v_wechsel&lt;br /&gt;
   pfio.digital_write(2,v_wechsel)&lt;br /&gt;
   sensor_zeit=clock()&lt;br /&gt;
  &lt;br /&gt;
   while zeit_array[index_zaehler]+sensor_zeit &amp;gt; clock() :&lt;br /&gt;
     if runden_start+sensor_aus &amp;lt; clock() :&lt;br /&gt;
 &lt;br /&gt;
       sensor_1=pfio.digital_read(1) &lt;br /&gt;
       if sensor_1 == 0 :&lt;br /&gt;
         rundenzahl=rundenzahl+1&lt;br /&gt;
         runden_start=clock()&lt;br /&gt;
         zeit=runden_start-start_zeit&lt;br /&gt;
         print rundenzahl, zeit, zeit-vorrunde, zeit/rundenzahl&lt;br /&gt;
         vorrunde=zeit&lt;br /&gt;
         sensor_zeit=0&lt;br /&gt;
         index_zaehler=0&lt;br /&gt;
         v_wechsel=0&lt;br /&gt;
  &lt;br /&gt;
   index_zaehler=index_zaehler+1&lt;br /&gt;
   if index_zaehler &amp;gt; array_laenge :&lt;br /&gt;
     sensor_2=1&lt;br /&gt;
     print &amp;quot;array-Ende erreicht!&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Outp 1 &amp;amp; 2 auf 0!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wird das Array-Ende erreicht, wurden entweder zu wenige Einträge vorgesehen oder es befindet sich kein Fahrzeug (mehr) auf der Strecke, das den Sensor und damit des Zurücksetzen des Arrays auslösen konnte.&lt;br /&gt;
&lt;br /&gt;
e. Das Array ist an die jeweilige Strecke anzupassen, wobei der vorderste Eintrag ungenutzt bleibt und dann mit der Dauer für maximale Spannung begonnen wird. Solange man mit Relais arbeitet, sollten die Schaltzeiten nicht zu kurz sein (&amp;gt;0.1 sek.), da diese eine gewisse mechanische Trägheit besitzen.&lt;br /&gt;
&lt;br /&gt;
f. Eben diese mechanische Beschaffenheit der Relais (Verschleiß) ist auch ein guter Grund, auf &#039;volle&#039; digitale Signalumwandlung umzustellen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Optokoppler als Ersatz für Relais =&lt;br /&gt;
&lt;br /&gt;
Ähnlich wie ein Relais dient ein [[Optokoppler]] dazu, eine Signalübertragung zwischen zwei getrennten Stromkreisen zu ermöglichen. Bei diesem Projekt liegt der Einsatz von Optokopplern nahe, da sie schneller schalten und keine beweglichen Teile besitzen. Für unsere Zwecke benötigen wir nun als zusätzliche Elemente: Optokoppler (CNY 17-4), npn-[[Transistor]]en (BC 337-40) zur Signalverstärkung sowie einige Widerstände im Bereich von 2k und 400 Ohm. &lt;br /&gt;
&lt;br /&gt;
== Kaskadierung von Transistoren zur Signalverstärkung ==&lt;br /&gt;
&lt;br /&gt;
a. Entsprechend Schritt 2.4.d. (ein Relais bei 50 Ohm) wird zunächst ein [[Optokoppler]] eingesetzt, dessen Signal durch einen Transistor verstärkt wird, um die &#039;Grundspannung&#039; zu schalten (Pin 3 und 6 beim Optokoppler sollten unbeschaltet bleiben, allein der &#039;Lichtstrom&#039; reicht für eine Ansteuerung aus):&lt;br /&gt;
&lt;br /&gt;
[[Bild:PiF_CNY_BC_1.png|400px|Optokoppler mit Transistor]]&lt;br /&gt;
&lt;br /&gt;
b. Da immer mit einer gewissen Toleranz bei allen Komponenten zu rechnen ist, kann es sein, dass u.U. die Widerstände etwas größer oder kleiner gewählt werden müssen. Beim Ausprobieren sollte man hier in 10% Schritten variieren.&lt;br /&gt;
&lt;br /&gt;
c. Bei Austesten mit Emulator oder Script ist auch zu beachten, dass nun &#039;Output Pin 8&#039; genutzt wird, da dieser nicht mit den Relais verschaltet ist.&lt;br /&gt;
&lt;br /&gt;
== Umsetzung von 3 Schaltstufen mit Optokopplern ==&lt;br /&gt;
&lt;br /&gt;
a. Entsprechend dem Vorgehen beim Relais kann nun auch der kleine Widerstand zusätzlich beschaltet werden um seine gesteuerte Überbrückung zu ermöglichen. Da hier eine relativ geringe Spannung aufgeschaltet wird, kann zu Beginn eine Diode eingesetzt werden, die die Schaltstufe &#039;maximale Spannung&#039; anzeigt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:SmPiFu2ou2T.png|400px|Kombination von 2 Optokopplern]]&lt;br /&gt;
&lt;br /&gt;
b. Vor dem Testen ist wieder zu beachten, dass nun zusätzlich &#039;Output Pin 7&#039; genutzt wird (statt Output Pin 2).&lt;br /&gt;
&lt;br /&gt;
c. Neben dem Weglassen der Diode (was die Maximalgeschwindigkeit leicht erhöht), können auch statt der 400 Ohm Widerstände 1k-Werte oder höher gewählt werden, wenn dadurch der jeweilige Basisstrom noch hoch genug ist. Im vorliegenden Fall war erst ab 400 Ohm keine weitere Tempoerhöhung mehr feststellbar.&lt;br /&gt;
&lt;br /&gt;
d. Eine mögliche Realisierung sieht so aus: http://youtu.be/xQ7N-PrIULk&lt;br /&gt;
&lt;br /&gt;
== Zusätzliche Erhöhung der Schaltstufen bei D/A-Wandlern ==&lt;br /&gt;
&lt;br /&gt;
a. Zwar benötigen wir in unserem speziellen Beispiel eine &#039;Grundspannung&#039;, die sich dahingehend auswirkt, dass - wie unter 3.1.c. erwähnt - eine Signalkombination nicht ausgewertet wird, aber mit jeder weiteren Schaltstufe würde sich dieses Problem (theoretisch) relativieren, da bei geschickter Auswahl der Widerstände (z.B. im Verhältnis 1 zu 2) jeweils eine Verdoppelung der Kombinationsmöglichkeiten erreichbar ist.&lt;br /&gt;
&lt;br /&gt;
b. Wird hier der 50 Ohm Widerstand asymmetrisch geteilt (z.B. 15 + 35 Ohm, s.a. [[Spannungsteiler]]) um dort ein weiteres Signal umsetzen zu können, ergeben sich direkt folgende 5 Schaltstufen (aus, 50, 35, 15 und 0 Ohm) u.s.w.:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Sm3ou3t2.png|400px|Erhöhung der Schaltstufen]]&lt;br /&gt;
&lt;br /&gt;
c. Zur Ansteuerung dieser Schaltstufen wäre das Script so zu ändern, dass nun zwischen mehr als 2 Stufen gewechselt werden kann und im Array entsprechende Zusatzdaten vorgegeben und ausgelesen werden. Mehr als diese Stufen sind im konkreten Fall aber nicht sinnvoll, da die entstehende Verlustleistung in der Schaltung die maximal verfügbare Leistung reduziert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Weiterführende Ideen =&lt;br /&gt;
&lt;br /&gt;
Die Ausbaumöglichkeiten dieses Projektes sind vielfältig:&lt;br /&gt;
&lt;br /&gt;
== Hardwareseitige Ausbauvarianten ==&lt;br /&gt;
&lt;br /&gt;
- beispielhafte Umsetzung einer differenzierten Abstufung mittels eines möglichst oft durch 2 teilbaren Anfangswertes und der Teiler (640 Ohm, 320, 160...) oder in 10er Potenzen;&lt;br /&gt;
&lt;br /&gt;
- Nachbau des Projekts mit einem Mikrocontroller (ggf. mit LCD-Anzeige);&lt;br /&gt;
&lt;br /&gt;
- Umbau der Steuerung mit dem Ziel, sie direkt an die GPIO-Pins des RPi anzuschließen;&lt;br /&gt;
&lt;br /&gt;
- Entwurf einer Zusatzschaltung, die in diesem Beispiel eine Rückmeldung liefert, ob ein Verbraucher aktiv ist oder nicht (Fahrzeug noch auf der Strecke?);&lt;br /&gt;
&lt;br /&gt;
- Entwurf einer Zusatzschaltung, die erkennt wie viel Strom fliesst: damit wären Rückschlüsse auf den Streckenverlauf möglich (Kurve=etwas mehr Strom, Steigung=noch mehr Strom nötig, etc.) und auch eine programmgesteuerte Optimierung der Array-Schaltzeiten dankbar; &lt;br /&gt;
&lt;br /&gt;
- Einsatz anderer Sensortechniken und/oder mehrerer Sensoren zur Optimierung der Schnelligkeit oder parallelen Steuerung eines 2. Fahrzeuges;&lt;br /&gt;
&lt;br /&gt;
== Softwareseitige Ausbauvarianten ==&lt;br /&gt;
&lt;br /&gt;
- Optimierung des Scripts, indem die Sensor-Abfrage über einen &#039;Listener&#039; umgesetzt wird;&lt;br /&gt;
&lt;br /&gt;
- Erweiterung des Scripts um eine GUI mit Hilfe der python-lib Tkinter, um einen Nutzerzugriff auf das Steuerarray und/oder eine &#039;Verwaltung&#039; mehrerer Fahrzeuge;&lt;br /&gt;
&lt;br /&gt;
- Einbindung eines Web-Interface um eine &#039;Fernsteuerung&#039; zu ermöglichen...&lt;br /&gt;
&lt;br /&gt;
...in jedem Fall: viel Spaß beim Basteln!&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [http://hackaday.com/2013/01/23/replacement-controllers-for-slot-car-racing/ andere Variante der Ersetzung der Handregler bei &#039;hackaday&#039;] &lt;br /&gt;
* [https://docs.google.com/folder/d/0B-UAZ9CyJCLGQjJ3RDlqa2pqaDg/edit?pli=1&amp;amp;docId=0B-UAZ9CyJCLGNmpMeVpyYlZJUWc Relaisschaltung mit pädagogischer Erweiterung der Universität Manchester (englischspr.)]&lt;br /&gt;
* [http://elinux.org/RPi_Projects/PiFace_controlling_a_slot-car paralleler englischsp. Bericht des Autors zum RPi mit anderem Schwerpunkt] &lt;br /&gt;
* [http://elinux.org/RPi_Projects englischsp. Projektliste zum RPi]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/GhostCarProjekt Verlagerung der gesamten Steuerelektronik ins Fahrzeug]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Raspberry Pi]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Mknot9</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=RPi_als_D/A-Wandler&amp;diff=74498</id>
		<title>RPi als D/A-Wandler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=RPi_als_D/A-Wandler&amp;diff=74498"/>
		<updated>2013-03-08T21:51:45Z</updated>

		<summary type="html">&lt;p&gt;Mknot9: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;von M. Knoop&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
Oft wird ein Computer &#039;nur&#039; genutzt um darauf Software ablaufen zu lassen. Dessen Möglichkeit zur Steuerung von elektrischen und mechanischen Geräten wird dabei leicht übersehen.&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel richtet sich daher an Einsteiger, die mit dem [[Raspberry Pi]] (&#039;RPi&#039;) Grundlagen der Computersteuerung mit Relais und [[Spannungsteiler]]n nachvollziehen möchten. Es wird an einem konkreten Beispiel schrittweise dargestellt, wie mittels eines D/A-Wandlers (Digital/Analog-Wandler = Umwandlung von digitalen 1/0 Signale) die Steuerung einer stufenweise veränderbaren Ausgangsspannung aufgebaut werden kann.&lt;br /&gt;
&lt;br /&gt;
= Verwendete Hardware =&lt;br /&gt;
&lt;br /&gt;
== RPi in Kombination mit der &#039;PiFace&#039;-Karte als Bastelplattform ==&lt;br /&gt;
&lt;br /&gt;
Dank der einfachen Bauweise bietet sich der RPi mit seinen frei zugänglichen GPIO-Pins als ideale Bastelplattform an. Trotzdem kann es beim anfänglichen Experimentieren mit Schaltungen öfters zu kleinen Fehlern kommen, die schlimmstenfalls die empfindliche Elektronik des RPi dauerhaft beschädigen können.&lt;br /&gt;
&lt;br /&gt;
Daher wird bei diesem Projekt zusätzlich mit der &#039;PiFace[http://elinux.org/RPi_Expansion_Boards#Piface]&#039;-Karte gearbeitet, die man auf die GPIO-Pins stecken kann. Diese Erweiterungskarte verschaltet die GPIO-Pins auf je 8 digitale Ein- und Ausgänge sowie 2 Relais, die eine galvanische Trennung von Stromkreisen ermöglichen. Damit besteht auch für Einsteiger ein gewisser Schutz für die Steuerelektronik des RPi.&lt;br /&gt;
&lt;br /&gt;
Auch im weiteren Verlauf dieser Einführung soll noch auf eine Trennung der Stromkreise Wert gelegt werden, so dass für erste digitale Schaltexperimente ein Optokoppler genutzt wird. Die spätere Nutzung der &#039;Input Pins&#039; des PiFace um eine Steuerung der D/A-Wandlung durch bestimmte Ereignisse zu ermöglichen, erfolgt ebenfalls passiv.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Auch wenn mit vermeintlich &#039;sicheren&#039; Transformatoren gebastelt wird, muss stets bedacht werden, dass diese an einem 230V-Stromnetz betrieben werden und man eher einmal mehr als weniger prüfen sollte, ob man durch eventuelle Fehler mit lebensgefährlicher Spannung in Berührung kommt!&lt;br /&gt;
&lt;br /&gt;
== Auswahl eines Beispielprojektes ==&lt;br /&gt;
&lt;br /&gt;
Günstige Möglichkeiten ein Gerät zu finden, das mit analogen Spannungen arbeitet, bieten sich u.a. im Spielzeugbereich. Im Grunde eignet sich alles, was mit Batterien oder mit Gleichspannungen unter 24 V betrieben wird.&lt;br /&gt;
&lt;br /&gt;
Da jedoch ein Ziel das Steuern von analogen Spannungen ist, bietet sich insbesondere alles an, bei dem [[Potentiometer]] eingesetzt werden. Einen dieser &#039;Handregler&#039; sollte man übrig haben, da er von seinem Anschlusskabel abgetrennt werden muss, um den oft proprietären Steckanschluss nutzen zu können. In diesem Sinne wird hier eine handelsübliche Spielzeug-Autorennbahn mit Potentiometer-Handreglern genutzt.&lt;br /&gt;
&lt;br /&gt;
== Sonstige Bauteile ==&lt;br /&gt;
&lt;br /&gt;
Für die ersten Grundlagen (s. Teile 2 &amp;amp; 3) genügen bereits rund 2 m isolierter Draht, der nicht aus verdrillten feinen Adern (Litze) bestehen sollte, 50 cm nicht-isolierter Draht, einige niederohmige Widerstände (z.B. je 2 mal 100 Ohm, 80, 60, sowie 20) und ein &#039;Experimentierbrett&#039; (engl. [[Breadboard]]).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Grundlagen und Vorbereitung des Projekts =&lt;br /&gt;
&lt;br /&gt;
== Umwandlung von 1/0 zu Ein/Aus mit einem Relais ==&lt;br /&gt;
&lt;br /&gt;
Vom Prinzip her ist jede Umwandlung eines digitalen 0 oder 1 Signals (das über eine bestimmte Spannungsdifferenz festgelegt ist) in eine (nutzbare) Spannung bereits eine D/A-Wandlung. Dies wird schlicht so realisiert, dass mit einer Eingabe am RPi die Nutzspannung des &#039;Verbrauchers&#039; zunächst einfach an- und ausgeschaltet wird.&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung der zu steuernden Hardware ==&lt;br /&gt;
&lt;br /&gt;
a. Um Fehlerquellen auszuschließen sollte zunächst (und ggf. auch später!) kurz getestet werden, ob der vorhandene Regler wie erwartet funktioniert.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pif_Con9.jpg|thumb|right|400px|Fixierung der Reglerkabel]]&lt;br /&gt;
b. Nach dem Trennen des Reglers von der Einspeisung (und ggf. Ziehen des Netzsteckers) muss das Regler-Kabel abgeschnitten werden (eher nahe beim Regler, da das Kabel bald bis zum Breadboard reichen soll). Die neuen Enden des Einspeiseteils werden abisoliert und auf dem Breadboard diagonal zueinander mit einigen Spalten Abstand fixiert. Auch können bereits die Drähte, die später zum RPi führen, jeweils in den passenden kontaktführenden Spalten eingesteckt werden, z. B. wie rechts zu sehen (die nicht beschrifteten Drähte können vorerst ignoriert werden):&lt;br /&gt;
&lt;br /&gt;
c. Nun bietet sich eine gute Gelegenheit die maximale Spannung am Nutzgerät zu messen. Man verbindet das Regler-Kabel (nun ohne Regler) wieder mit der Einspeisung und die offenen Enden der Drähte mit dem Messgerät, bei dem zunächst ein Messbereich von ca. 10-50 Volt gewählt werden sollte. Dies sollte dann z.B. 14,8 V anzeigen. Natürlich können auch die beiden offenen Enden einen kleinen Moment kurz geschlossen werden, man sollte aber bedenken, dass das zu regelnde Nutzgerät dann die maximal vorgesehene Spannung erhält (hier: maximales Tempo).&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung des RPi ==&lt;br /&gt;
&lt;br /&gt;
Es wird davon ausgegangen, dass entsprechend des zugehörigen &#039;manual&#039; das PiFace bereits auf den RPi gesteckt ist, die nötigen python-Bibliotheken installiert sind und man sich im Terminal-Arbeitsverzeichnis &#039;pi&#039; befindet.&lt;br /&gt;
&lt;br /&gt;
a. Zunächst wird der PiFace-Emulator (im Terminal direkt aus dem Arbeitsverzeichnis) gestartet: &amp;lt;tt&amp;gt;piface/scripts/piface-emulator&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b. Wenn alles richtig installiert wurde, erscheint ein Fenster (unten links), bei dem die vorerst wichtigen blauen Signale am rechten Rand wie folgt angezeigt werden sollten: &lt;br /&gt;
 &lt;br /&gt;
[[Datei:RPi_PiF_em-scs.jpg|400px|Piface-Emulator im default-Zustand]] [[Datei:RPi_PiF_em_scs1.jpg|400px|Piface-Relais 1 auf &#039;1&#039; geschaltet]]&lt;br /&gt;
&lt;br /&gt;
c. Das rechte Fenster ergibt sich, wenn man nun im Fenster auf &amp;quot;Override Enable&amp;quot; und dann &amp;quot;Output Pin 1&amp;quot; klickt. Es müsste ein &amp;quot;Klick&amp;quot; vom Relais 1 zu hören sein sowie der Schaltzustand des unteren Relais 1 (das an den Output Pin 1 gekoppelt ist) auf die Verbindung der beiden unteren Anschlüsse wechseln. Zugleich wird das erste LED-Icon beim Output Pin 1 rot sowie das zugehörige LED-Icon blau.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pif_rel2.png|thumb|right|250px|Schema der Piface-Relais]]&lt;br /&gt;
d. Rechts ist der Schaltzustand der Relais, die zu Beginn genutzt werden, im Grundzustand dargestellt (jeweils der mittlere und obere Kontakt sind kurzgeschlossen, der jeweils untere Kontakt ist frei):&lt;br /&gt;
&lt;br /&gt;
e. Ein weiterer Klick auf &amp;quot;Output Pin 1&amp;quot; versetzt das Relais in den Ausgangszustand, der vor dem nächsten Schritt wieder eingestellt werden sollte.&lt;br /&gt;
&lt;br /&gt;
f. Das Relais lässt sich auch mittels eines Python-Scripts vom RPi aus ansteuern. Dazu wird folgende Textdatei &amp;quot;wandler.py&amp;quot; im Arbeitsverzeichnis abgespeichert und mit dem Befehl &amp;quot;&amp;lt;tt&amp;gt;python wandler.py&amp;lt;/tt&amp;gt;&amp;quot; gestartet:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler.py&lt;br /&gt;
&lt;br /&gt;
 from time import sleep&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
&lt;br /&gt;
 pfio.init()&lt;br /&gt;
&lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
 print &amp;quot;Strom an&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 sleep(2)&lt;br /&gt;
&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Strom aus&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Nach dem Absetzen des Befehls wechselt nun das blaue Signal an Relais 1 für 2 Sekunden und das Relais klickt entsprechend.&lt;br /&gt;
&lt;br /&gt;
== Einsatz eines Relais&#039; zur Umsetzung von Spannungsänderungen ==&lt;br /&gt;
&lt;br /&gt;
a. Ist das Relais wieder im Ausgangszustand, befestigt man nun einen der vom Breadboard führenden Drähte am unteren und einen am mittleren Relaiseingang (im Moment ist die Polarität noch egal). Zunächst sollte nichts passieren (das Relais hält diesen ja Stromkreis noch offen).&lt;br /&gt;
&lt;br /&gt;
b. Startet man aber das Script wieder (&amp;lt;tt&amp;gt;python wandler.py&amp;lt;/tt&amp;gt;) oder klickt auf &#039;Output Pin 1&#039; wird der Nutzstromkreis geschlossen. Nochmals aufgepasst: unser Nutzer erhält wieder die maximal vorgesehene Spannung - also besser vorher im Script &amp;quot;&amp;lt;tt&amp;gt;sleep(0.3)&amp;lt;/tt&amp;gt;&amp;quot; setzen und speichern.&lt;br /&gt;
&lt;br /&gt;
c. Im Prinzip ist damit die programmgesteuerte Umsetzung eines 0/1 Signals in z.B. eine 0V/15V Spannung erreicht.&lt;br /&gt;
&lt;br /&gt;
d. Da wir bald verschiedene Steuerspannungen schalten wollen, geht es jetzt darum herauszufinden, bei welcher Spannung unser Nutzgerät gerade noch bewegt wird. Dies probiert man aus - mit dem kleinsten Widerstand beginnend: indem einer der Drähte in eine freie Breadboardspalte gesteckt wird und aus dieser Spalte der Widerstand zu dem &#039;alten&#039; Steckplatz des Drahtes geführt wird. Nun startet man jeweils das Script bis der Widerstand so hoch ist, dass die Anlaufspannung beim Nutzgerätes gut ausreicht, eine Reaktion des Nutzgerät (Fahrzeug bewegt sich) zu bewirken (z.B. bei 50 Ohm beträgt der Strom im Mittel ca. 130 mA während ohne 190 mA fließen).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Ansteuerung von 3 Schaltstufen =&lt;br /&gt;
&lt;br /&gt;
== Kombination von 2 Relais ==&lt;br /&gt;
&lt;br /&gt;
[[Bild:ZrelMww2.png|thumb|right|250px|Beschaltung der Relais]] a. Die einfachste Stufe der weiteren Verschaltung erreicht man, indem der Widerstand mit einem 2. Relais überbrückt wird. Relais 1 kann dann als &#039;Hauptschalter&#039;, Relais 2 als Spannungsumschalter genutzt werden:&lt;br /&gt;
&lt;br /&gt;
b. Diese Beschaltung kann sogleich mit dem PiFace-Emulator ausprobiert werden. Damit können wir bereits 3 Schaltstufen steuern: keine, verminderte und volle Spannung.&lt;br /&gt;
&lt;br /&gt;
c. Theoretisch ließe sich auch noch eine 4. Spannungsstufe erzeugen, da mit 2 &#039;Bits&#039; (Ein/Aus bei 2 Relais) bereits 4 verschiedene Signale darstellbar sind. Beim jetzigen Aufbau werden aber lediglich die (pin1,pin2)-Signale (0,0), (1,0) und (1,1) &#039;genutzt&#039;, da Relais 1 als Hauptschalter vorgesehen ist und die Kombination (0,1) so nicht ausgewertet wird.&lt;br /&gt;
&lt;br /&gt;
== Programmgesteuerte Schaltung von 2 Relais ==&lt;br /&gt;
&lt;br /&gt;
a. Mit einem veränderten python-Script &amp;quot;wandler2.py&amp;quot; ist auch die programmgesteuerte Schaltung möglich. Dabei werden zusätzlich die Tasten 1 und 2 des PiFace genutzt, um nach dem Start des Scripts (&amp;lt;tt&amp;gt;python wandler2.py&amp;lt;/tt&amp;gt;) den Hauptschalter (Relais 1) zu steuern:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler2.py&lt;br /&gt;
 &lt;br /&gt;
 from time import sleep&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
 pfio.init()&lt;br /&gt;
 &lt;br /&gt;
 taste_1=0&lt;br /&gt;
 taste_2=0&lt;br /&gt;
 intervall_a=0.1&lt;br /&gt;
 intervall_b=0.5&lt;br /&gt;
 # Die Intervalle bestimmen die Schaltzeit für volle/verminderte Spannung&lt;br /&gt;
 &lt;br /&gt;
 print &amp;quot;Zum Start Taste 1 drücken, zum Stoppen Taste 2&amp;quot;&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 while taste_1 == 0:&lt;br /&gt;
   sleep(intervall_a)&lt;br /&gt;
   taste_1=pfio.digital_read(1)&lt;br /&gt;
&lt;br /&gt;
 # Der o.g. &#039;sleep&#039;-Befehl bestimmt die Abfragepausen für Taste 1&lt;br /&gt;
 &lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
 print &amp;quot;Strom an!&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 while taste_2 == 0:&lt;br /&gt;
   pfio.digital_write(2,1)&lt;br /&gt;
   sleep(intervall_a)&lt;br /&gt;
   pfio.digital_write(2,0)&lt;br /&gt;
   sleep(intervall_b)&lt;br /&gt;
   taste_2=pfio.digital_read(2)&lt;br /&gt;
 &lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Strom aus!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
b. Falls beim Ausprobieren von Script-Änderungen mal was schief geht, kann das Script stets auch mit der Tastenkombination (CTRL-C) gestoppt werden. U.U. muss dann noch zusätzlich Relais 1 und/oder 2 via Emulator zurückgesetzt werden.&lt;br /&gt;
&lt;br /&gt;
c. Beim Verändern des Scripts fällt bald auf, dass die bisherige Programmsteuerung keine direkte Möglichkeit vorsieht, auf Ereignisse zu reagieren. Immerhin wird ein mechanisches Gerät gesteuert, bei dem mit Ausfällen, Fertigungstoleranzen, Umwelteinflüssen etc. zu rechnen ist (im Script wird dies bislang &#039;nur&#039; durch die Abbruchbedingung &#039;Taste 2&#039; berücksichtigt).&lt;br /&gt;
&lt;br /&gt;
== Einfache Sensor-Signale als steuernde Elemente eines Programms ==&lt;br /&gt;
&lt;br /&gt;
a. Eine wichtige Anwendung von D/A-Steuerungen ist die mögliche Reaktion dieser Steuerung auf &#039;äußere&#039; Ereignisse, die z.B. mit Hilfe von Sensoren leistbar ist.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Einf_Sens.jpg|thumb|right|250px|einfacher Sensor]]b. Für unsere Zwecke genügt zunächst ein sehr einfacher Sensor, der ein 0- oder 1-Signal liefert und idealerweise direkt am &#039;Input Pin 1&#039; des PiFace angeschlossen werden kann. So liegt beim Input Pin 1 das Signal &#039;1&#039; an, wenn eine Verbindung zu &#039;Input GND&#039; besteht.&lt;br /&gt;
Z.B. können 2 unisolierte Drähte so platziert werden, dass ein vorbeifahrendes Fahrzeug einen von ihnen genügend bewegt um den Kontakt kurze Zeit zu öffnen. Genau dann liefert dieser &#039;Sensor&#039; das Signal &#039;0&#039;. Eine - die Schwerkraft nutzende - mögliche Bauform ist rechts abgebildet ;-)&lt;br /&gt;
&lt;br /&gt;
c. Natürlich werden zusätzlich 2 isolierte Drähte benötigt, um jeden der beiden offenen Drähte geschützt mit Input Pin 1 und Input GND zu verbinden.&lt;br /&gt;
&lt;br /&gt;
d. Bei jeder Durchfahrt liefert der Sensor nun ein &#039;0&#039;-Signal, was im Script sowohl für eine Zeitmessung als auch für ein &#039;Schaltintervall-Array&#039; genutzt werden kann. Dort können abwechselnd für beide Spannungen Zeiten (die in etwa zum jeweiligen Streckenabschnitt passen) &#039;programmiert&#039; werden. Statt Taste 1 wird nun der Sensor ausgewertet (wobei Taste 1 als Sensor-Ersatz insoweit genutzt werden kann, dass sie gedrückt bleiben bzw. kurz losgelassen werden muss). Zur genaueren Zeitmessung wird noch das modul &#039;clock&#039; benötigt. &amp;quot;&amp;lt;tt&amp;gt;wandler3.py&amp;lt;/tt&amp;gt;&amp;quot; könnte also so aussehen:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler3.py&lt;br /&gt;
 &lt;br /&gt;
 from time import clock&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
 sensor_1=1&lt;br /&gt;
 sensor_2=0&lt;br /&gt;
 rundenzahl=0&lt;br /&gt;
 v_wechsel=0&lt;br /&gt;
 vorrunde=0&lt;br /&gt;
 index_zaehler=1&lt;br /&gt;
 &lt;br /&gt;
 zeit_array=[0,0.2,0.4,0.2,0.4,0.2,0.4,0.2,5,0.2,6]&lt;br /&gt;
 # dieses array enthält die sek. bis zum Spannungswechsel&lt;br /&gt;
&lt;br /&gt;
 array_laenge=9&lt;br /&gt;
 # legt fest, wie viel Werte des arrays genutzt werden sollen&lt;br /&gt;
 &lt;br /&gt;
 sensor_aus=1.3&lt;br /&gt;
 # bis der Sensor sicher in die Ruhestellung kippt, wird er nicht ausgelesen&lt;br /&gt;
  &lt;br /&gt;
 pfio.init()&lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
&lt;br /&gt;
 # das Fahrzeug wird langsam zum Start (=Sensor) bewegt&lt;br /&gt;
 while sensor_1 == 1 :&lt;br /&gt;
   sensor_1=pfio.digital_read(1)&lt;br /&gt;
  &lt;br /&gt;
 print &amp;quot;fliegender Start... zum Beenden Taste 2 drücken&amp;quot;&lt;br /&gt;
 print &amp;quot;Runde Nr., Ges.Zeit, Rundenzeit, mittlere Rundenzeit&amp;quot;&lt;br /&gt;
 start_zeit=clock()&lt;br /&gt;
 runden_start=start_zeit&lt;br /&gt;
  &lt;br /&gt;
 while sensor_2 == 0 :&lt;br /&gt;
   sensor_2=pfio.digital_read(2)&lt;br /&gt;
   v_wechsel=1-v_wechsel&lt;br /&gt;
   pfio.digital_write(2,v_wechsel)&lt;br /&gt;
   sensor_zeit=clock()&lt;br /&gt;
  &lt;br /&gt;
   while zeit_array[index_zaehler]+sensor_zeit &amp;gt; clock() :&lt;br /&gt;
     if runden_start+sensor_aus &amp;lt; clock() :&lt;br /&gt;
 &lt;br /&gt;
       sensor_1=pfio.digital_read(1) &lt;br /&gt;
       if sensor_1 == 0 :&lt;br /&gt;
         rundenzahl=rundenzahl+1&lt;br /&gt;
         runden_start=clock()&lt;br /&gt;
         zeit=runden_start-start_zeit&lt;br /&gt;
         print rundenzahl, zeit, zeit-vorrunde, zeit/rundenzahl&lt;br /&gt;
         vorrunde=zeit&lt;br /&gt;
         sensor_zeit=0&lt;br /&gt;
         index_zaehler=0&lt;br /&gt;
         v_wechsel=0&lt;br /&gt;
  &lt;br /&gt;
   index_zaehler=index_zaehler+1&lt;br /&gt;
   if index_zaehler &amp;gt; array_laenge :&lt;br /&gt;
     sensor_2=1&lt;br /&gt;
     print &amp;quot;array-Ende erreicht!&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Outp 1 &amp;amp; 2 auf 0!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wird das Array-Ende erreicht, wurden entweder zu wenige Einträge vorgesehen oder es befindet sich kein Fahrzeug (mehr) auf der Strecke, das den Sensor und damit des Zurücksetzen des Arrays auslösen konnte.&lt;br /&gt;
&lt;br /&gt;
e. Das Array ist an die jeweilige Strecke anzupassen, wobei der vorderste Eintrag ungenutzt bleibt und dann mit der Dauer für maximale Spannung begonnen wird. Solange man mit Relais arbeitet, sollten die Schaltzeiten nicht zu kurz sein (&amp;gt;0.1 sek.), da diese eine gewisse mechanische Trägheit besitzen.&lt;br /&gt;
&lt;br /&gt;
f. Eben diese mechanische Beschaffenheit der Relais (Verschleiß) ist auch ein guter Grund, auf &#039;volle&#039; digitale Signalumwandlung umzustellen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Optokoppler als Ersatz für Relais =&lt;br /&gt;
&lt;br /&gt;
Ähnlich wie ein Relais dient ein [[Optokoppler]] dazu, eine Signalübertragung zwischen zwei getrennten Stromkreisen zu ermöglichen. Bei diesem Projekt liegt der Einsatz von Optokopplern nahe, da sie schneller schalten und keine beweglichen Teile besitzen. Für unsere Zwecke benötigen wir nun als zusätzliche Elemente: Optokoppler (CNY 17-4), npn-[[Transistor]]en (BC 337-40) zur Signalverstärkung sowie einige Widerstände im Bereich von 2k und 400 Ohm. &lt;br /&gt;
&lt;br /&gt;
== Kaskadierung von Transistoren zur Signalverstärkung ==&lt;br /&gt;
&lt;br /&gt;
a. Entsprechend Schritt 2.4.d. (ein Relais bei 50 Ohm) wird zunächst ein [[Optokoppler]] eingesetzt, dessen Signal durch einen Transistor verstärkt wird, um die &#039;Grundspannung&#039; zu schalten (Pin 3 und 6 beim Optokoppler sollten unbeschaltet bleiben, allein der &#039;Lichtstrom&#039; reicht für eine Ansteuerung aus):&lt;br /&gt;
&lt;br /&gt;
[[Bild:PiF_CNY_BC_1.png|400px|Optokoppler mit Transistor]]&lt;br /&gt;
&lt;br /&gt;
b. Da immer mit einer gewissen Toleranz bei allen Komponenten zu rechnen ist, kann es sein, dass u.U. die Widerstände etwas größer oder kleiner gewählt werden müssen. Beim Ausprobieren sollte man hier in 10% Schritten variieren.&lt;br /&gt;
&lt;br /&gt;
c. Bei Austesten mit Emulator oder Script ist auch zu beachten, dass nun &#039;Output Pin 8&#039; genutzt wird, da dieser nicht mit den Relais verschaltet ist.&lt;br /&gt;
&lt;br /&gt;
== Umsetzung von 3 Schaltstufen mit Optokopplern ==&lt;br /&gt;
&lt;br /&gt;
a. Entsprechend dem Vorgehen beim Relais kann nun auch der kleine Widerstand zusätzlich beschaltet werden um seine gesteuerte Überbrückung zu ermöglichen. Da hier eine relativ geringe Spannung aufgeschaltet wird, kann zu Beginn eine Diode eingesetzt werden, die die Schaltstufe &#039;maximale Spannung&#039; anzeigt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:SmPiFu2ou2T.png|400px|Kombination von 2 Optokopplern]]&lt;br /&gt;
&lt;br /&gt;
b. Vor dem Testen ist wieder zu beachten, dass nun zusätzlich &#039;Output Pin 7&#039; genutzt wird (statt Output Pin 2).&lt;br /&gt;
&lt;br /&gt;
c. Neben dem Weglassen der Diode (was die Maximalgeschwindigkeit leicht erhöht), können auch statt der 400 Ohm Widerstände 1k-Werte oder höher gewählt werden, wenn dadurch der jeweilige Basisstrom noch hoch genug ist. Im vorliegenden Fall war erst ab 400 Ohm keine weitere Tempoerhöhung mehr feststellbar.&lt;br /&gt;
&lt;br /&gt;
d. Eine mögliche Realisierung sieht so aus: http://youtu.be/xQ7N-PrIULk&lt;br /&gt;
&lt;br /&gt;
== Zusätzliche Erhöhung der Schaltstufen bei D/A-Wandlern ==&lt;br /&gt;
&lt;br /&gt;
a. Zwar benötigen wir in unserem speziellen Beispiel eine &#039;Grundspannung&#039;, die sich dahingehend auswirkt, dass - wie unter 3.1.c. erwähnt - eine Signalkombination nicht ausgewertet wird, aber mit jeder weiteren Schaltstufe würde sich dieses Problem (theoretisch) relativieren, da bei geschickter Auswahl der Widerstände (z.B. im Verhältnis 1 zu 2) jeweils eine Verdoppelung der Kombinationsmöglichkeiten erreichbar ist.&lt;br /&gt;
&lt;br /&gt;
b. Wird hier der 50 Ohm Widerstand asymmetrisch geteilt (z.B. 15 + 35 Ohm, s.a. [[Spannungsteiler]]) um dort ein weiteres Signal umsetzen zu können, ergeben sich direkt folgende 5 Schaltstufen (aus, 50, 35, 15 und 0 Ohm) u.s.w.:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Sm3ou3t2.png|400px|Erhöhung der Schaltstufen]]&lt;br /&gt;
&lt;br /&gt;
c. Zur Ansteuerung dieser Schaltstufen wäre das Script so zu ändern, dass nun zwischen mehr als 2 Stufen gewechselt werden kann und im Array entsprechende Zusatzdaten vorgegeben und ausgelesen werden. Mehr als diese Stufen sind im konkreten Fall aber nicht sinnvoll, da die entstehende Verlustleistung in der Schaltung die maximal verfügbare Leistung reduziert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Weiterführende Ideen =&lt;br /&gt;
&lt;br /&gt;
Die Ausbaumöglichkeiten dieses Projektes sind vielfältig:&lt;br /&gt;
&lt;br /&gt;
== Hardwareseitige Ausbauvarianten ==&lt;br /&gt;
&lt;br /&gt;
- beispielhafte Umsetzung einer differenzierten Abstufung mittels eines möglichst oft durch 2 teilbaren Anfangswertes und der Teiler (640 Ohm, 320, 160...) oder in 10er Potenzen;&lt;br /&gt;
&lt;br /&gt;
- Nachbau des Projekts mit einem Mikrocontroller (ggf. mit LCD-Anzeige);&lt;br /&gt;
&lt;br /&gt;
- Umbau der Steuerung mit dem Ziel, sie direkt an die GPIO-Pins des RPi anzuschließen;&lt;br /&gt;
&lt;br /&gt;
- Entwurf einer Zusatzschaltung, die in diesem Beispiel eine Rückmeldung liefert, ob ein Verbraucher aktiv ist oder nicht (Fahrzeug noch auf der Strecke?);&lt;br /&gt;
&lt;br /&gt;
- Entwurf einer Zusatzschaltung, die erkennt wie viel Strom fliesst: damit wären Rückschlüsse auf den Streckenverlauf möglich (Kurve=etwas mehr Strom, Steigung=noch mehr Strom nötig, etc.) und auch eine programmgesteuerte Optimierung der Array-Schaltzeiten dankbar; &lt;br /&gt;
&lt;br /&gt;
- Einsatz anderer Sensortechniken und/oder mehrerer Sensoren zur Optimierung der Schnelligkeit oder parallelen Steuerung eines 2. Fahrzeuges;&lt;br /&gt;
&lt;br /&gt;
== Softwareseitige Ausbauvarianten ==&lt;br /&gt;
&lt;br /&gt;
- Optimierung des Scripts, indem die Sensor-Abfrage über einen &#039;Listener&#039; umgesetzt wird;&lt;br /&gt;
&lt;br /&gt;
- Erweiterung des Scripts um eine GUI mit Hilfe der python-lib Tkinter, um einen Nutzerzugriff auf das Steuerarray und/oder eine &#039;Verwaltung&#039; mehrerer Fahrzeuge;&lt;br /&gt;
&lt;br /&gt;
- Einbindung eines Web-Interface um eine &#039;Fernsteuerung&#039; zu ermöglichen...&lt;br /&gt;
&lt;br /&gt;
...in jedem Fall: viel Spaß beim Basteln!&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [http://hackaday.com/2013/01/23/replacement-controllers-for-slot-car-racing/ ähnliches Projekt bei &#039;hackaday&#039;] &lt;br /&gt;
* [https://docs.google.com/folder/d/0B-UAZ9CyJCLGQjJ3RDlqa2pqaDg/edit?pli=1&amp;amp;docId=0B-UAZ9CyJCLGNmpMeVpyYlZJUWc Relaisschaltung mit pädagogischer Erweiterung der Universität Manchester (englischspr.)]&lt;br /&gt;
* [http://elinux.org/RPi_Projects/PiFace_controlling_a_slot-car paralleler englischsp. Bericht des Autors zum RPi mit anderem Schwerpunkt] &lt;br /&gt;
* [http://elinux.org/RPi_Projects englischsp. Projektliste zum RPi]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/GhostCarProjekt Verlagerung der gesamten Steuerelektronik ins Fahrzeug]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Raspberry Pi]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Mknot9</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=RPi_als_D/A-Wandler&amp;diff=74450</id>
		<title>RPi als D/A-Wandler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=RPi_als_D/A-Wandler&amp;diff=74450"/>
		<updated>2013-03-08T19:59:11Z</updated>

		<summary type="html">&lt;p&gt;Mknot9: /* Programmgesteuerte Schaltung von 2 Relais */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;von M. Knoop&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
Oft wird ein Computer &#039;nur&#039; genutzt um darauf Software ablaufen zu lassen. Dessen Möglichkeit zur Steuerung von elektrischen und mechanischen Geräten wird dabei leicht übersehen.&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel richtet sich daher an Einsteiger, die mit dem [[Raspberry Pi]] (&#039;RPi&#039;) Grundlagen der Computersteuerung mit Relais und [[Spannungsteiler]]n nachvollziehen möchten. Es wird an einem konkreten Beispiel schrittweise dargestellt, wie mittels eines D/A-Wandlers (Digital/Analog-Wandler = Umwandlung von digitalen 1/0 Signale) die Steuerung einer stufenweise veränderbaren Ausgangsspannung aufgebaut werden kann.&lt;br /&gt;
&lt;br /&gt;
= Verwendete Hardware =&lt;br /&gt;
&lt;br /&gt;
== RPi in Kombination mit der &#039;PiFace&#039;-Karte als Bastelplattform ==&lt;br /&gt;
&lt;br /&gt;
Dank der einfachen Bauweise bietet sich der RPi mit seinen frei zugänglichen GPIO-Pins als ideale Bastelplattform an. Trotzdem kann es beim anfänglichen Experimentieren mit Schaltungen öfters zu kleinen Fehlern kommen, die schlimmstenfalls die empfindliche Elektronik des RPi dauerhaft beschädigen können.&lt;br /&gt;
&lt;br /&gt;
Daher wird bei diesem Projekt zusätzlich mit der &#039;PiFace[http://elinux.org/RPi_Expansion_Boards#Piface]&#039;-Karte gearbeitet, die man auf die GPIO-Pins stecken kann. Diese Erweiterungskarte verschaltet die GPIO-Pins auf je 8 digitale Ein- und Ausgänge sowie 2 Relais, die eine galvanische Trennung von Stromkreisen ermöglichen. Damit besteht auch für Einsteiger ein gewisser Schutz für die Steuerelektronik des RPi.&lt;br /&gt;
&lt;br /&gt;
Auch im weiteren Verlauf dieser Einführung soll noch auf eine Trennung der Stromkreise Wert gelegt werden, so dass für erste digitale Schaltexperimente ein Optokoppler genutzt wird. Die spätere Nutzung der &#039;Input Pins&#039; des PiFace um eine Steuerung der D/A-Wandlung durch bestimmte Ereignisse zu ermöglichen, erfolgt ebenfalls passiv.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Auch wenn mit vermeintlich &#039;sicheren&#039; Transformatoren gebastelt wird, muss stets bedacht werden, dass diese an einem 230V-Stromnetz betrieben werden und man eher einmal mehr als weniger prüfen sollte, ob man durch eventuelle Fehler mit lebensgefährlicher Spannung in Berührung kommt!&lt;br /&gt;
&lt;br /&gt;
== Auswahl eines Beispielprojektes ==&lt;br /&gt;
&lt;br /&gt;
Günstige Möglichkeiten ein Gerät zu finden, das mit analogen Spannungen arbeitet, bieten sich u.a. im Spielzeugbereich. Im Grunde eignet sich alles, was mit Batterien oder mit Gleichspannungen unter 24 V betrieben wird.&lt;br /&gt;
&lt;br /&gt;
Da jedoch ein Ziel das Steuern von analogen Spannungen ist, bietet sich insbesondere alles an, bei dem [[Potentiometer]] eingesetzt werden. Einen dieser &#039;Handregler&#039; sollte man übrig haben, da er von seinem Anschlusskabel abgetrennt werden muss, um den oft proprietären Steckanschluss nutzen zu können. In diesem Sinne wird hier eine handelsübliche Spielzeug-Autorennbahn mit Potentiometer-Handreglern genutzt.&lt;br /&gt;
&lt;br /&gt;
== Sonstige Bauteile ==&lt;br /&gt;
&lt;br /&gt;
Für die ersten Grundlagen (s. Teile 2 &amp;amp; 3) genügen bereits rund 2 m isolierter Draht, der nicht aus verdrillten feinen Adern (Litze) bestehen sollte, 50 cm nicht-isolierter Draht, einige niederohmige Widerstände (z.B. je 2 mal 100 Ohm, 80, 60, sowie 20) und ein &#039;Experimentierbrett&#039; (engl. [[Breadboard]]).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Grundlagen und Vorbereitung des Projekts =&lt;br /&gt;
&lt;br /&gt;
== Umwandlung von 1/0 zu Ein/Aus mit einem Relais ==&lt;br /&gt;
&lt;br /&gt;
Vom Prinzip her ist jede Umwandlung eines digitalen 0 oder 1 Signals (das über eine bestimmte Spannungsdifferenz festgelegt ist) in eine (nutzbare) Spannung bereits eine D/A-Wandlung. Dies wird schlicht so realisiert, dass mit einer Eingabe am RPi die Nutzspannung des &#039;Verbrauchers&#039; zunächst einfach an- und ausgeschaltet wird.&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung der zu steuernden Hardware ==&lt;br /&gt;
&lt;br /&gt;
a. Um Fehlerquellen auszuschließen sollte zunächst (und ggf. auch später!) kurz getestet werden, ob der vorhandene Regler wie erwartet funktioniert.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pif_Con9.jpg|thumb|right|400px|Fixierung der Reglerkabel]]&lt;br /&gt;
b. Nach dem Trennen des Reglers von der Einspeisung (und ggf. Ziehen des Netzsteckers) muss das Regler-Kabel abgeschnitten werden (eher nahe beim Regler, da das Kabel bald bis zum Breadboard reichen soll). Die neuen Enden des Einspeiseteils werden abisoliert und auf dem Breadboard diagonal zueinander mit einigen Spalten Abstand fixiert. Auch können bereits die Drähte, die später zum RPi führen, jeweils in den passenden kontaktführenden Spalten eingesteckt werden, z. B. wie rechts zu sehen (die nicht beschrifteten Drähte können vorerst ignoriert werden):&lt;br /&gt;
&lt;br /&gt;
c. Nun bietet sich eine gute Gelegenheit die maximale Spannung am Nutzgerät zu messen. Man verbindet das Regler-Kabel (nun ohne Regler) wieder mit der Einspeisung und die offenen Enden der Drähte mit dem Messgerät, bei dem zunächst ein Messbereich von ca. 10-50 Volt gewählt werden sollte. Dies sollte dann z.B. 14,8 V anzeigen. Natürlich können auch die beiden offenen Enden einen kleinen Moment kurz geschlossen werden, man sollte aber bedenken, dass das zu regelnde Nutzgerät dann die maximal vorgesehene Spannung erhält (hier: maximales Tempo).&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung des RPi ==&lt;br /&gt;
&lt;br /&gt;
Es wird davon ausgegangen, dass entsprechend des zugehörigen &#039;manual&#039; das PiFace bereits auf den RPi gesteckt ist, die nötigen python-Bibliotheken installiert sind und man sich im Terminal-Arbeitsverzeichnis &#039;pi&#039; befindet.&lt;br /&gt;
&lt;br /&gt;
a. Zunächst wird der PiFace-Emulator (im Terminal direkt aus dem Arbeitsverzeichnis) gestartet: &amp;lt;tt&amp;gt;piface/scripts/piface-emulator&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b. Wenn alles richtig installiert wurde, erscheint ein Fenster (unten links), bei dem die vorerst wichtigen blauen Signale am rechten Rand wie folgt angezeigt werden sollten: &lt;br /&gt;
 &lt;br /&gt;
[[Datei:RPi_PiF_em-scs.jpg|400px|Piface-Emulator im default-Zustand]] [[Datei:RPi_PiF_em_scs1.jpg|400px|Piface-Relais 1 auf &#039;1&#039; geschaltet]]&lt;br /&gt;
&lt;br /&gt;
c. Das rechte Fenster ergibt sich, wenn man nun im Fenster auf &amp;quot;Override Enable&amp;quot; und dann &amp;quot;Output Pin 1&amp;quot; klickt. Es müsste ein &amp;quot;Klick&amp;quot; vom Relais 1 zu hören sein sowie der Schaltzustand des unteren Relais 1 (das an den Output Pin 1 gekoppelt ist) auf die Verbindung der beiden unteren Anschlüsse wechseln. Zugleich wird das erste LED-Icon beim Output Pin 1 rot sowie das zugehörige LED-Icon blau.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pif_rel2.png|thumb|right|250px|Schema der Piface-Relais]]&lt;br /&gt;
d. Rechts ist der Schaltzustand der Relais, die zu Beginn genutzt werden, im Grundzustand dargestellt (jeweils der mittlere und obere Kontakt sind kurzgeschlossen, der jeweils untere Kontakt ist frei):&lt;br /&gt;
&lt;br /&gt;
e. Ein weiterer Klick auf &amp;quot;Output Pin 1&amp;quot; versetzt das Relais in den Ausgangszustand, der vor dem nächsten Schritt wieder eingestellt werden sollte.&lt;br /&gt;
&lt;br /&gt;
f. Das Relais lässt sich auch mittels eines Python-Scripts vom RPi aus ansteuern. Dazu wird folgende Textdatei &amp;quot;wandler.py&amp;quot; im Arbeitsverzeichnis abgespeichert und mit dem Befehl &amp;quot;&amp;lt;tt&amp;gt;python wandler.py&amp;lt;/tt&amp;gt;&amp;quot; gestartet:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler.py&lt;br /&gt;
&lt;br /&gt;
 from time import sleep&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
&lt;br /&gt;
 pfio.init()&lt;br /&gt;
&lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
 print &amp;quot;Strom an&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 sleep(2)&lt;br /&gt;
&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Strom aus&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Nach dem Absetzen des Befehls wechselt nun das blaue Signal an Relais 1 für 2 Sekunden und das Relais klickt entsprechend.&lt;br /&gt;
&lt;br /&gt;
== Einsatz eines Relais&#039; zur Umsetzung von Spannungsänderungen ==&lt;br /&gt;
&lt;br /&gt;
a. Ist das Relais wieder im Ausgangszustand, befestigt man nun einen der vom Breadboard führenden Drähte am unteren und einen am mittleren Relaiseingang (im Moment ist die Polarität noch egal). Zunächst sollte nichts passieren (das Relais hält diesen ja Stromkreis noch offen).&lt;br /&gt;
&lt;br /&gt;
b. Startet man aber das Script wieder (&amp;lt;tt&amp;gt;python wandler.py&amp;lt;/tt&amp;gt;) oder klickt auf &#039;Output Pin 1&#039; wird der Nutzstromkreis geschlossen. Nochmals aufgepasst: unser Nutzer erhält wieder die maximal vorgesehene Spannung - also besser vorher im Script &amp;quot;&amp;lt;tt&amp;gt;sleep(0.3)&amp;lt;/tt&amp;gt;&amp;quot; setzen und speichern.&lt;br /&gt;
&lt;br /&gt;
c. Im Prinzip ist damit die programmgesteuerte Umsetzung eines 0/1 Signals in z.B. eine 0V/15V Spannung erreicht.&lt;br /&gt;
&lt;br /&gt;
d. Da wir bald verschiedene Steuerspannungen schalten wollen, geht es jetzt darum herauszufinden, bei welcher Spannung unser Nutzgerät gerade noch bewegt wird. Dies probiert man aus - mit dem kleinsten Widerstand beginnend: indem einer der Drähte in eine freie Breadboardspalte gesteckt wird und aus dieser Spalte der Widerstand zu dem &#039;alten&#039; Steckplatz des Drahtes geführt wird. Nun startet man jeweils das Script bis der Widerstand so hoch ist, dass die Anlaufspannung beim Nutzgerätes gut ausreicht, eine Reaktion des Nutzgerät (Fahrzeug bewegt sich) zu bewirken (z.B. bei 50 Ohm beträgt der Strom im Mittel ca. 130 mA während ohne 190 mA fließen).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Ansteuerung von 3 Schaltstufen =&lt;br /&gt;
&lt;br /&gt;
== Kombination von 2 Relais ==&lt;br /&gt;
&lt;br /&gt;
[[Bild:ZrelMww2.png|thumb|right|250px|Beschaltung der Relais]] a. Die einfachste Stufe der weiteren Verschaltung erreicht man, indem der Widerstand mit einem 2. Relais überbrückt wird. Relais 1 kann dann als &#039;Hauptschalter&#039;, Relais 2 als Spannungsumschalter genutzt werden:&lt;br /&gt;
&lt;br /&gt;
b. Diese Beschaltung kann sogleich mit dem PiFace-Emulator ausprobiert werden. Damit können wir bereits 3 Schaltstufen steuern: keine, verminderte und volle Spannung.&lt;br /&gt;
&lt;br /&gt;
c. Theoretisch ließe sich auch noch eine 4. Spannungsstufe erzeugen, da mit 2 &#039;Bits&#039; (Ein/Aus bei 2 Relais) bereits 4 verschiedene Signale darstellbar sind. Beim jetzigen Aufbau werden aber lediglich die (pin1,pin2)-Signale (0,0), (1,0) und (1,1) &#039;genutzt&#039;, da Relais 1 als Hauptschalter vorgesehen ist und die Kombination (0,1) so nicht ausgewertet wird.&lt;br /&gt;
&lt;br /&gt;
== Programmgesteuerte Schaltung von 2 Relais ==&lt;br /&gt;
&lt;br /&gt;
a. Mit einem veränderten python-Script &amp;quot;wandler2.py&amp;quot; ist auch die programmgesteuerte Schaltung möglich. Dabei werden zusätzlich die Tasten 1 und 2 des PiFace genutzt, um nach dem Start des Scripts (&amp;lt;tt&amp;gt;python wandler2.py&amp;lt;/tt&amp;gt;) den Hauptschalter (Relais 1) zu steuern:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler2.py&lt;br /&gt;
 &lt;br /&gt;
 from time import sleep&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
 pfio.init()&lt;br /&gt;
 &lt;br /&gt;
 taste_1=0&lt;br /&gt;
 taste_2=0&lt;br /&gt;
 intervall_a=0.1&lt;br /&gt;
 intervall_b=0.5&lt;br /&gt;
 # Die Intervalle bestimmen die Schaltzeit für volle/verminderte Spannung&lt;br /&gt;
 &lt;br /&gt;
 print &amp;quot;Zum Start Taste 1 drücken, zum Stoppen Taste 2&amp;quot;&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 while taste_1 == 0:&lt;br /&gt;
   sleep(intervall_a)&lt;br /&gt;
   taste_1=pfio.digital_read(1)&lt;br /&gt;
&lt;br /&gt;
 # Der o.g. &#039;sleep&#039;-Befehl bestimmt die Abfragepausen für Taste 1&lt;br /&gt;
 &lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
 print &amp;quot;Strom an!&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 while taste_2 == 0:&lt;br /&gt;
   pfio.digital_write(2,1)&lt;br /&gt;
   sleep(intervall_a)&lt;br /&gt;
   pfio.digital_write(2,0)&lt;br /&gt;
   sleep(intervall_b)&lt;br /&gt;
   taste_2=pfio.digital_read(2)&lt;br /&gt;
 &lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Strom aus!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
b. Falls beim Ausprobieren von Script-Änderungen mal was schief geht, kann das Script stets auch mit der Tastenkombination (CTRL-C) gestoppt werden. U.U. muss dann noch zusätzlich Relais 1 und/oder 2 via Emulator zurückgesetzt werden.&lt;br /&gt;
&lt;br /&gt;
c. Beim Verändern des Scripts fällt bald auf, dass die bisherige Programmsteuerung keine direkte Möglichkeit vorsieht, auf Ereignisse zu reagieren. Immerhin wird ein mechanisches Gerät gesteuert, bei dem mit Ausfällen, Fertigungstoleranzen, Umwelteinflüssen etc. zu rechnen ist (im Script wird dies bislang &#039;nur&#039; durch die Abbruchbedingung &#039;Taste 2&#039; berücksichtigt).&lt;br /&gt;
&lt;br /&gt;
== Einfache Sensor-Signale als steuernde Elemente eines Programms ==&lt;br /&gt;
&lt;br /&gt;
a. Eine wichtige Anwendung von D/A-Steuerungen ist die mögliche Reaktion dieser Steuerung auf &#039;äußere&#039; Ereignisse, die z.B. mit Hilfe von Sensoren leistbar ist.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Einf_Sens.jpg|thumb|right|250px|einfacher Sensor]]b. Für unsere Zwecke genügt zunächst ein sehr einfacher Sensor, der ein 0- oder 1-Signal liefert und idealerweise direkt am &#039;Input Pin 1&#039; des PiFace angeschlossen werden kann. So liegt beim Input Pin 1 das Signal &#039;1&#039; an, wenn eine Verbindung zu &#039;Input GND&#039; besteht.&lt;br /&gt;
Z.B. können 2 unisolierte Drähte so platziert werden, dass ein vorbeifahrendes Fahrzeug einen von ihnen genügend bewegt um den Kontakt kurze Zeit zu öffnen. Genau dann liefert dieser &#039;Sensor&#039; das Signal &#039;0&#039;. Eine - die Schwerkraft nutzende - mögliche Bauform ist rechts abgebildet ;-)&lt;br /&gt;
&lt;br /&gt;
c. Natürlich werden zusätzlich 2 isolierte Drähte benötigt, um jeden der beiden offenen Drähte geschützt mit Input Pin 1 und Input GND zu verbinden.&lt;br /&gt;
&lt;br /&gt;
d. Bei jeder Durchfahrt liefert der Sensor nun ein &#039;0&#039;-Signal, was im Script sowohl für eine Zeitmessung als auch für ein &#039;Schaltintervall-Array&#039; genutzt werden kann. Dort können abwechselnd für beide Spannungen Zeiten (die in etwa zum jeweiligen Streckenabschnitt passen) &#039;programmiert&#039; werden. Statt Taste 1 wird nun der Sensor ausgewertet (wobei Taste 1 als Sensor-Ersatz insoweit genutzt werden kann, dass sie gedrückt bleiben bzw. kurz losgelassen werden muss). Zur genaueren Zeitmessung wird noch das modul &#039;clock&#039; benötigt. &amp;quot;&amp;lt;tt&amp;gt;wandler3.py&amp;lt;/tt&amp;gt;&amp;quot; könnte also so aussehen:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler3.py&lt;br /&gt;
 &lt;br /&gt;
 from time import clock&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
 sensor_1=1&lt;br /&gt;
 sensor_2=0&lt;br /&gt;
 rundenzahl=0&lt;br /&gt;
 v_wechsel=0&lt;br /&gt;
 vorrunde=0&lt;br /&gt;
 index_zaehler=1&lt;br /&gt;
 &lt;br /&gt;
 zeit_array=[0,0.2,0.4,0.2,0.4,0.2,0.4,0.2,5,0.2,6]&lt;br /&gt;
 # dieses array enthält die sek. bis zum Spannungswechsel&lt;br /&gt;
&lt;br /&gt;
 array_laenge=9&lt;br /&gt;
 # legt fest, wie viel Werte des arrays genutzt werden sollen&lt;br /&gt;
 &lt;br /&gt;
 sensor_aus=1.3&lt;br /&gt;
 # bis der Sensor sicher in die Ruhestellung kippt, wird er nicht ausgelesen&lt;br /&gt;
  &lt;br /&gt;
 pfio.init()&lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
&lt;br /&gt;
 # das Fahrzeug wird langsam zum Start (=Sensor) bewegt&lt;br /&gt;
 while sensor_1 == 1 :&lt;br /&gt;
   sensor_1=pfio.digital_read(1)&lt;br /&gt;
  &lt;br /&gt;
 print &amp;quot;fliegender Start... zum Beenden Taste 2 drücken&amp;quot;&lt;br /&gt;
 print &amp;quot;Runde Nr., Ges.Zeit, Rundenzeit, mittlere Rundenzeit&amp;quot;&lt;br /&gt;
 start_zeit=clock()&lt;br /&gt;
 runden_start=start_zeit&lt;br /&gt;
  &lt;br /&gt;
 while sensor_2 == 0 :&lt;br /&gt;
   sensor_2=pfio.digital_read(2)&lt;br /&gt;
   v_wechsel=1-v_wechsel&lt;br /&gt;
   pfio.digital_write(2,v_wechsel)&lt;br /&gt;
   sensor_zeit=clock()&lt;br /&gt;
  &lt;br /&gt;
   while zeit_array[index_zaehler]+sensor_zeit &amp;gt; clock() :&lt;br /&gt;
     if runden_start+sensor_aus &amp;lt; clock() :&lt;br /&gt;
 &lt;br /&gt;
       sensor_1=pfio.digital_read(1) &lt;br /&gt;
       if sensor_1 == 0 :&lt;br /&gt;
         rundenzahl=rundenzahl+1&lt;br /&gt;
         runden_start=clock()&lt;br /&gt;
         zeit=runden_start-start_zeit&lt;br /&gt;
         print rundenzahl, zeit, zeit-vorrunde, zeit/rundenzahl&lt;br /&gt;
         vorrunde=zeit&lt;br /&gt;
         sensor_zeit=0&lt;br /&gt;
         index_zaehler=0&lt;br /&gt;
         v_wechsel=0&lt;br /&gt;
  &lt;br /&gt;
   index_zaehler=index_zaehler+1&lt;br /&gt;
   if index_zaehler &amp;gt; array_laenge :&lt;br /&gt;
     sensor_2=1&lt;br /&gt;
     print &amp;quot;array-Ende erreicht!&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Outp 1 &amp;amp; 2 auf 0!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wird das Array-Ende erreicht, wurden entweder zu wenige Einträge vorgesehen oder es befindet sich kein Fahrzeug (mehr) auf der Strecke, das den Sensor und damit des Zurücksetzen des Arrays auslösen konnte.&lt;br /&gt;
&lt;br /&gt;
e. Das Array ist an die jeweilige Strecke anzupassen, wobei der vorderste Eintrag ungenutzt bleibt und dann mit der Dauer für maximale Spannung begonnen wird. Solange man mit Relais arbeitet, sollten die Schaltzeiten nicht zu kurz sein (&amp;gt;0.1 sek.), da diese eine gewisse mechanische Trägheit besitzen.&lt;br /&gt;
&lt;br /&gt;
f. Eben diese mechanische Beschaffenheit der Relais (Verschleiß) ist auch ein guter Grund, auf &#039;volle&#039; digitale Signalumwandlung umzustellen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Optokoppler als Ersatz für Relais =&lt;br /&gt;
&lt;br /&gt;
Ähnlich wie ein Relais dient ein [[Optokoppler]] dazu, eine Signalübertragung zwischen zwei getrennten Stromkreisen zu ermöglichen. Bei diesem Projekt liegt der Einsatz von Optokopplern nahe, da sie schneller schalten und keine beweglichen Teile besitzen. Für unsere Zwecke benötigen wir nun als zusätzliche Elemente: Optokoppler (CNY 17-4), npn-[[Transistor]]en (BC 337-40) zur Signalverstärkung sowie einige Widerstände im Bereich von 2k und 400 Ohm. &lt;br /&gt;
&lt;br /&gt;
== Kaskadierung von Transistoren zur Signalverstärkung ==&lt;br /&gt;
&lt;br /&gt;
a. Entsprechend Schritt 2.4.d. (ein Relais bei 50 Ohm) wird zunächst ein [[Optokoppler]] eingesetzt, dessen Signal durch einen Transistor verstärkt wird, um die &#039;Grundspannung&#039; zu schalten (Pin 3 und 6 beim Optokoppler sollten unbeschaltet bleiben, allein der &#039;Lichtstrom&#039; reicht für eine Ansteuerung aus):&lt;br /&gt;
&lt;br /&gt;
[[Bild:PiF_CNY_BC_1.png|400px|Optokoppler mit Transistor]]&lt;br /&gt;
&lt;br /&gt;
b. Da immer mit einer gewissen Toleranz bei allen Komponenten zu rechnen ist, kann es sein, dass u.U. die Widerstände etwas größer oder kleiner gewählt werden müssen. Beim Ausprobieren sollte man hier in 10% Schritten variieren.&lt;br /&gt;
&lt;br /&gt;
c. Bei Austesten mit Emulator oder Script ist auch zu beachten, dass nun &#039;Output Pin 8&#039; genutzt wird, da dieser nicht mit den Relais verschaltet ist.&lt;br /&gt;
&lt;br /&gt;
== Umsetzung von 3 Schaltstufen mit Optokopplern ==&lt;br /&gt;
&lt;br /&gt;
a. Entsprechend dem Vorgehen beim Relais kann nun auch der kleine Widerstand zusätzlich beschaltet werden um seine gesteuerte Überbrückung zu ermöglichen. Da hier eine relativ geringe Spannung aufgeschaltet wird, kann zu Beginn eine Diode eingesetzt werden, die die Schaltstufe &#039;maximale Spannung&#039; anzeigt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:SmPiFu2ou2T.png|400px|Kombination von 2 Optokopplern]]&lt;br /&gt;
&lt;br /&gt;
b. Vor dem Testen ist wieder zu beachten, dass nun zusätzlich &#039;Output Pin 7&#039; genutzt wird (statt Output Pin 2).&lt;br /&gt;
&lt;br /&gt;
c. Neben dem Weglassen der Diode (was die Maximalgeschwindigkeit leicht erhöht), können auch statt der 400 Ohm Widerstände 1k-Werte oder höher gewählt werden, wenn dadurch der jeweilige Basisstrom noch hoch genug ist. Im vorliegenden Fall war erst ab 400 Ohm keine weitere Tempoerhöhung mehr feststellbar.&lt;br /&gt;
&lt;br /&gt;
d. Eine mögliche Realisierung sieht so aus: http://youtu.be/xQ7N-PrIULk&lt;br /&gt;
&lt;br /&gt;
== Zusätzliche Erhöhung der Schaltstufen bei D/A-Wandlern ==&lt;br /&gt;
&lt;br /&gt;
a. Zwar benötigen wir in unserem speziellen Beispiel eine &#039;Grundspannung&#039;, die sich dahingehend auswirkt, dass - wie unter 3.1.c. erwähnt - eine Signalkombination nicht ausgewertet wird, aber mit jeder weiteren Schaltstufe würde sich dieses Problem (theoretisch) relativieren, da bei geschickter Auswahl der Widerstände (z.B. im Verhältnis 1 zu 2) jeweils eine Verdoppelung der Kombinationsmöglichkeiten erreichbar ist.&lt;br /&gt;
&lt;br /&gt;
b. Wird hier der 50 Ohm Widerstand asymmetrisch geteilt (z.B. 15 + 35 Ohm, s.a. [[Spannungsteiler]]) um dort ein weiteres Signal umsetzen zu können, ergeben sich direkt folgende 5 Schaltstufen (aus, 50, 35, 15 und 0 Ohm) u.s.w.:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Sm3ou3t2.png|400px|Erhöhung der Schaltstufen]]&lt;br /&gt;
&lt;br /&gt;
c. Zur Ansteuerung dieser Schaltstufen wäre das Script so zu ändern, dass nun zwischen mehr als 2 Stufen gewechselt werden kann und im Array entsprechende Zusatzdaten vorgegeben und ausgelesen werden. Mehr als diese Stufen sind im konkreten Fall aber nicht sinnvoll, da die entstehende Verlustleistung in der Schaltung die maximal verfügbare Leistung reduziert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Weiterführende Ideen =&lt;br /&gt;
&lt;br /&gt;
Die Ausbaumöglichkeiten dieses Projektes sind vielfältig:&lt;br /&gt;
&lt;br /&gt;
== Hardwareseitige Ausbauvarianten ==&lt;br /&gt;
&lt;br /&gt;
- beispielhafte Umsetzung einer differenzierten Abstufung mittels einer logarithmischen Einteilung oder eines möglichst oft durch 2 teilbaren Anfangswertes und der Teiler (640 Ohm, 320, 160...);&lt;br /&gt;
&lt;br /&gt;
- Nachbau des Projekts mit einem Mikrocontroller (ggf. mit LCD-Anzeige);&lt;br /&gt;
&lt;br /&gt;
- Umbau der Steuerung mit dem Ziel, sie direkt an die GPIO-Pins des RPi anzuschließen;&lt;br /&gt;
&lt;br /&gt;
- Entwurf einer Zusatzschaltung, die in diesem Beispiel eine Rückmeldung liefert, ob ein Verbraucher aktiv ist oder nicht (Fahrzeug noch auf der Strecke?);&lt;br /&gt;
&lt;br /&gt;
- Entwurf einer Zusatzschaltung, die erkennt wie viel Strom fliesst: damit wären Rückschlüsse auf den Streckenverlauf möglich (Kurve=etwas mehr Strom, Steigung=noch mehr Strom nötig, etc.) und auch eine programmgesteuerte Optimierung der Array-Schaltzeiten dankbar; &lt;br /&gt;
&lt;br /&gt;
- Einsatz anderer Sensortechniken und/oder mehrerer Sensoren zur Optimierung der Schnelligkeit oder parallelen Steuerung eines 2. Fahrzeuges;&lt;br /&gt;
&lt;br /&gt;
== Softwareseitige Ausbauvarianten ==&lt;br /&gt;
&lt;br /&gt;
- Optimierung des Scripts, indem die Sensor-Abfrage über einen &#039;Listener&#039; umgesetzt wird;&lt;br /&gt;
&lt;br /&gt;
- Erweiterung des Scripts um eine GUI mit Hilfe der python-lib Tkinter, um einen Nutzerzugriff auf das Steuerarray und/oder eine &#039;Verwaltung&#039; mehrerer Fahrzeuge;&lt;br /&gt;
&lt;br /&gt;
- Einbindung eines Web-Interface um eine &#039;Fernsteuerung&#039; zu ermöglichen...&lt;br /&gt;
&lt;br /&gt;
...in jedem Fall: viel Spaß beim Basteln!&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [http://hackaday.com/2013/01/23/replacement-controllers-for-slot-car-racing/ ähnliches Projekt bei &#039;hackaday&#039;] &lt;br /&gt;
* [https://docs.google.com/folder/d/0B-UAZ9CyJCLGQjJ3RDlqa2pqaDg/edit?pli=1&amp;amp;docId=0B-UAZ9CyJCLGNmpMeVpyYlZJUWc Relaisschaltung mit pädagogischer Erweiterung der Universität Manchester (englischspr.)]&lt;br /&gt;
* [http://elinux.org/RPi_Projects/PiFace_controlling_a_slot-car paralleler englischsp. Bericht des Autors zum RPi mit anderem Schwerpunkt] &lt;br /&gt;
* [http://elinux.org/RPi_Projects englischsp. Projektliste zum RPi]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/GhostCarProjekt Verlagerung der gesamten Steuerelektronik ins Fahrzeug]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Raspberry Pi]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Mknot9</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=RPi_als_D/A-Wandler&amp;diff=74449</id>
		<title>RPi als D/A-Wandler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=RPi_als_D/A-Wandler&amp;diff=74449"/>
		<updated>2013-03-08T19:57:14Z</updated>

		<summary type="html">&lt;p&gt;Mknot9: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;von M. Knoop&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
Oft wird ein Computer &#039;nur&#039; genutzt um darauf Software ablaufen zu lassen. Dessen Möglichkeit zur Steuerung von elektrischen und mechanischen Geräten wird dabei leicht übersehen.&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel richtet sich daher an Einsteiger, die mit dem [[Raspberry Pi]] (&#039;RPi&#039;) Grundlagen der Computersteuerung mit Relais und [[Spannungsteiler]]n nachvollziehen möchten. Es wird an einem konkreten Beispiel schrittweise dargestellt, wie mittels eines D/A-Wandlers (Digital/Analog-Wandler = Umwandlung von digitalen 1/0 Signale) die Steuerung einer stufenweise veränderbaren Ausgangsspannung aufgebaut werden kann.&lt;br /&gt;
&lt;br /&gt;
= Verwendete Hardware =&lt;br /&gt;
&lt;br /&gt;
== RPi in Kombination mit der &#039;PiFace&#039;-Karte als Bastelplattform ==&lt;br /&gt;
&lt;br /&gt;
Dank der einfachen Bauweise bietet sich der RPi mit seinen frei zugänglichen GPIO-Pins als ideale Bastelplattform an. Trotzdem kann es beim anfänglichen Experimentieren mit Schaltungen öfters zu kleinen Fehlern kommen, die schlimmstenfalls die empfindliche Elektronik des RPi dauerhaft beschädigen können.&lt;br /&gt;
&lt;br /&gt;
Daher wird bei diesem Projekt zusätzlich mit der &#039;PiFace[http://elinux.org/RPi_Expansion_Boards#Piface]&#039;-Karte gearbeitet, die man auf die GPIO-Pins stecken kann. Diese Erweiterungskarte verschaltet die GPIO-Pins auf je 8 digitale Ein- und Ausgänge sowie 2 Relais, die eine galvanische Trennung von Stromkreisen ermöglichen. Damit besteht auch für Einsteiger ein gewisser Schutz für die Steuerelektronik des RPi.&lt;br /&gt;
&lt;br /&gt;
Auch im weiteren Verlauf dieser Einführung soll noch auf eine Trennung der Stromkreise Wert gelegt werden, so dass für erste digitale Schaltexperimente ein Optokoppler genutzt wird. Die spätere Nutzung der &#039;Input Pins&#039; des PiFace um eine Steuerung der D/A-Wandlung durch bestimmte Ereignisse zu ermöglichen, erfolgt ebenfalls passiv.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Auch wenn mit vermeintlich &#039;sicheren&#039; Transformatoren gebastelt wird, muss stets bedacht werden, dass diese an einem 230V-Stromnetz betrieben werden und man eher einmal mehr als weniger prüfen sollte, ob man durch eventuelle Fehler mit lebensgefährlicher Spannung in Berührung kommt!&lt;br /&gt;
&lt;br /&gt;
== Auswahl eines Beispielprojektes ==&lt;br /&gt;
&lt;br /&gt;
Günstige Möglichkeiten ein Gerät zu finden, das mit analogen Spannungen arbeitet, bieten sich u.a. im Spielzeugbereich. Im Grunde eignet sich alles, was mit Batterien oder mit Gleichspannungen unter 24 V betrieben wird.&lt;br /&gt;
&lt;br /&gt;
Da jedoch ein Ziel das Steuern von analogen Spannungen ist, bietet sich insbesondere alles an, bei dem [[Potentiometer]] eingesetzt werden. Einen dieser &#039;Handregler&#039; sollte man übrig haben, da er von seinem Anschlusskabel abgetrennt werden muss, um den oft proprietären Steckanschluss nutzen zu können. In diesem Sinne wird hier eine handelsübliche Spielzeug-Autorennbahn mit Potentiometer-Handreglern genutzt.&lt;br /&gt;
&lt;br /&gt;
== Sonstige Bauteile ==&lt;br /&gt;
&lt;br /&gt;
Für die ersten Grundlagen (s. Teile 2 &amp;amp; 3) genügen bereits rund 2 m isolierter Draht, der nicht aus verdrillten feinen Adern (Litze) bestehen sollte, 50 cm nicht-isolierter Draht, einige niederohmige Widerstände (z.B. je 2 mal 100 Ohm, 80, 60, sowie 20) und ein &#039;Experimentierbrett&#039; (engl. [[Breadboard]]).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Grundlagen und Vorbereitung des Projekts =&lt;br /&gt;
&lt;br /&gt;
== Umwandlung von 1/0 zu Ein/Aus mit einem Relais ==&lt;br /&gt;
&lt;br /&gt;
Vom Prinzip her ist jede Umwandlung eines digitalen 0 oder 1 Signals (das über eine bestimmte Spannungsdifferenz festgelegt ist) in eine (nutzbare) Spannung bereits eine D/A-Wandlung. Dies wird schlicht so realisiert, dass mit einer Eingabe am RPi die Nutzspannung des &#039;Verbrauchers&#039; zunächst einfach an- und ausgeschaltet wird.&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung der zu steuernden Hardware ==&lt;br /&gt;
&lt;br /&gt;
a. Um Fehlerquellen auszuschließen sollte zunächst (und ggf. auch später!) kurz getestet werden, ob der vorhandene Regler wie erwartet funktioniert.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pif_Con9.jpg|thumb|right|400px|Fixierung der Reglerkabel]]&lt;br /&gt;
b. Nach dem Trennen des Reglers von der Einspeisung (und ggf. Ziehen des Netzsteckers) muss das Regler-Kabel abgeschnitten werden (eher nahe beim Regler, da das Kabel bald bis zum Breadboard reichen soll). Die neuen Enden des Einspeiseteils werden abisoliert und auf dem Breadboard diagonal zueinander mit einigen Spalten Abstand fixiert. Auch können bereits die Drähte, die später zum RPi führen, jeweils in den passenden kontaktführenden Spalten eingesteckt werden, z. B. wie rechts zu sehen (die nicht beschrifteten Drähte können vorerst ignoriert werden):&lt;br /&gt;
&lt;br /&gt;
c. Nun bietet sich eine gute Gelegenheit die maximale Spannung am Nutzgerät zu messen. Man verbindet das Regler-Kabel (nun ohne Regler) wieder mit der Einspeisung und die offenen Enden der Drähte mit dem Messgerät, bei dem zunächst ein Messbereich von ca. 10-50 Volt gewählt werden sollte. Dies sollte dann z.B. 14,8 V anzeigen. Natürlich können auch die beiden offenen Enden einen kleinen Moment kurz geschlossen werden, man sollte aber bedenken, dass das zu regelnde Nutzgerät dann die maximal vorgesehene Spannung erhält (hier: maximales Tempo).&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung des RPi ==&lt;br /&gt;
&lt;br /&gt;
Es wird davon ausgegangen, dass entsprechend des zugehörigen &#039;manual&#039; das PiFace bereits auf den RPi gesteckt ist, die nötigen python-Bibliotheken installiert sind und man sich im Terminal-Arbeitsverzeichnis &#039;pi&#039; befindet.&lt;br /&gt;
&lt;br /&gt;
a. Zunächst wird der PiFace-Emulator (im Terminal direkt aus dem Arbeitsverzeichnis) gestartet: &amp;lt;tt&amp;gt;piface/scripts/piface-emulator&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b. Wenn alles richtig installiert wurde, erscheint ein Fenster (unten links), bei dem die vorerst wichtigen blauen Signale am rechten Rand wie folgt angezeigt werden sollten: &lt;br /&gt;
 &lt;br /&gt;
[[Datei:RPi_PiF_em-scs.jpg|400px|Piface-Emulator im default-Zustand]] [[Datei:RPi_PiF_em_scs1.jpg|400px|Piface-Relais 1 auf &#039;1&#039; geschaltet]]&lt;br /&gt;
&lt;br /&gt;
c. Das rechte Fenster ergibt sich, wenn man nun im Fenster auf &amp;quot;Override Enable&amp;quot; und dann &amp;quot;Output Pin 1&amp;quot; klickt. Es müsste ein &amp;quot;Klick&amp;quot; vom Relais 1 zu hören sein sowie der Schaltzustand des unteren Relais 1 (das an den Output Pin 1 gekoppelt ist) auf die Verbindung der beiden unteren Anschlüsse wechseln. Zugleich wird das erste LED-Icon beim Output Pin 1 rot sowie das zugehörige LED-Icon blau.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pif_rel2.png|thumb|right|250px|Schema der Piface-Relais]]&lt;br /&gt;
d. Rechts ist der Schaltzustand der Relais, die zu Beginn genutzt werden, im Grundzustand dargestellt (jeweils der mittlere und obere Kontakt sind kurzgeschlossen, der jeweils untere Kontakt ist frei):&lt;br /&gt;
&lt;br /&gt;
e. Ein weiterer Klick auf &amp;quot;Output Pin 1&amp;quot; versetzt das Relais in den Ausgangszustand, der vor dem nächsten Schritt wieder eingestellt werden sollte.&lt;br /&gt;
&lt;br /&gt;
f. Das Relais lässt sich auch mittels eines Python-Scripts vom RPi aus ansteuern. Dazu wird folgende Textdatei &amp;quot;wandler.py&amp;quot; im Arbeitsverzeichnis abgespeichert und mit dem Befehl &amp;quot;&amp;lt;tt&amp;gt;python wandler.py&amp;lt;/tt&amp;gt;&amp;quot; gestartet:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler.py&lt;br /&gt;
&lt;br /&gt;
 from time import sleep&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
&lt;br /&gt;
 pfio.init()&lt;br /&gt;
&lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
 print &amp;quot;Strom an&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 sleep(2)&lt;br /&gt;
&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Strom aus&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Nach dem Absetzen des Befehls wechselt nun das blaue Signal an Relais 1 für 2 Sekunden und das Relais klickt entsprechend.&lt;br /&gt;
&lt;br /&gt;
== Einsatz eines Relais&#039; zur Umsetzung von Spannungsänderungen ==&lt;br /&gt;
&lt;br /&gt;
a. Ist das Relais wieder im Ausgangszustand, befestigt man nun einen der vom Breadboard führenden Drähte am unteren und einen am mittleren Relaiseingang (im Moment ist die Polarität noch egal). Zunächst sollte nichts passieren (das Relais hält diesen ja Stromkreis noch offen).&lt;br /&gt;
&lt;br /&gt;
b. Startet man aber das Script wieder (&amp;lt;tt&amp;gt;python wandler.py&amp;lt;/tt&amp;gt;) oder klickt auf &#039;Output Pin 1&#039; wird der Nutzstromkreis geschlossen. Nochmals aufgepasst: unser Nutzer erhält wieder die maximal vorgesehene Spannung - also besser vorher im Script &amp;quot;&amp;lt;tt&amp;gt;sleep(0.3)&amp;lt;/tt&amp;gt;&amp;quot; setzen und speichern.&lt;br /&gt;
&lt;br /&gt;
c. Im Prinzip ist damit die programmgesteuerte Umsetzung eines 0/1 Signals in z.B. eine 0V/15V Spannung erreicht.&lt;br /&gt;
&lt;br /&gt;
d. Da wir bald verschiedene Steuerspannungen schalten wollen, geht es jetzt darum herauszufinden, bei welcher Spannung unser Nutzgerät gerade noch bewegt wird. Dies probiert man aus - mit dem kleinsten Widerstand beginnend: indem einer der Drähte in eine freie Breadboardspalte gesteckt wird und aus dieser Spalte der Widerstand zu dem &#039;alten&#039; Steckplatz des Drahtes geführt wird. Nun startet man jeweils das Script bis der Widerstand so hoch ist, dass die Anlaufspannung beim Nutzgerätes gut ausreicht, eine Reaktion des Nutzgerät (Fahrzeug bewegt sich) zu bewirken (z.B. bei 50 Ohm beträgt der Strom im Mittel ca. 130 mA während ohne 190 mA fließen).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Ansteuerung von 3 Schaltstufen =&lt;br /&gt;
&lt;br /&gt;
== Kombination von 2 Relais ==&lt;br /&gt;
&lt;br /&gt;
[[Bild:ZrelMww2.png|thumb|right|250px|Beschaltung der Relais]] a. Die einfachste Stufe der weiteren Verschaltung erreicht man, indem der Widerstand mit einem 2. Relais überbrückt wird. Relais 1 kann dann als &#039;Hauptschalter&#039;, Relais 2 als Spannungsumschalter genutzt werden:&lt;br /&gt;
&lt;br /&gt;
b. Diese Beschaltung kann sogleich mit dem PiFace-Emulator ausprobiert werden. Damit können wir bereits 3 Schaltstufen steuern: keine, verminderte und volle Spannung.&lt;br /&gt;
&lt;br /&gt;
c. Theoretisch ließe sich auch noch eine 4. Spannungsstufe erzeugen, da mit 2 &#039;Bits&#039; (Ein/Aus bei 2 Relais) bereits 4 verschiedene Signale darstellbar sind. Beim jetzigen Aufbau werden aber lediglich die (pin1,pin2)-Signale (0,0), (1,0) und (1,1) &#039;genutzt&#039;, da Relais 1 als Hauptschalter vorgesehen ist und die Kombination (0,1) so nicht ausgewertet wird.&lt;br /&gt;
&lt;br /&gt;
== Programmgesteuerte Schaltung von 2 Relais ==&lt;br /&gt;
&lt;br /&gt;
a. Mit einem veränderten python-Script &amp;quot;wandler2.py&amp;quot; ist auch die programmgesteuerte Schaltung möglich. Dabei werden zusätzlich die Tasten 1 und 2 des PiFace genutzt, um nach dem Start des Scripts (&amp;lt;tt&amp;gt;python wandler2.py&amp;lt;/tt&amp;gt;) den Hauptschalter (Relais 1) zu steuern:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler2.py&lt;br /&gt;
 &lt;br /&gt;
 from time import sleep&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
 pfio.init()&lt;br /&gt;
 &lt;br /&gt;
 taste_1=0&lt;br /&gt;
 taste_2=0&lt;br /&gt;
 intervall_a=0.1&lt;br /&gt;
 intervall_b=0.5&lt;br /&gt;
 # Die Intervalle bestimmen die Schaltzeit für volle/verminderte Spannung&lt;br /&gt;
 &lt;br /&gt;
 print &amp;quot;Zum Start Taste 1 drücken, zum Stoppen Taste 2&amp;quot;&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 while taste_1 == 0:&lt;br /&gt;
   sleep(intervall_a)&lt;br /&gt;
   taste_1=pfio.digital_read(1)&lt;br /&gt;
&lt;br /&gt;
 # Der o.g. &#039;sleep&#039;-Befehl bestimmt die Abfragepausen für Taste 1&lt;br /&gt;
 &lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
 print &amp;quot;Strom an!&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 while taste_2 == 0:&lt;br /&gt;
   pfio.digital_write(2,1)&lt;br /&gt;
   sleep(intervall_a)&lt;br /&gt;
   pfio.digital_write(2,0)&lt;br /&gt;
   sleep(intervall_b)&lt;br /&gt;
   taste_2=pfio.digital_read(2)&lt;br /&gt;
 &lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Strom aus!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
b. Falls beim Ausprobieren von Script-Änderungen mal was schief geht, kann das Script stets auch mit der Tastenkombination (CNTRL-C) gestoppt werden. U.U. muss dann noch zusätzlich Relais 1 und/oder 2 via Emulator zurückgesetzt werden.&lt;br /&gt;
&lt;br /&gt;
c. Beim Verändern des Scripts fällt bald auf, dass die bisherige Programmsteuerung keine direkte Möglichkeit vorsieht, auf Ereignisse zu reagieren. Immerhin wird ein mechanisches Gerät gesteuert, bei dem mit Ausfällen, Fertigungstoleranzen, Umwelteinflüssen etc. zu rechnen ist (im Script wird dies bislang &#039;nur&#039; durch die Abbruchbedingung &#039;Taste 2&#039; berücksichtigt).&lt;br /&gt;
&lt;br /&gt;
== Einfache Sensor-Signale als steuernde Elemente eines Programms ==&lt;br /&gt;
&lt;br /&gt;
a. Eine wichtige Anwendung von D/A-Steuerungen ist die mögliche Reaktion dieser Steuerung auf &#039;äußere&#039; Ereignisse, die z.B. mit Hilfe von Sensoren leistbar ist.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Einf_Sens.jpg|thumb|right|250px|einfacher Sensor]]b. Für unsere Zwecke genügt zunächst ein sehr einfacher Sensor, der ein 0- oder 1-Signal liefert und idealerweise direkt am &#039;Input Pin 1&#039; des PiFace angeschlossen werden kann. So liegt beim Input Pin 1 das Signal &#039;1&#039; an, wenn eine Verbindung zu &#039;Input GND&#039; besteht.&lt;br /&gt;
Z.B. können 2 unisolierte Drähte so platziert werden, dass ein vorbeifahrendes Fahrzeug einen von ihnen genügend bewegt um den Kontakt kurze Zeit zu öffnen. Genau dann liefert dieser &#039;Sensor&#039; das Signal &#039;0&#039;. Eine - die Schwerkraft nutzende - mögliche Bauform ist rechts abgebildet ;-)&lt;br /&gt;
&lt;br /&gt;
c. Natürlich werden zusätzlich 2 isolierte Drähte benötigt, um jeden der beiden offenen Drähte geschützt mit Input Pin 1 und Input GND zu verbinden.&lt;br /&gt;
&lt;br /&gt;
d. Bei jeder Durchfahrt liefert der Sensor nun ein &#039;0&#039;-Signal, was im Script sowohl für eine Zeitmessung als auch für ein &#039;Schaltintervall-Array&#039; genutzt werden kann. Dort können abwechselnd für beide Spannungen Zeiten (die in etwa zum jeweiligen Streckenabschnitt passen) &#039;programmiert&#039; werden. Statt Taste 1 wird nun der Sensor ausgewertet (wobei Taste 1 als Sensor-Ersatz insoweit genutzt werden kann, dass sie gedrückt bleiben bzw. kurz losgelassen werden muss). Zur genaueren Zeitmessung wird noch das modul &#039;clock&#039; benötigt. &amp;quot;&amp;lt;tt&amp;gt;wandler3.py&amp;lt;/tt&amp;gt;&amp;quot; könnte also so aussehen:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler3.py&lt;br /&gt;
 &lt;br /&gt;
 from time import clock&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
 sensor_1=1&lt;br /&gt;
 sensor_2=0&lt;br /&gt;
 rundenzahl=0&lt;br /&gt;
 v_wechsel=0&lt;br /&gt;
 vorrunde=0&lt;br /&gt;
 index_zaehler=1&lt;br /&gt;
 &lt;br /&gt;
 zeit_array=[0,0.2,0.4,0.2,0.4,0.2,0.4,0.2,5,0.2,6]&lt;br /&gt;
 # dieses array enthält die sek. bis zum Spannungswechsel&lt;br /&gt;
&lt;br /&gt;
 array_laenge=9&lt;br /&gt;
 # legt fest, wie viel Werte des arrays genutzt werden sollen&lt;br /&gt;
 &lt;br /&gt;
 sensor_aus=1.3&lt;br /&gt;
 # bis der Sensor sicher in die Ruhestellung kippt, wird er nicht ausgelesen&lt;br /&gt;
  &lt;br /&gt;
 pfio.init()&lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
&lt;br /&gt;
 # das Fahrzeug wird langsam zum Start (=Sensor) bewegt&lt;br /&gt;
 while sensor_1 == 1 :&lt;br /&gt;
   sensor_1=pfio.digital_read(1)&lt;br /&gt;
  &lt;br /&gt;
 print &amp;quot;fliegender Start... zum Beenden Taste 2 drücken&amp;quot;&lt;br /&gt;
 print &amp;quot;Runde Nr., Ges.Zeit, Rundenzeit, mittlere Rundenzeit&amp;quot;&lt;br /&gt;
 start_zeit=clock()&lt;br /&gt;
 runden_start=start_zeit&lt;br /&gt;
  &lt;br /&gt;
 while sensor_2 == 0 :&lt;br /&gt;
   sensor_2=pfio.digital_read(2)&lt;br /&gt;
   v_wechsel=1-v_wechsel&lt;br /&gt;
   pfio.digital_write(2,v_wechsel)&lt;br /&gt;
   sensor_zeit=clock()&lt;br /&gt;
  &lt;br /&gt;
   while zeit_array[index_zaehler]+sensor_zeit &amp;gt; clock() :&lt;br /&gt;
     if runden_start+sensor_aus &amp;lt; clock() :&lt;br /&gt;
 &lt;br /&gt;
       sensor_1=pfio.digital_read(1) &lt;br /&gt;
       if sensor_1 == 0 :&lt;br /&gt;
         rundenzahl=rundenzahl+1&lt;br /&gt;
         runden_start=clock()&lt;br /&gt;
         zeit=runden_start-start_zeit&lt;br /&gt;
         print rundenzahl, zeit, zeit-vorrunde, zeit/rundenzahl&lt;br /&gt;
         vorrunde=zeit&lt;br /&gt;
         sensor_zeit=0&lt;br /&gt;
         index_zaehler=0&lt;br /&gt;
         v_wechsel=0&lt;br /&gt;
  &lt;br /&gt;
   index_zaehler=index_zaehler+1&lt;br /&gt;
   if index_zaehler &amp;gt; array_laenge :&lt;br /&gt;
     sensor_2=1&lt;br /&gt;
     print &amp;quot;array-Ende erreicht!&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Outp 1 &amp;amp; 2 auf 0!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wird das Array-Ende erreicht, wurden entweder zu wenige Einträge vorgesehen oder es befindet sich kein Fahrzeug (mehr) auf der Strecke, das den Sensor und damit des Zurücksetzen des Arrays auslösen konnte.&lt;br /&gt;
&lt;br /&gt;
e. Das Array ist an die jeweilige Strecke anzupassen, wobei der vorderste Eintrag ungenutzt bleibt und dann mit der Dauer für maximale Spannung begonnen wird. Solange man mit Relais arbeitet, sollten die Schaltzeiten nicht zu kurz sein (&amp;gt;0.1 sek.), da diese eine gewisse mechanische Trägheit besitzen.&lt;br /&gt;
&lt;br /&gt;
f. Eben diese mechanische Beschaffenheit der Relais (Verschleiß) ist auch ein guter Grund, auf &#039;volle&#039; digitale Signalumwandlung umzustellen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Optokoppler als Ersatz für Relais =&lt;br /&gt;
&lt;br /&gt;
Ähnlich wie ein Relais dient ein [[Optokoppler]] dazu, eine Signalübertragung zwischen zwei getrennten Stromkreisen zu ermöglichen. Bei diesem Projekt liegt der Einsatz von Optokopplern nahe, da sie schneller schalten und keine beweglichen Teile besitzen. Für unsere Zwecke benötigen wir nun als zusätzliche Elemente: Optokoppler (CNY 17-4), npn-[[Transistor]]en (BC 337-40) zur Signalverstärkung sowie einige Widerstände im Bereich von 2k und 400 Ohm. &lt;br /&gt;
&lt;br /&gt;
== Kaskadierung von Transistoren zur Signalverstärkung ==&lt;br /&gt;
&lt;br /&gt;
a. Entsprechend Schritt 2.4.d. (ein Relais bei 50 Ohm) wird zunächst ein [[Optokoppler]] eingesetzt, dessen Signal durch einen Transistor verstärkt wird, um die &#039;Grundspannung&#039; zu schalten (Pin 3 und 6 beim Optokoppler sollten unbeschaltet bleiben, allein der &#039;Lichtstrom&#039; reicht für eine Ansteuerung aus):&lt;br /&gt;
&lt;br /&gt;
[[Bild:PiF_CNY_BC_1.png|400px|Optokoppler mit Transistor]]&lt;br /&gt;
&lt;br /&gt;
b. Da immer mit einer gewissen Toleranz bei allen Komponenten zu rechnen ist, kann es sein, dass u.U. die Widerstände etwas größer oder kleiner gewählt werden müssen. Beim Ausprobieren sollte man hier in 10% Schritten variieren.&lt;br /&gt;
&lt;br /&gt;
c. Bei Austesten mit Emulator oder Script ist auch zu beachten, dass nun &#039;Output Pin 8&#039; genutzt wird, da dieser nicht mit den Relais verschaltet ist.&lt;br /&gt;
&lt;br /&gt;
== Umsetzung von 3 Schaltstufen mit Optokopplern ==&lt;br /&gt;
&lt;br /&gt;
a. Entsprechend dem Vorgehen beim Relais kann nun auch der kleine Widerstand zusätzlich beschaltet werden um seine gesteuerte Überbrückung zu ermöglichen. Da hier eine relativ geringe Spannung aufgeschaltet wird, kann zu Beginn eine Diode eingesetzt werden, die die Schaltstufe &#039;maximale Spannung&#039; anzeigt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:SmPiFu2ou2T.png|400px|Kombination von 2 Optokopplern]]&lt;br /&gt;
&lt;br /&gt;
b. Vor dem Testen ist wieder zu beachten, dass nun zusätzlich &#039;Output Pin 7&#039; genutzt wird (statt Output Pin 2).&lt;br /&gt;
&lt;br /&gt;
c. Neben dem Weglassen der Diode (was die Maximalgeschwindigkeit leicht erhöht), können auch statt der 400 Ohm Widerstände 1k-Werte oder höher gewählt werden, wenn dadurch der jeweilige Basisstrom noch hoch genug ist. Im vorliegenden Fall war erst ab 400 Ohm keine weitere Tempoerhöhung mehr feststellbar.&lt;br /&gt;
&lt;br /&gt;
d. Eine mögliche Realisierung sieht so aus: http://youtu.be/xQ7N-PrIULk&lt;br /&gt;
&lt;br /&gt;
== Zusätzliche Erhöhung der Schaltstufen bei D/A-Wandlern ==&lt;br /&gt;
&lt;br /&gt;
a. Zwar benötigen wir in unserem speziellen Beispiel eine &#039;Grundspannung&#039;, die sich dahingehend auswirkt, dass - wie unter 3.1.c. erwähnt - eine Signalkombination nicht ausgewertet wird, aber mit jeder weiteren Schaltstufe würde sich dieses Problem (theoretisch) relativieren, da bei geschickter Auswahl der Widerstände (z.B. im Verhältnis 1 zu 2) jeweils eine Verdoppelung der Kombinationsmöglichkeiten erreichbar ist.&lt;br /&gt;
&lt;br /&gt;
b. Wird hier der 50 Ohm Widerstand asymmetrisch geteilt (z.B. 15 + 35 Ohm, s.a. [[Spannungsteiler]]) um dort ein weiteres Signal umsetzen zu können, ergeben sich direkt folgende 5 Schaltstufen (aus, 50, 35, 15 und 0 Ohm) u.s.w.:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Sm3ou3t2.png|400px|Erhöhung der Schaltstufen]]&lt;br /&gt;
&lt;br /&gt;
c. Zur Ansteuerung dieser Schaltstufen wäre das Script so zu ändern, dass nun zwischen mehr als 2 Stufen gewechselt werden kann und im Array entsprechende Zusatzdaten vorgegeben und ausgelesen werden. Mehr als diese Stufen sind im konkreten Fall aber nicht sinnvoll, da die entstehende Verlustleistung in der Schaltung die maximal verfügbare Leistung reduziert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Weiterführende Ideen =&lt;br /&gt;
&lt;br /&gt;
Die Ausbaumöglichkeiten dieses Projektes sind vielfältig:&lt;br /&gt;
&lt;br /&gt;
== Hardwareseitige Ausbauvarianten ==&lt;br /&gt;
&lt;br /&gt;
- beispielhafte Umsetzung einer differenzierten Abstufung mittels einer logarithmischen Einteilung oder eines möglichst oft durch 2 teilbaren Anfangswertes und der Teiler (640 Ohm, 320, 160...);&lt;br /&gt;
&lt;br /&gt;
- Nachbau des Projekts mit einem Mikrocontroller (ggf. mit LCD-Anzeige);&lt;br /&gt;
&lt;br /&gt;
- Umbau der Steuerung mit dem Ziel, sie direkt an die GPIO-Pins des RPi anzuschließen;&lt;br /&gt;
&lt;br /&gt;
- Entwurf einer Zusatzschaltung, die in diesem Beispiel eine Rückmeldung liefert, ob ein Verbraucher aktiv ist oder nicht (Fahrzeug noch auf der Strecke?);&lt;br /&gt;
&lt;br /&gt;
- Entwurf einer Zusatzschaltung, die erkennt wie viel Strom fliesst: damit wären Rückschlüsse auf den Streckenverlauf möglich (Kurve=etwas mehr Strom, Steigung=noch mehr Strom nötig, etc.) und auch eine programmgesteuerte Optimierung der Array-Schaltzeiten dankbar; &lt;br /&gt;
&lt;br /&gt;
- Einsatz anderer Sensortechniken und/oder mehrerer Sensoren zur Optimierung der Schnelligkeit oder parallelen Steuerung eines 2. Fahrzeuges;&lt;br /&gt;
&lt;br /&gt;
== Softwareseitige Ausbauvarianten ==&lt;br /&gt;
&lt;br /&gt;
- Optimierung des Scripts, indem die Sensor-Abfrage über einen &#039;Listener&#039; umgesetzt wird;&lt;br /&gt;
&lt;br /&gt;
- Erweiterung des Scripts um eine GUI mit Hilfe der python-lib Tkinter, um einen Nutzerzugriff auf das Steuerarray und/oder eine &#039;Verwaltung&#039; mehrerer Fahrzeuge;&lt;br /&gt;
&lt;br /&gt;
- Einbindung eines Web-Interface um eine &#039;Fernsteuerung&#039; zu ermöglichen...&lt;br /&gt;
&lt;br /&gt;
...in jedem Fall: viel Spaß beim Basteln!&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [http://hackaday.com/2013/01/23/replacement-controllers-for-slot-car-racing/ ähnliches Projekt bei &#039;hackaday&#039;] &lt;br /&gt;
* [https://docs.google.com/folder/d/0B-UAZ9CyJCLGQjJ3RDlqa2pqaDg/edit?pli=1&amp;amp;docId=0B-UAZ9CyJCLGNmpMeVpyYlZJUWc Relaisschaltung mit pädagogischer Erweiterung der Universität Manchester (englischspr.)]&lt;br /&gt;
* [http://elinux.org/RPi_Projects/PiFace_controlling_a_slot-car paralleler englischsp. Bericht des Autors zum RPi mit anderem Schwerpunkt] &lt;br /&gt;
* [http://elinux.org/RPi_Projects englischsp. Projektliste zum RPi]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/GhostCarProjekt Verlagerung der gesamten Steuerelektronik ins Fahrzeug]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Raspberry Pi]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Mknot9</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=RPi_als_D/A-Wandler&amp;diff=74408</id>
		<title>RPi als D/A-Wandler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=RPi_als_D/A-Wandler&amp;diff=74408"/>
		<updated>2013-03-08T18:21:26Z</updated>

		<summary type="html">&lt;p&gt;Mknot9: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von mknot9&#039;&#039; (M. Knoop)&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
Oft wird ein Computer &#039;nur&#039; genutzt um darauf Software ablaufen zu lassen. Dessen Möglichkeit zur Steuerung von elektrischen und mechanischen Geräten wird dabei leicht übersehen.&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel richtet sich daher an Einsteiger, die mit dem [[Raspberry Pi]] (&#039;RPi&#039;) Grundlagen der Computersteuerung mit Relais und [[Spannungsteiler]]n nachvollziehen möchten. Es wird an einem konkreten Beispiel schrittweise dargestellt, wie mittels eines D/A-Wandlers (Digital/Analog-Wandler = Umwandlung von digitalen 1/0 Signale) die Steuerung einer stufenweise veränderbaren Ausgangsspannung aufgebaut werden kann.&lt;br /&gt;
&lt;br /&gt;
= Verwendete Hardware =&lt;br /&gt;
&lt;br /&gt;
== RPi in Kombination mit der &#039;PiFace&#039;-Karte als Bastelplattform ==&lt;br /&gt;
&lt;br /&gt;
Dank der einfachen Bauweise bietet sich der RPi mit seinen frei zugänglichen GPIO-Pins als ideale Bastelplattform an. Trotzdem kann es beim anfänglichen Experimentieren mit Schaltungen öfters zu kleinen Fehlern kommen, die schlimmstenfalls die empfindliche Elektronik des RPi dauerhaft beschädigen können.&lt;br /&gt;
&lt;br /&gt;
Daher wird bei diesem Projekt zusätzlich mit der &#039;PiFace[http://elinux.org/RPi_Expansion_Boards#Piface]&#039;-Karte gearbeitet, die man auf die GPIO-Pins stecken kann. Diese Erweiterungskarte verschaltet die GPIO-Pins auf je 8 digitale Ein- und Ausgänge sowie 2 Relais, die eine galvanische Trennung von Stromkreisen ermöglichen. Damit besteht auch für Einsteiger ein gewisser Schutz für die Steuerelektronik des RPi.&lt;br /&gt;
&lt;br /&gt;
Auch im weiteren Verlauf dieser Einführung soll noch auf eine Trennung der Stromkreise Wert gelegt werden, so dass für erste digitale Schaltexperimente ein Optokoppler genutzt wird. Die spätere Nutzung der &#039;Input Pins&#039; des PiFace um eine Steuerung der D/A-Wandlung durch bestimmte Ereignisse zu ermöglichen, erfolgt ebenfalls passiv.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Auch wenn mit vermeintlich &#039;sicheren&#039; Transformatoren gebastelt wird, muss stets bedacht werden, dass diese an einem 230V-Stromnetz betrieben werden und man eher einmal mehr als weniger prüfen sollte, ob man durch eventuelle Fehler mit lebensgefährlicher Spannung in Berührung kommt!&lt;br /&gt;
&lt;br /&gt;
== Auswahl eines Beispielprojektes ==&lt;br /&gt;
&lt;br /&gt;
Günstige Möglichkeiten ein Gerät zu finden, das mit analogen Spannungen arbeitet, bieten sich u.a. im Spielzeugbereich. Im Grunde eignet sich alles, was mit Batterien oder mit Gleichspannungen unter 24 V betrieben wird.&lt;br /&gt;
&lt;br /&gt;
Da jedoch ein Ziel das Steuern von analogen Spannungen ist, bietet sich insbesondere alles an, bei dem [[Potentiometer]] eingesetzt werden. Einen dieser &#039;Handregler&#039; sollte man übrig haben, da er von seinem Anschlusskabel abgetrennt werden muss, um den oft proprietären Steckanschluss nutzen zu können. In diesem Sinne wird hier eine handelsübliche Spielzeug-Autorennbahn mit Potentiometer-Handreglern genutzt.&lt;br /&gt;
&lt;br /&gt;
== Sonstige Bauteile ==&lt;br /&gt;
&lt;br /&gt;
Für die ersten Grundlagen (s. Teile 2 &amp;amp; 3) genügen bereits rund 2 m isolierter Draht, der nicht aus verdrillten feinen Adern (Litze) bestehen sollte, 50 cm nicht-isolierter Draht, einige niederohmige Widerstände (z.B. je 2 mal 100 Ohm, 80, 60, sowie 20) und ein &#039;Experimentierbrett&#039; (engl. [[Breadboard]]).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Grundlagen und Vorbereitung des Projekts =&lt;br /&gt;
&lt;br /&gt;
== Umwandlung von 1/0 zu Ein/Aus mit einem Relais ==&lt;br /&gt;
&lt;br /&gt;
Vom Prinzip her ist jede Umwandlung eines digitalen 0 oder 1 Signals (das über eine bestimmte Spannungsdifferenz festgelegt ist) in eine (nutzbare) Spannung bereits eine D/A-Wandlung. Dies wird schlicht so realisiert, dass mit einer Eingabe am RPi die Nutzspannung des &#039;Verbrauchers&#039; zunächst einfach an- und ausgeschaltet wird.&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung der zu steuernden Hardware ==&lt;br /&gt;
&lt;br /&gt;
a. Um Fehlerquellen auszuschließen sollte zunächst (und ggf. auch später!) kurz getestet werden, ob der vorhandene Regler wie erwartet funktioniert.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pif_Con9.jpg|thumb|right|400px|Fixierung der Reglerkabel]]&lt;br /&gt;
b. Nach dem Trennen des Reglers von der Einspeisung (und ggf. Ziehen des Netzsteckers) muss das Regler-Kabel abgeschnitten werden (eher nahe beim Regler, da das Kabel bald bis zum Breadboard reichen soll). Die neuen Enden des Einspeiseteils werden abisoliert und auf dem Breadboard diagonal zueinander mit einigen Spalten Abstand fixiert. Auch können bereits die Drähte, die später zum RPi führen, jeweils in den passenden kontaktführenden Spalten eingesteckt werden, z. B. wie rechts zu sehen (die nicht beschrifteten Drähte können vorerst ignoriert werden):&lt;br /&gt;
&lt;br /&gt;
c. Nun bietet sich eine gute Gelegenheit die maximale Spannung am Nutzgerät zu messen. Man verbindet das Regler-Kabel (nun ohne Regler) wieder mit der Einspeisung und die offenen Enden der Drähte mit dem Messgerät, bei dem zunächst ein Messbereich von ca. 10-50 Volt gewählt werden sollte. Dies sollte dann z.B. 14,8 V anzeigen. Natürlich können auch die beiden offenen Enden einen kleinen Moment kurz geschlossen werden, man sollte aber bedenken, dass das zu regelnde Nutzgerät dann die maximal vorgesehene Spannung erhält (hier: maximales Tempo).&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung des RPi ==&lt;br /&gt;
&lt;br /&gt;
Es wird davon ausgegangen, dass entsprechend des zugehörigen &#039;manual&#039; das PiFace bereits auf den RPi gesteckt ist, die nötigen python-Bibliotheken installiert sind und man sich im Terminal-Arbeitsverzeichnis &#039;pi&#039; befindet.&lt;br /&gt;
&lt;br /&gt;
a. Zunächst wird der PiFace-Emulator (im Terminal direkt aus dem Arbeitsverzeichnis) gestartet: &amp;lt;tt&amp;gt;piface/scripts/piface-emulator&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b. Wenn alles richtig installiert wurde, erscheint ein Fenster (unten links), bei dem die vorerst wichtigen blauen Signale am rechten Rand wie folgt angezeigt werden sollten: &lt;br /&gt;
 &lt;br /&gt;
[[Datei:RPi_PiF_em-scs.jpg|400px|Piface-Emulator im default-Zustand]] [[Datei:RPi_PiF_em_scs1.jpg|400px|Piface-Relais 1 auf &#039;1&#039; geschaltet]]&lt;br /&gt;
&lt;br /&gt;
c. Das rechte Fenster ergibt sich, wenn man nun im Fenster auf &amp;quot;Override Enable&amp;quot; und dann &amp;quot;Output Pin 1&amp;quot; klickt. Es müsste ein &amp;quot;Klick&amp;quot; vom Relais 1 zu hören sein sowie der Schaltzustand des unteren Relais 1 (das an den Output Pin 1 gekoppelt ist) auf die Verbindung der beiden unteren Anschlüsse wechseln. Zugleich wird das erste LED-Icon beim Output Pin 1 rot sowie das zugehörige LED-Icon blau.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pif_rel2.png|thumb|right|250px|Schema der Piface-Relais]]&lt;br /&gt;
d. Rechts ist der Schaltzustand der Relais, die zu Beginn genutzt werden, im Grundzustand dargestellt (jeweils der mittlere und obere Kontakt sind kurzgeschlossen, der jeweils untere Kontakt ist frei):&lt;br /&gt;
&lt;br /&gt;
e. Ein weiterer Klick auf &amp;quot;Output Pin 1&amp;quot; versetzt das Relais in den Ausgangszustand, der vor dem nächsten Schritt wieder eingestellt werden sollte.&lt;br /&gt;
&lt;br /&gt;
f. Das Relais lässt sich auch mittels eines Python-Scripts vom RPi aus ansteuern. Dazu wird folgende Textdatei &amp;quot;wandler.py&amp;quot; im Arbeitsverzeichnis abgespeichert und mit dem Befehl &amp;quot;&amp;lt;tt&amp;gt;python wandler.py&amp;lt;/tt&amp;gt;&amp;quot; gestartet:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler.py&lt;br /&gt;
&lt;br /&gt;
 from time import sleep&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
&lt;br /&gt;
 pfio.init()&lt;br /&gt;
&lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
 print &amp;quot;Strom an&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 sleep(2)&lt;br /&gt;
&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Strom aus&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Nach dem Absetzen des Befehls wechselt nun das blaue Signal an Relais 1 für 2 Sekunden und das Relais klickt entsprechend.&lt;br /&gt;
&lt;br /&gt;
== Einsatz eines Relais&#039; zur Umsetzung von Spannungsänderungen ==&lt;br /&gt;
&lt;br /&gt;
a. Ist das Relais wieder im Ausgangszustand, befestigt man nun einen der vom Breadboard führenden Drähte am unteren und einen am mittleren Relaiseingang (im Moment ist die Polarität noch egal). Zunächst sollte nichts passieren (das Relais hält diesen ja Stromkreis noch offen).&lt;br /&gt;
&lt;br /&gt;
b. Startet man aber das Script wieder (&amp;lt;tt&amp;gt;python wandler.py&amp;lt;/tt&amp;gt;) oder klickt auf &#039;Output Pin 1&#039; wird der Nutzstromkreis geschlossen. Nochmals aufgepasst: unser Nutzer erhält wieder die maximal vorgesehene Spannung - also besser vorher im Script &amp;quot;&amp;lt;tt&amp;gt;sleep(0.3)&amp;lt;/tt&amp;gt;&amp;quot; setzen und speichern.&lt;br /&gt;
&lt;br /&gt;
c. Im Prinzip ist damit die programmgesteuerte Umsetzung eines 0/1 Signals in z.B. eine 0V/15V Spannung erreicht.&lt;br /&gt;
&lt;br /&gt;
d. Da wir bald verschiedene Steuerspannungen schalten wollen, geht es jetzt darum herauszufinden, bei welcher Spannung unser Nutzgerät gerade noch bewegt wird. Dies probiert man aus - mit dem kleinsten Widerstand beginnend: indem einer der Drähte in eine freie Breadboardspalte gesteckt wird und aus dieser Spalte der Widerstand zu dem &#039;alten&#039; Steckplatz des Drahtes geführt wird. Nun startet man jeweils das Script bis der Widerstand so hoch ist, dass die Anlaufspannung beim Nutzgerätes gut ausreicht, eine Reaktion des Nutzgerät (Fahrzeug bewegt sich) zu bewirken (z.B. bei 50 Ohm beträgt der Strom im Mittel ca. 130 mA während ohne 190 mA fließen).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Ansteuerung von 3 Schaltstufen =&lt;br /&gt;
&lt;br /&gt;
== Kombination von 2 Relais ==&lt;br /&gt;
&lt;br /&gt;
[[Bild:ZrelMww2.png|thumb|right|250px|Beschaltung der Relais]] a. Die einfachste Stufe der weiteren Verschaltung erreicht man, indem der Widerstand mit einem 2. Relais überbrückt wird. Relais 1 kann dann als &#039;Hauptschalter&#039;, Relais 2 als Spannungsumschalter genutzt werden:&lt;br /&gt;
&lt;br /&gt;
b. Diese Beschaltung kann sogleich mit dem PiFace-Emulator ausprobiert werden. Damit können wir bereits 3 Schaltstufen steuern: keine, verminderte und volle Spannung.&lt;br /&gt;
&lt;br /&gt;
c. Theoretisch ließe sich auch noch eine 4. Spannungsstufe erzeugen, da mit 2 &#039;Bits&#039; (Ein/Aus bei 2 Relais) bereits 4 verschiedene Signale darstellbar sind. Beim jetzigen Aufbau werden aber lediglich die (pin1,pin2)-Signale (0,0), (1,0) und (1,1) &#039;genutzt&#039;, da Relais 1 als Hauptschalter vorgesehen ist und die Kombination (0,1) so nicht ausgewertet wird.&lt;br /&gt;
&lt;br /&gt;
== Programmgesteuerte Schaltung von 2 Relais ==&lt;br /&gt;
&lt;br /&gt;
a. Mit einem veränderten python-Script &amp;quot;wandler2.py&amp;quot; ist auch die programmgesteuerte Schaltung möglich. Dabei werden zusätzlich die Tasten 1 und 2 des PiFace genutzt, um nach dem Start des Scripts (&amp;lt;tt&amp;gt;python wandler2.py&amp;lt;/tt&amp;gt;) den Hauptschalter (Relais 1) zu steuern:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler2.py&lt;br /&gt;
 &lt;br /&gt;
 from time import sleep&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
 pfio.init()&lt;br /&gt;
 &lt;br /&gt;
 taste_1=0&lt;br /&gt;
 taste_2=0&lt;br /&gt;
 intervall_a=0.1&lt;br /&gt;
 intervall_b=0.5&lt;br /&gt;
 # Die Intervalle bestimmen die Schaltzeit für volle/verminderte Spannung&lt;br /&gt;
 &lt;br /&gt;
 print &amp;quot;Zum Start Taste 1 drücken, zum Stoppen Taste 2&amp;quot;&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 while taste_1 == 0:&lt;br /&gt;
   sleep(intervall_a)&lt;br /&gt;
   taste_1=pfio.digital_read(1)&lt;br /&gt;
&lt;br /&gt;
 # Der o.g. &#039;sleep&#039;-Befehl bestimmt die Abfragepausen für Taste 1&lt;br /&gt;
 &lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
 print &amp;quot;Strom an!&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 while taste_2 == 0:&lt;br /&gt;
   pfio.digital_write(2,1)&lt;br /&gt;
   sleep(intervall_a)&lt;br /&gt;
   pfio.digital_write(2,0)&lt;br /&gt;
   sleep(intervall_b)&lt;br /&gt;
   taste_2=pfio.digital_read(2)&lt;br /&gt;
 &lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Strom aus!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
b. Falls beim Ausprobieren von Script-Änderungen mal was schief geht, kann das Script stets auch mit der Tastenkombination (CNTRL-C) gestoppt werden. U.U. muss dann noch zusätzlich Relais 1 und/oder 2 via Emulator zurückgesetzt werden.&lt;br /&gt;
&lt;br /&gt;
c. Beim Verändern des Scripts fällt bald auf, dass die bisherige Programmsteuerung keine direkte Möglichkeit vorsieht, auf Ereignisse zu reagieren. Immerhin wird ein mechanisches Gerät gesteuert, bei dem mit Ausfällen, Fertigungstoleranzen, Umwelteinflüssen etc. zu rechnen ist (im Script wird dies bislang &#039;nur&#039; durch die Abbruchbedingung &#039;Taste 2&#039; berücksichtigt).&lt;br /&gt;
&lt;br /&gt;
== Einfache Sensor-Signale als steuernde Elemente eines Programms ==&lt;br /&gt;
&lt;br /&gt;
a. Eine wichtige Anwendung von D/A-Steuerungen ist die mögliche Reaktion dieser Steuerung auf &#039;äußere&#039; Ereignisse, die z.B. mit Hilfe von Sensoren leistbar ist.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Einf_Sens.jpg|thumb|right|250px|einfacher Sensor]]b. Für unsere Zwecke genügt zunächst ein sehr einfacher Sensor, der ein 0- oder 1-Signal liefert und idealerweise direkt am &#039;Input Pin 1&#039; des PiFace angeschlossen werden kann. So liegt beim Input Pin 1 das Signal &#039;1&#039; an, wenn eine Verbindung zu &#039;Input GND&#039; besteht.&lt;br /&gt;
Z.B. können 2 unisolierte Drähte so platziert werden, dass ein vorbeifahrendes Fahrzeug einen von ihnen genügend bewegt um den Kontakt kurze Zeit zu öffnen. Genau dann liefert dieser &#039;Sensor&#039; das Signal &#039;0&#039;. Eine - die Schwerkraft nutzende - mögliche Bauform ist rechts abgebildet ;-)&lt;br /&gt;
&lt;br /&gt;
c. Natürlich werden zusätzlich 2 isolierte Drähte benötigt, um jeden der beiden offenen Drähte geschützt mit Input Pin 1 und Input GND zu verbinden.&lt;br /&gt;
&lt;br /&gt;
d. Bei jeder Durchfahrt liefert der Sensor nun ein &#039;0&#039;-Signal, was im Script sowohl für eine Zeitmessung als auch für ein &#039;Schaltintervall-Array&#039; genutzt werden kann. Dort können abwechselnd für beide Spannungen Zeiten (die in etwa zum jeweiligen Streckenabschnitt passen) &#039;programmiert&#039; werden. Statt Taste 1 wird nun der Sensor ausgewertet (wobei Taste 1 als Sensor-Ersatz insoweit genutzt werden kann, dass sie gedrückt bleiben bzw. kurz losgelassen werden muss). Zur genaueren Zeitmessung wird noch das modul &#039;clock&#039; benötigt. &amp;quot;&amp;lt;tt&amp;gt;wandler3.py&amp;lt;/tt&amp;gt;&amp;quot; könnte also so aussehen:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler3.py&lt;br /&gt;
 &lt;br /&gt;
 from time import clock&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
 sensor_1=1&lt;br /&gt;
 sensor_2=0&lt;br /&gt;
 rundenzahl=0&lt;br /&gt;
 v_wechsel=0&lt;br /&gt;
 vorrunde=0&lt;br /&gt;
 index_zaehler=1&lt;br /&gt;
 &lt;br /&gt;
 zeit_array=[0,0.2,0.4,0.2,0.4,0.2,0.4,0.2,5,0.2,6]&lt;br /&gt;
 # dieses array enthält die sek. bis zum Spannungswechsel&lt;br /&gt;
&lt;br /&gt;
 array_laenge=9&lt;br /&gt;
 # legt fest, wie viel Werte des arrays genutzt werden sollen&lt;br /&gt;
 &lt;br /&gt;
 sensor_aus=1.3&lt;br /&gt;
 # bis der Sensor sicher in die Ruhestellung kippt, wird er nicht ausgelesen&lt;br /&gt;
  &lt;br /&gt;
 pfio.init()&lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
&lt;br /&gt;
 # das Fahrzeug wird langsam zum Start (=Sensor) bewegt&lt;br /&gt;
 while sensor_1 == 1 :&lt;br /&gt;
   sensor_1=pfio.digital_read(1)&lt;br /&gt;
  &lt;br /&gt;
 print &amp;quot;fliegender Start... zum Beenden Taste 2 drücken&amp;quot;&lt;br /&gt;
 print &amp;quot;Runde Nr., Ges.Zeit, Rundenzeit, mittlere Rundenzeit&amp;quot;&lt;br /&gt;
 start_zeit=clock()&lt;br /&gt;
 runden_start=start_zeit&lt;br /&gt;
  &lt;br /&gt;
 while sensor_2 == 0 :&lt;br /&gt;
   sensor_2=pfio.digital_read(2)&lt;br /&gt;
   v_wechsel=1-v_wechsel&lt;br /&gt;
   pfio.digital_write(2,v_wechsel)&lt;br /&gt;
   sensor_zeit=clock()&lt;br /&gt;
  &lt;br /&gt;
   while zeit_array[index_zaehler]+sensor_zeit &amp;gt; clock() :&lt;br /&gt;
     if runden_start+sensor_aus &amp;lt; clock() :&lt;br /&gt;
 &lt;br /&gt;
       sensor_1=pfio.digital_read(1) &lt;br /&gt;
       if sensor_1 == 0 :&lt;br /&gt;
         rundenzahl=rundenzahl+1&lt;br /&gt;
         runden_start=clock()&lt;br /&gt;
         zeit=runden_start-start_zeit&lt;br /&gt;
         print rundenzahl, zeit, zeit-vorrunde, zeit/rundenzahl&lt;br /&gt;
         vorrunde=zeit&lt;br /&gt;
         sensor_zeit=0&lt;br /&gt;
         index_zaehler=0&lt;br /&gt;
         v_wechsel=0&lt;br /&gt;
  &lt;br /&gt;
   index_zaehler=index_zaehler+1&lt;br /&gt;
   if index_zaehler &amp;gt; array_laenge :&lt;br /&gt;
     sensor_2=1&lt;br /&gt;
     print &amp;quot;array-Ende erreicht!&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Outp 1 &amp;amp; 2 auf 0!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wird das Array-Ende erreicht, wurden entweder zu wenige Einträge vorgesehen oder es befindet sich kein Fahrzeug (mehr) auf der Strecke, das den Sensor und damit des Zurücksetzen des Arrays auslösen konnte.&lt;br /&gt;
&lt;br /&gt;
e. Das Array ist an die jeweilige Strecke anzupassen, wobei der vorderste Eintrag ungenutzt bleibt und dann mit der Dauer für maximale Spannung begonnen wird. Solange man mit Relais arbeitet, sollten die Schaltzeiten nicht zu kurz sein (&amp;gt;0.1 sek.), da diese eine gewisse mechanische Trägheit besitzen.&lt;br /&gt;
&lt;br /&gt;
f. Eben diese mechanische Beschaffenheit der Relais (Verschleiß) ist auch ein guter Grund, auf &#039;volle&#039; digitale Signalumwandlung umzustellen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Optokoppler als Ersatz für Relais =&lt;br /&gt;
&lt;br /&gt;
Ähnlich wie ein Relais dient ein [[Optokoppler]] dazu, eine Signalübertragung zwischen zwei getrennten Stromkreisen zu ermöglichen. Bei diesem Projekt liegt der Einsatz von Optokopplern nahe, da sie schneller schalten und keine beweglichen Teile besitzen. Für unsere Zwecke benötigen wir nun als zusätzliche Elemente: Optokoppler (CNY 17-4), npn-[[Transistor]]en (BC 337-40) zur Signalverstärkung sowie einige Widerstände im Bereich von 2k und 400 Ohm. &lt;br /&gt;
&lt;br /&gt;
== Kaskadierung von Transistoren zur Signalverstärkung ==&lt;br /&gt;
&lt;br /&gt;
a. Entsprechend Schritt 2.4.d. (ein Relais bei 50 Ohm) wird zunächst ein [[Optokoppler]] eingesetzt, dessen Signal durch einen Transistor verstärkt wird, um die &#039;Grundspannung&#039; zu schalten (Pin 3 und 6 beim Optokoppler sollten unbeschaltet bleiben, allein der &#039;Lichtstrom&#039; reicht für eine Ansteuerung aus):&lt;br /&gt;
&lt;br /&gt;
[[Bild:PiF_CNY_BC_1.png|400px|Optokoppler mit Transistor]]&lt;br /&gt;
&lt;br /&gt;
b. Da immer mit einer gewissen Toleranz bei allen Komponenten zu rechnen ist, kann es sein, dass u.U. die Widerstände etwas größer oder kleiner gewählt werden müssen. Beim Ausprobieren sollte man hier in 10% Schritten variieren.&lt;br /&gt;
&lt;br /&gt;
c. Bei Austesten mit Emulator oder Script ist auch zu beachten, dass nun &#039;Output Pin 8&#039; genutzt wird, da dieser nicht mit den Relais verschaltet ist.&lt;br /&gt;
&lt;br /&gt;
== Umsetzung von 3 Schaltstufen mit Optokopplern ==&lt;br /&gt;
&lt;br /&gt;
a. Entsprechend dem Vorgehen beim Relais kann nun auch der kleine Widerstand zusätzlich beschaltet werden um seine gesteuerte Überbrückung zu ermöglichen. Da hier eine relativ geringe Spannung aufgeschaltet wird, kann zu Beginn eine Diode eingesetzt werden, die die Schaltstufe &#039;maximale Spannung&#039; anzeigt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:SmPiFu2ou2T.png|400px|Kombination von 2 Optokopplern]]&lt;br /&gt;
&lt;br /&gt;
b. Vor dem Testen ist wieder zu beachten, dass nun zusätzlich &#039;Output Pin 7&#039; genutzt wird (statt Output Pin 2).&lt;br /&gt;
&lt;br /&gt;
c. Neben dem Weglassen der Diode (was die Maximalgeschwindigkeit leicht erhöht), können auch statt der 400 Ohm Widerstände 1k-Werte oder höher gewählt werden, wenn dadurch der jeweilige Basisstrom noch hoch genug ist. Im vorliegenden Fall war erst ab 400 Ohm keine weitere Tempoerhöhung mehr feststellbar.&lt;br /&gt;
&lt;br /&gt;
d. Eine mögliche Realisierung sieht so aus: http://youtu.be/xQ7N-PrIULk&lt;br /&gt;
&lt;br /&gt;
== Zusätzliche Erhöhung der Schaltstufen bei D/A-Wandlern ==&lt;br /&gt;
&lt;br /&gt;
a. Zwar benötigen wir in unserem speziellen Beispiel eine &#039;Grundspannung&#039;, die sich dahingehend auswirkt, dass - wie unter 3.1.c. erwähnt - eine Signalkombination nicht ausgewertet wird, aber mit jeder weiteren Schaltstufe würde sich dieses Problem (theoretisch) relativieren, da bei geschickter Auswahl der Widerstände (z.B. im Verhältnis 1 zu 2) jeweils eine Verdoppelung der Kombinationsmöglichkeiten erreichbar ist.&lt;br /&gt;
&lt;br /&gt;
b. Wird hier der 50 Ohm Widerstand asymmetrisch geteilt (z.B. 15 + 35 Ohm, s.a. [[Spannungsteiler]]) um dort ein weiteres Signal umsetzen zu können, ergeben sich direkt folgende 5 Schaltstufen (aus, 50, 35, 15 und 0 Ohm) u.s.w.:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Sm3ou3t2.png|400px|Erhöhung der Schaltstufen]]&lt;br /&gt;
&lt;br /&gt;
c. Zur Ansteuerung dieser Schaltstufen wäre das Script so zu ändern, dass nun zwischen mehr als 2 Stufen gewechselt werden kann und im Array entsprechende Zusatzdaten vorgegeben und ausgelesen werden. Mehr als diese Stufen sind im konkreten Fall aber nicht sinnvoll, da die entstehende Verlustleistung in der Schaltung die maximal verfügbare Leistung reduziert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Weiterführende Ideen =&lt;br /&gt;
&lt;br /&gt;
Die Ausbaumöglichkeiten dieses Projektes sind vielfältig:&lt;br /&gt;
&lt;br /&gt;
== Hardwareseitige Ausbauvarianten ==&lt;br /&gt;
&lt;br /&gt;
- beispielhafte Umsetzung einer differenzierten Abstufung mittels einer logarithmischen Einteilung oder eines möglichst oft durch 2 teilbaren Anfangswertes und der Teiler (640 Ohm, 320, 160...);&lt;br /&gt;
&lt;br /&gt;
- Nachbau des Projekts mit einem Mikrocontroller (ggf. mit LCD-Anzeige);&lt;br /&gt;
&lt;br /&gt;
- Umbau der Steuerung mit dem Ziel, sie direkt an die GPIO-Pins des RPi anzuschließen;&lt;br /&gt;
&lt;br /&gt;
- Entwurf einer Zusatzschaltung, die in diesem Beispiel eine Rückmeldung liefert, ob ein Verbraucher aktiv ist oder nicht (Fahrzeug noch auf der Strecke?);&lt;br /&gt;
&lt;br /&gt;
- Entwurf einer Zusatzschaltung, die erkennt wie viel Strom fliesst: damit wären Rückschlüsse auf den Streckenverlauf möglich (Kurve=etwas mehr Strom, Steigung=noch mehr Strom nötig, etc.) und auch eine programmgesteuerte Optimierung der Array-Schaltzeiten dankbar; &lt;br /&gt;
&lt;br /&gt;
- Einsatz anderer Sensortechniken und/oder mehrerer Sensoren zur Optimierung der Schnelligkeit oder parallelen Steuerung eines 2. Fahrzeuges;&lt;br /&gt;
&lt;br /&gt;
== Softwareseitige Ausbauvarianten ==&lt;br /&gt;
&lt;br /&gt;
- Optimierung des Scripts, indem die Sensor-Abfrage über einen &#039;Listener&#039; umgesetzt wird;&lt;br /&gt;
&lt;br /&gt;
- Erweiterung des Scripts um eine GUI mit Hilfe der python-lib Tkinter, um einen Nutzerzugriff auf das Steuerarray und/oder eine &#039;Verwaltung&#039; mehrerer Fahrzeuge;&lt;br /&gt;
&lt;br /&gt;
- Einbindung eines Web-Interface um eine &#039;Fernsteuerung&#039; zu ermöglichen...&lt;br /&gt;
&lt;br /&gt;
...in jedem Fall: viel Spaß beim Basteln!&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [http://hackaday.com/2013/01/23/replacement-controllers-for-slot-car-racing/ ähnliches Projekt bei &#039;hackaday&#039;] &lt;br /&gt;
* [https://docs.google.com/folder/d/0B-UAZ9CyJCLGQjJ3RDlqa2pqaDg/edit?pli=1&amp;amp;docId=0B-UAZ9CyJCLGNmpMeVpyYlZJUWc Relaisschaltung mit pädagogischer Erweiterung der Universität Manchester (englischspr.)]&lt;br /&gt;
* [http://elinux.org/RPi_Projects/PiFace_controlling_a_slot-car paralleler englischsp. Bericht des Autors zum RPi mit anderem Schwerpunkt] &lt;br /&gt;
* [http://elinux.org/RPi_Projects englischsp. Projektliste zum RPi]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/GhostCarProjekt Verlagerung der gesamten Steuerelektronik ins Fahrzeug]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Raspberry Pi]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Mknot9</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=RPi_als_D/A-Wandler&amp;diff=74405</id>
		<title>RPi als D/A-Wandler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=RPi_als_D/A-Wandler&amp;diff=74405"/>
		<updated>2013-03-08T18:19:29Z</updated>

		<summary type="html">&lt;p&gt;Mknot9: /* Umsetzung von 3 Schaltstufen mit Optokopplern */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von mknot9&#039;&#039; (M. Knoop)&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
Oft wird ein Computer &#039;nur&#039; genutzt um darauf Software ablaufen zu lassen. Dessen Möglichkeit zur Steuerung von elektrischen und mechanischen Geräten wird dabei leicht übersehen.&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel richtet sich daher an Einsteiger, die mit dem [[Raspberry Pi]] (&#039;RPi&#039;) Grundlagen der Computersteuerung mit Relais und [[Spannungsteiler]]n nachvollziehen möchten. Es wird schrittweise dargestellt, wie mittels eines D/A-Wandlers (Digital/Analog-Wandler = Umwandlung von digitalen 1/0 Signale) die Steuerung einer stufenweise veränderbaren Ausgangsspannung aufgebaut werden kann.&lt;br /&gt;
&lt;br /&gt;
= Verwendete Hardware =&lt;br /&gt;
&lt;br /&gt;
== RPi in Kombination mit der &#039;PiFace&#039;-Karte als Bastelplattform ==&lt;br /&gt;
&lt;br /&gt;
Dank der einfachen Bauweise bietet sich der RPi mit seinen frei zugänglichen GPIO-Pins als ideale Bastelplattform an. Trotzdem kann es beim anfänglichen Experimentieren mit Schaltungen öfters zu kleinen Fehlern kommen, die schlimmstenfalls die empfindliche Elektronik des RPi dauerhaft beschädigen können.&lt;br /&gt;
&lt;br /&gt;
Daher wird bei diesem Projekt zusätzlich mit der &#039;PiFace[http://elinux.org/RPi_Expansion_Boards#Piface]&#039;-Karte gearbeitet, die man auf die GPIO-Pins stecken kann. Diese Erweiterungskarte verschaltet die GPIO-Pins auf je 8 digitale Ein- und Ausgänge sowie 2 Relais, die eine galvanische Trennung von Stromkreisen ermöglichen. Damit besteht auch für Einsteiger ein gewisser Schutz für die Steuerelektronik des RPi.&lt;br /&gt;
&lt;br /&gt;
Auch im weiteren Verlauf dieser Einführung soll noch auf eine Trennung der Stromkreise Wert gelegt werden, so dass für erste digitale Schaltexperimente ein Optokoppler genutzt wird. Die spätere Nutzung der &#039;Input Pins&#039; des PiFace um eine Steuerung der D/A-Wandlung durch bestimmte Ereignisse zu ermöglichen, erfolgt ebenfalls passiv.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Auch wenn mit vermeintlich &#039;sicheren&#039; Transformatoren gebastelt wird, muss stets bedacht werden, dass diese an einem 230V-Stromnetz betrieben werden und man eher einmal mehr als weniger prüfen sollte, ob man durch eventuelle Fehler mit lebensgefährlicher Spannung in Berührung kommt!&lt;br /&gt;
&lt;br /&gt;
== Auswahl eines Beispielprojektes ==&lt;br /&gt;
&lt;br /&gt;
Günstige Möglichkeiten ein Gerät zu finden, das mit analogen Spannungen arbeitet, bieten sich u.a. im Spielzeugbereich. Im Grunde eignet sich alles, was mit Batterien oder mit Gleichspannungen unter 24 V betrieben wird.&lt;br /&gt;
&lt;br /&gt;
Da jedoch ein Ziel das Steuern von analogen Spannungen ist, bietet sich insbesondere alles an, bei dem [[Potentiometer]] eingesetzt werden. Einen dieser &#039;Handregler&#039; sollte man übrig haben, da er von seinem Anschlusskabel abgetrennt werden muss, um den oft proprietären Steckanschluss nutzen zu können. In diesem Sinne wird hier eine handelsübliche Spielzeug-Autorennbahn mit Potentiometer-Handreglern genutzt.&lt;br /&gt;
&lt;br /&gt;
== Sonstige Bauteile ==&lt;br /&gt;
&lt;br /&gt;
Für die ersten Grundlagen (s. Teile 2 &amp;amp; 3) genügen bereits rund 2 m isolierter Draht, der nicht aus verdrillten feinen Adern (Litze) bestehen sollte, 50 cm nicht-isolierter Draht, einige niederohmige Widerstände (z.B. je 2 mal 100 Ohm, 80, 60, sowie 20) und ein &#039;Experimentierbrett&#039; (engl. [[Breadboard]]).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Grundlagen und Vorbereitung des Projekts =&lt;br /&gt;
&lt;br /&gt;
== Umwandlung von 1/0 zu Ein/Aus mit einem Relais ==&lt;br /&gt;
&lt;br /&gt;
Vom Prinzip her ist jede Umwandlung eines digitalen 0 oder 1 Signals (das über eine bestimmte Spannungsdifferenz festgelegt ist) in eine (nutzbare) Spannung bereits eine D/A-Wandlung. Dies wird schlicht so realisiert, dass mit einer Eingabe am RPi die Nutzspannung des &#039;Verbrauchers&#039; zunächst einfach an- und ausgeschaltet wird.&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung der zu steuernden Hardware ==&lt;br /&gt;
&lt;br /&gt;
a. Um Fehlerquellen auszuschließen sollte zunächst (und ggf. auch später!) kurz getestet werden, ob der vorhandene Regler wie erwartet funktioniert.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pif_Con9.jpg|thumb|right|400px|Fixierung der Reglerkabel]]&lt;br /&gt;
b. Nach dem Trennen des Reglers von der Einspeisung (und ggf. Ziehen des Netzsteckers) muss das Regler-Kabel abgeschnitten werden (eher nahe beim Regler, da das Kabel bald bis zum Breadboard reichen soll). Die neuen Enden des Einspeiseteils werden abisoliert und auf dem Breadboard diagonal zueinander mit einigen Spalten Abstand fixiert. Auch können bereits die Drähte, die später zum RPi führen, jeweils in den passenden kontaktführenden Spalten eingesteckt werden, z. B. wie rechts zu sehen (die nicht beschrifteten Drähte können vorerst ignoriert werden):&lt;br /&gt;
&lt;br /&gt;
c. Nun bietet sich eine gute Gelegenheit die maximale Spannung am Nutzgerät zu messen. Man verbindet das Regler-Kabel (nun ohne Regler) wieder mit der Einspeisung und die offenen Enden der Drähte mit dem Messgerät, bei dem zunächst ein Messbereich von ca. 10-50 Volt gewählt werden sollte. Dies sollte dann z.B. 14,8 V anzeigen. Natürlich können auch die beiden offenen Enden einen kleinen Moment kurz geschlossen werden, man sollte aber bedenken, dass das zu regelnde Nutzgerät dann die maximal vorgesehene Spannung erhält (hier: maximales Tempo).&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung des RPi ==&lt;br /&gt;
&lt;br /&gt;
Es wird davon ausgegangen, dass entsprechend des zugehörigen &#039;manual&#039; das PiFace bereits auf den RPi gesteckt ist, die nötigen python-Bibliotheken installiert sind und man sich im Terminal-Arbeitsverzeichnis &#039;pi&#039; befindet.&lt;br /&gt;
&lt;br /&gt;
a. Zunächst wird der PiFace-Emulator (im Terminal direkt aus dem Arbeitsverzeichnis) gestartet: &amp;lt;tt&amp;gt;piface/scripts/piface-emulator&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b. Wenn alles richtig installiert wurde, erscheint ein Fenster (unten links), bei dem die vorerst wichtigen blauen Signale am rechten Rand wie folgt angezeigt werden sollten: &lt;br /&gt;
 &lt;br /&gt;
[[Datei:RPi_PiF_em-scs.jpg|400px|Piface-Emulator im default-Zustand]] [[Datei:RPi_PiF_em_scs1.jpg|400px|Piface-Relais 1 auf &#039;1&#039; geschaltet]]&lt;br /&gt;
&lt;br /&gt;
c. Das rechte Fenster ergibt sich, wenn man nun im Fenster auf &amp;quot;Override Enable&amp;quot; und dann &amp;quot;Output Pin 1&amp;quot; klickt. Es müsste ein &amp;quot;Klick&amp;quot; vom Relais 1 zu hören sein sowie der Schaltzustand des unteren Relais 1 (das an den Output Pin 1 gekoppelt ist) auf die Verbindung der beiden unteren Anschlüsse wechseln. Zugleich wird das erste LED-Icon beim Output Pin 1 rot sowie das zugehörige LED-Icon blau.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pif_rel2.png|thumb|right|250px|Schema der Piface-Relais]]&lt;br /&gt;
d. Rechts ist der Schaltzustand der Relais, die zu Beginn genutzt werden, im Grundzustand dargestellt (jeweils der mittlere und obere Kontakt sind kurzgeschlossen, der jeweils untere Kontakt ist frei):&lt;br /&gt;
&lt;br /&gt;
e. Ein weiterer Klick auf &amp;quot;Output Pin 1&amp;quot; versetzt das Relais in den Ausgangszustand, der vor dem nächsten Schritt wieder eingestellt werden sollte.&lt;br /&gt;
&lt;br /&gt;
f. Das Relais lässt sich auch mittels eines Python-Scripts vom RPi aus ansteuern. Dazu wird folgende Textdatei &amp;quot;wandler.py&amp;quot; im Arbeitsverzeichnis abgespeichert und mit dem Befehl &amp;quot;&amp;lt;tt&amp;gt;python wandler.py&amp;lt;/tt&amp;gt;&amp;quot; gestartet:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler.py&lt;br /&gt;
&lt;br /&gt;
 from time import sleep&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
&lt;br /&gt;
 pfio.init()&lt;br /&gt;
&lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
 print &amp;quot;Strom an&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 sleep(2)&lt;br /&gt;
&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Strom aus&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Nach dem Absetzen des Befehls wechselt nun das blaue Signal an Relais 1 für 2 Sekunden und das Relais klickt entsprechend.&lt;br /&gt;
&lt;br /&gt;
== Einsatz eines Relais&#039; zur Umsetzung von Spannungsänderungen ==&lt;br /&gt;
&lt;br /&gt;
a. Ist das Relais wieder im Ausgangszustand, befestigt man nun einen der vom Breadboard führenden Drähte am unteren und einen am mittleren Relaiseingang (im Moment ist die Polarität noch egal). Zunächst sollte nichts passieren (das Relais hält diesen ja Stromkreis noch offen).&lt;br /&gt;
&lt;br /&gt;
b. Startet man aber das Script wieder (&amp;lt;tt&amp;gt;python wandler.py&amp;lt;/tt&amp;gt;) oder klickt auf &#039;Output Pin 1&#039; wird der Nutzstromkreis geschlossen. Nochmals aufgepasst: unser Nutzer erhält wieder die maximal vorgesehene Spannung - also besser vorher im Script &amp;quot;&amp;lt;tt&amp;gt;sleep(0.3)&amp;lt;/tt&amp;gt;&amp;quot; setzen und speichern.&lt;br /&gt;
&lt;br /&gt;
c. Im Prinzip ist damit die programmgesteuerte Umsetzung eines 0/1 Signals in z.B. eine 0V/15V Spannung erreicht.&lt;br /&gt;
&lt;br /&gt;
d. Da wir bald verschiedene Steuerspannungen schalten wollen, geht es jetzt darum herauszufinden, bei welcher Spannung unser Nutzgerät gerade noch bewegt wird. Dies probiert man aus - mit dem kleinsten Widerstand beginnend: indem einer der Drähte in eine freie Breadboardspalte gesteckt wird und aus dieser Spalte der Widerstand zu dem &#039;alten&#039; Steckplatz des Drahtes geführt wird. Nun startet man jeweils das Script bis der Widerstand so hoch ist, dass die Anlaufspannung beim Nutzgerätes gut ausreicht, eine Reaktion des Nutzgerät (Fahrzeug bewegt sich) zu bewirken (z.B. bei 50 Ohm beträgt der Strom im Mittel ca. 130 mA während ohne 190 mA fließen).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Ansteuerung von 3 Schaltstufen =&lt;br /&gt;
&lt;br /&gt;
== Kombination von 2 Relais ==&lt;br /&gt;
&lt;br /&gt;
[[Bild:ZrelMww2.png|thumb|right|250px|Beschaltung der Relais]] a. Die einfachste Stufe der weiteren Verschaltung erreicht man, indem der Widerstand mit einem 2. Relais überbrückt wird. Relais 1 kann dann als &#039;Hauptschalter&#039;, Relais 2 als Spannungsumschalter genutzt werden:&lt;br /&gt;
&lt;br /&gt;
b. Diese Beschaltung kann sogleich mit dem PiFace-Emulator ausprobiert werden. Damit können wir bereits 3 Schaltstufen steuern: keine, verminderte und volle Spannung.&lt;br /&gt;
&lt;br /&gt;
c. Theoretisch ließe sich auch noch eine 4. Spannungsstufe erzeugen, da mit 2 &#039;Bits&#039; (Ein/Aus bei 2 Relais) bereits 4 verschiedene Signale darstellbar sind. Beim jetzigen Aufbau werden aber lediglich die (pin1,pin2)-Signale (0,0), (1,0) und (1,1) &#039;genutzt&#039;, da Relais 1 als Hauptschalter vorgesehen ist und die Kombination (0,1) so nicht ausgewertet wird.&lt;br /&gt;
&lt;br /&gt;
== Programmgesteuerte Schaltung von 2 Relais ==&lt;br /&gt;
&lt;br /&gt;
a. Mit einem veränderten python-Script &amp;quot;wandler2.py&amp;quot; ist auch die programmgesteuerte Schaltung möglich. Dabei werden zusätzlich die Tasten 1 und 2 des PiFace genutzt, um nach dem Start des Scripts (&amp;lt;tt&amp;gt;python wandler2.py&amp;lt;/tt&amp;gt;) den Hauptschalter (Relais 1) zu steuern:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler2.py&lt;br /&gt;
 &lt;br /&gt;
 from time import sleep&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
 pfio.init()&lt;br /&gt;
 &lt;br /&gt;
 taste_1=0&lt;br /&gt;
 taste_2=0&lt;br /&gt;
 intervall_a=0.1&lt;br /&gt;
 intervall_b=0.5&lt;br /&gt;
 # Die Intervalle bestimmen die Schaltzeit für volle/verminderte Spannung&lt;br /&gt;
 &lt;br /&gt;
 print &amp;quot;Zum Start Taste 1 drücken, zum Stoppen Taste 2&amp;quot;&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 while taste_1 == 0:&lt;br /&gt;
   sleep(intervall_a)&lt;br /&gt;
   taste_1=pfio.digital_read(1)&lt;br /&gt;
&lt;br /&gt;
 # Der o.g. &#039;sleep&#039;-Befehl bestimmt die Abfragepausen für Taste 1&lt;br /&gt;
 &lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
 print &amp;quot;Strom an!&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 while taste_2 == 0:&lt;br /&gt;
   pfio.digital_write(2,1)&lt;br /&gt;
   sleep(intervall_a)&lt;br /&gt;
   pfio.digital_write(2,0)&lt;br /&gt;
   sleep(intervall_b)&lt;br /&gt;
   taste_2=pfio.digital_read(2)&lt;br /&gt;
 &lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Strom aus!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
b. Falls beim Ausprobieren von Script-Änderungen mal was schief geht, kann das Script stets auch mit der Tastenkombination (CNTRL-C) gestoppt werden. U.U. muss dann noch zusätzlich Relais 1 und/oder 2 via Emulator zurückgesetzt werden.&lt;br /&gt;
&lt;br /&gt;
c. Beim Verändern des Scripts fällt bald auf, dass die bisherige Programmsteuerung keine direkte Möglichkeit vorsieht, auf Ereignisse zu reagieren. Immerhin wird ein mechanisches Gerät gesteuert, bei dem mit Ausfällen, Fertigungstoleranzen, Umwelteinflüssen etc. zu rechnen ist (im Script wird dies bislang &#039;nur&#039; durch die Abbruchbedingung &#039;Taste 2&#039; berücksichtigt).&lt;br /&gt;
&lt;br /&gt;
== Einfache Sensor-Signale als steuernde Elemente eines Programms ==&lt;br /&gt;
&lt;br /&gt;
a. Eine wichtige Anwendung von D/A-Steuerungen ist die mögliche Reaktion dieser Steuerung auf &#039;äußere&#039; Ereignisse, die z.B. mit Hilfe von Sensoren leistbar ist.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Einf_Sens.jpg|thumb|right|250px|einfacher Sensor]]b. Für unsere Zwecke genügt zunächst ein sehr einfacher Sensor, der ein 0- oder 1-Signal liefert und idealerweise direkt am &#039;Input Pin 1&#039; des PiFace angeschlossen werden kann. So liegt beim Input Pin 1 das Signal &#039;1&#039; an, wenn eine Verbindung zu &#039;Input GND&#039; besteht.&lt;br /&gt;
Z.B. können 2 unisolierte Drähte so platziert werden, dass ein vorbeifahrendes Fahrzeug einen von ihnen genügend bewegt um den Kontakt kurze Zeit zu öffnen. Genau dann liefert dieser &#039;Sensor&#039; das Signal &#039;0&#039;. Eine - die Schwerkraft nutzende - mögliche Bauform ist rechts abgebildet ;-)&lt;br /&gt;
&lt;br /&gt;
c. Natürlich werden zusätzlich 2 isolierte Drähte benötigt, um jeden der beiden offenen Drähte geschützt mit Input Pin 1 und Input GND zu verbinden.&lt;br /&gt;
&lt;br /&gt;
d. Bei jeder Durchfahrt liefert der Sensor nun ein &#039;0&#039;-Signal, was im Script sowohl für eine Zeitmessung als auch für ein &#039;Schaltintervall-Array&#039; genutzt werden kann. Dort können abwechselnd für beide Spannungen Zeiten (die in etwa zum jeweiligen Streckenabschnitt passen) &#039;programmiert&#039; werden. Statt Taste 1 wird nun der Sensor ausgewertet (wobei Taste 1 als Sensor-Ersatz insoweit genutzt werden kann, dass sie gedrückt bleiben bzw. kurz losgelassen werden muss). Zur genaueren Zeitmessung wird noch das modul &#039;clock&#039; benötigt. &amp;quot;&amp;lt;tt&amp;gt;wandler3.py&amp;lt;/tt&amp;gt;&amp;quot; könnte also so aussehen:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler3.py&lt;br /&gt;
 &lt;br /&gt;
 from time import clock&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
 sensor_1=1&lt;br /&gt;
 sensor_2=0&lt;br /&gt;
 rundenzahl=0&lt;br /&gt;
 v_wechsel=0&lt;br /&gt;
 vorrunde=0&lt;br /&gt;
 index_zaehler=1&lt;br /&gt;
 &lt;br /&gt;
 zeit_array=[0,0.2,0.4,0.2,0.4,0.2,0.4,0.2,5,0.2,6]&lt;br /&gt;
 # dieses array enthält die sek. bis zum Spannungswechsel&lt;br /&gt;
&lt;br /&gt;
 array_laenge=9&lt;br /&gt;
 # legt fest, wie viel Werte des arrays genutzt werden sollen&lt;br /&gt;
 &lt;br /&gt;
 sensor_aus=1.3&lt;br /&gt;
 # bis der Sensor sicher in die Ruhestellung kippt, wird er nicht ausgelesen&lt;br /&gt;
  &lt;br /&gt;
 pfio.init()&lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
&lt;br /&gt;
 # das Fahrzeug wird langsam zum Start (=Sensor) bewegt&lt;br /&gt;
 while sensor_1 == 1 :&lt;br /&gt;
   sensor_1=pfio.digital_read(1)&lt;br /&gt;
  &lt;br /&gt;
 print &amp;quot;fliegender Start... zum Beenden Taste 2 drücken&amp;quot;&lt;br /&gt;
 print &amp;quot;Runde Nr., Ges.Zeit, Rundenzeit, mittlere Rundenzeit&amp;quot;&lt;br /&gt;
 start_zeit=clock()&lt;br /&gt;
 runden_start=start_zeit&lt;br /&gt;
  &lt;br /&gt;
 while sensor_2 == 0 :&lt;br /&gt;
   sensor_2=pfio.digital_read(2)&lt;br /&gt;
   v_wechsel=1-v_wechsel&lt;br /&gt;
   pfio.digital_write(2,v_wechsel)&lt;br /&gt;
   sensor_zeit=clock()&lt;br /&gt;
  &lt;br /&gt;
   while zeit_array[index_zaehler]+sensor_zeit &amp;gt; clock() :&lt;br /&gt;
     if runden_start+sensor_aus &amp;lt; clock() :&lt;br /&gt;
 &lt;br /&gt;
       sensor_1=pfio.digital_read(1) &lt;br /&gt;
       if sensor_1 == 0 :&lt;br /&gt;
         rundenzahl=rundenzahl+1&lt;br /&gt;
         runden_start=clock()&lt;br /&gt;
         zeit=runden_start-start_zeit&lt;br /&gt;
         print rundenzahl, zeit, zeit-vorrunde, zeit/rundenzahl&lt;br /&gt;
         vorrunde=zeit&lt;br /&gt;
         sensor_zeit=0&lt;br /&gt;
         index_zaehler=0&lt;br /&gt;
         v_wechsel=0&lt;br /&gt;
  &lt;br /&gt;
   index_zaehler=index_zaehler+1&lt;br /&gt;
   if index_zaehler &amp;gt; array_laenge :&lt;br /&gt;
     sensor_2=1&lt;br /&gt;
     print &amp;quot;array-Ende erreicht!&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Outp 1 &amp;amp; 2 auf 0!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wird das Array-Ende erreicht, wurden entweder zu wenige Einträge vorgesehen oder es befindet sich kein Fahrzeug (mehr) auf der Strecke, das den Sensor und damit des Zurücksetzen des Arrays auslösen konnte.&lt;br /&gt;
&lt;br /&gt;
e. Das Array ist an die jeweilige Strecke anzupassen, wobei der vorderste Eintrag ungenutzt bleibt und dann mit der Dauer für maximale Spannung begonnen wird. Solange man mit Relais arbeitet, sollten die Schaltzeiten nicht zu kurz sein (&amp;gt;0.1 sek.), da diese eine gewisse mechanische Trägheit besitzen.&lt;br /&gt;
&lt;br /&gt;
f. Eben diese mechanische Beschaffenheit der Relais (Verschleiß) ist auch ein guter Grund, auf &#039;volle&#039; digitale Signalumwandlung umzustellen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Optokoppler als Ersatz für Relais =&lt;br /&gt;
&lt;br /&gt;
Ähnlich wie ein Relais dient ein [[Optokoppler]] dazu, eine Signalübertragung zwischen zwei getrennten Stromkreisen zu ermöglichen. Bei diesem Projekt liegt der Einsatz von Optokopplern nahe, da sie schneller schalten und keine beweglichen Teile besitzen. Für unsere Zwecke benötigen wir nun als zusätzliche Elemente: Optokoppler (CNY 17-4), npn-[[Transistor]]en (BC 337-40) zur Signalverstärkung sowie einige Widerstände im Bereich von 2k und 400 Ohm. &lt;br /&gt;
&lt;br /&gt;
== Kaskadierung von Transistoren zur Signalverstärkung ==&lt;br /&gt;
&lt;br /&gt;
a. Entsprechend Schritt 2.4.d. (ein Relais bei 50 Ohm) wird zunächst ein [[Optokoppler]] eingesetzt, dessen Signal durch einen Transistor verstärkt wird, um die &#039;Grundspannung&#039; zu schalten (Pin 3 und 6 beim Optokoppler sollten unbeschaltet bleiben, allein der &#039;Lichtstrom&#039; reicht für eine Ansteuerung aus):&lt;br /&gt;
&lt;br /&gt;
[[Bild:PiF_CNY_BC_1.png|400px|Optokoppler mit Transistor]]&lt;br /&gt;
&lt;br /&gt;
b. Da immer mit einer gewissen Toleranz bei allen Komponenten zu rechnen ist, kann es sein, dass u.U. die Widerstände etwas größer oder kleiner gewählt werden müssen. Beim Ausprobieren sollte man hier in 10% Schritten variieren.&lt;br /&gt;
&lt;br /&gt;
c. Bei Austesten mit Emulator oder Script ist auch zu beachten, dass nun &#039;Output Pin 8&#039; genutzt wird, da dieser nicht mit den Relais verschaltet ist.&lt;br /&gt;
&lt;br /&gt;
== Umsetzung von 3 Schaltstufen mit Optokopplern ==&lt;br /&gt;
&lt;br /&gt;
a. Entsprechend dem Vorgehen beim Relais kann nun auch der kleine Widerstand zusätzlich beschaltet werden um seine gesteuerte Überbrückung zu ermöglichen. Da hier eine relativ geringe Spannung aufgeschaltet wird, kann zu Beginn eine Diode eingesetzt werden, die die Schaltstufe &#039;maximale Spannung&#039; anzeigt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:SmPiFu2ou2T.png|400px|Kombination von 2 Optokopplern]]&lt;br /&gt;
&lt;br /&gt;
b. Vor dem Testen ist wieder zu beachten, dass nun zusätzlich &#039;Output Pin 7&#039; genutzt wird (statt Output Pin 2).&lt;br /&gt;
&lt;br /&gt;
c. Neben dem Weglassen der Diode (was die Maximalgeschwindigkeit leicht erhöht), können auch statt der 400 Ohm Widerstände 1k-Werte oder höher gewählt werden, wenn dadurch der jeweilige Basisstrom noch hoch genug ist. Im vorliegenden Fall war erst ab 400 Ohm keine weitere Tempoerhöhung mehr feststellbar.&lt;br /&gt;
&lt;br /&gt;
d. Eine mögliche Realisierung sieht so aus: http://youtu.be/xQ7N-PrIULk&lt;br /&gt;
&lt;br /&gt;
== Zusätzliche Erhöhung der Schaltstufen bei D/A-Wandlern ==&lt;br /&gt;
&lt;br /&gt;
a. Zwar benötigen wir in unserem speziellen Beispiel eine &#039;Grundspannung&#039;, die sich dahingehend auswirkt, dass - wie unter 3.1.c. erwähnt - eine Signalkombination nicht ausgewertet wird, aber mit jeder weiteren Schaltstufe würde sich dieses Problem (theoretisch) relativieren, da bei geschickter Auswahl der Widerstände (z.B. im Verhältnis 1 zu 2) jeweils eine Verdoppelung der Kombinationsmöglichkeiten erreichbar ist.&lt;br /&gt;
&lt;br /&gt;
b. Wird hier der 50 Ohm Widerstand asymmetrisch geteilt (z.B. 15 + 35 Ohm, s.a. [[Spannungsteiler]]) um dort ein weiteres Signal umsetzen zu können, ergeben sich direkt folgende 5 Schaltstufen (aus, 50, 35, 15 und 0 Ohm) u.s.w.:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Sm3ou3t2.png|400px|Erhöhung der Schaltstufen]]&lt;br /&gt;
&lt;br /&gt;
c. Zur Ansteuerung dieser Schaltstufen wäre das Script so zu ändern, dass nun zwischen mehr als 2 Stufen gewechselt werden kann und im Array entsprechende Zusatzdaten vorgegeben und ausgelesen werden. Mehr als diese Stufen sind im konkreten Fall aber nicht sinnvoll, da die entstehende Verlustleistung in der Schaltung die maximal verfügbare Leistung reduziert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Weiterführende Ideen =&lt;br /&gt;
&lt;br /&gt;
Die Ausbaumöglichkeiten dieses Projektes sind vielfältig:&lt;br /&gt;
&lt;br /&gt;
== Hardwareseitige Ausbauvarianten ==&lt;br /&gt;
&lt;br /&gt;
- beispielhafte Umsetzung einer differenzierten Abstufung mittels einer logarithmischen Einteilung oder eines möglichst oft durch 2 teilbaren Anfangswertes und der Teiler (640 Ohm, 320, 160...);&lt;br /&gt;
&lt;br /&gt;
- Nachbau des Projekts mit einem Mikrocontroller (ggf. mit LCD-Anzeige);&lt;br /&gt;
&lt;br /&gt;
- Umbau der Steuerung mit dem Ziel, sie direkt an die GPIO-Pins des RPi anzuschließen;&lt;br /&gt;
&lt;br /&gt;
- Entwurf einer Zusatzschaltung, die in diesem Beispiel eine Rückmeldung liefert, ob ein Verbraucher aktiv ist oder nicht (Fahrzeug noch auf der Strecke?);&lt;br /&gt;
&lt;br /&gt;
- Entwurf einer Zusatzschaltung, die erkennt wie viel Strom fliesst: damit wären Rückschlüsse auf den Streckenverlauf möglich (Kurve=etwas mehr Strom, Steigung=noch mehr Strom nötig, etc.) und auch eine programmgesteuerte Optimierung der Array-Schaltzeiten dankbar; &lt;br /&gt;
&lt;br /&gt;
- Einsatz anderer Sensortechniken und/oder mehrerer Sensoren zur Optimierung der Schnelligkeit oder parallelen Steuerung eines 2. Fahrzeuges;&lt;br /&gt;
&lt;br /&gt;
== Softwareseitige Ausbauvarianten ==&lt;br /&gt;
&lt;br /&gt;
- Optimierung des Scripts, indem die Sensor-Abfrage über einen &#039;Listener&#039; umgesetzt wird;&lt;br /&gt;
&lt;br /&gt;
- Erweiterung des Scripts um eine GUI mit Hilfe der python-lib Tkinter, um einen Nutzerzugriff auf das Steuerarray und/oder eine &#039;Verwaltung&#039; mehrerer Fahrzeuge;&lt;br /&gt;
&lt;br /&gt;
- Einbindung eines Web-Interface um eine &#039;Fernsteuerung&#039; zu ermöglichen...&lt;br /&gt;
&lt;br /&gt;
...in jedem Fall: viel Spaß beim Basteln!&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [http://hackaday.com/2013/01/23/replacement-controllers-for-slot-car-racing/ ähnliches Projekt bei &#039;hackaday&#039;] &lt;br /&gt;
* [https://docs.google.com/folder/d/0B-UAZ9CyJCLGQjJ3RDlqa2pqaDg/edit?pli=1&amp;amp;docId=0B-UAZ9CyJCLGNmpMeVpyYlZJUWc Relaisschaltung mit pädagogischer Erweiterung der Universität Manchester (englischspr.)]&lt;br /&gt;
* [http://elinux.org/RPi_Projects/PiFace_controlling_a_slot-car paralleler englischsp. Bericht des Autors zum RPi mit anderem Schwerpunkt] &lt;br /&gt;
* [http://elinux.org/RPi_Projects englischsp. Projektliste zum RPi]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/GhostCarProjekt Verlagerung der gesamten Steuerelektronik ins Fahrzeug]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Raspberry Pi]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Mknot9</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=RPi_als_D/A-Wandler&amp;diff=74404</id>
		<title>RPi als D/A-Wandler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=RPi_als_D/A-Wandler&amp;diff=74404"/>
		<updated>2013-03-08T18:19:02Z</updated>

		<summary type="html">&lt;p&gt;Mknot9: /* Umsetzung von 3 Schaltstufen mit Optokopplern */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von mknot9&#039;&#039; (M. Knoop)&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
Oft wird ein Computer &#039;nur&#039; genutzt um darauf Software ablaufen zu lassen. Dessen Möglichkeit zur Steuerung von elektrischen und mechanischen Geräten wird dabei leicht übersehen.&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel richtet sich daher an Einsteiger, die mit dem [[Raspberry Pi]] (&#039;RPi&#039;) Grundlagen der Computersteuerung mit Relais und [[Spannungsteiler]]n nachvollziehen möchten. Es wird schrittweise dargestellt, wie mittels eines D/A-Wandlers (Digital/Analog-Wandler = Umwandlung von digitalen 1/0 Signale) die Steuerung einer stufenweise veränderbaren Ausgangsspannung aufgebaut werden kann.&lt;br /&gt;
&lt;br /&gt;
= Verwendete Hardware =&lt;br /&gt;
&lt;br /&gt;
== RPi in Kombination mit der &#039;PiFace&#039;-Karte als Bastelplattform ==&lt;br /&gt;
&lt;br /&gt;
Dank der einfachen Bauweise bietet sich der RPi mit seinen frei zugänglichen GPIO-Pins als ideale Bastelplattform an. Trotzdem kann es beim anfänglichen Experimentieren mit Schaltungen öfters zu kleinen Fehlern kommen, die schlimmstenfalls die empfindliche Elektronik des RPi dauerhaft beschädigen können.&lt;br /&gt;
&lt;br /&gt;
Daher wird bei diesem Projekt zusätzlich mit der &#039;PiFace[http://elinux.org/RPi_Expansion_Boards#Piface]&#039;-Karte gearbeitet, die man auf die GPIO-Pins stecken kann. Diese Erweiterungskarte verschaltet die GPIO-Pins auf je 8 digitale Ein- und Ausgänge sowie 2 Relais, die eine galvanische Trennung von Stromkreisen ermöglichen. Damit besteht auch für Einsteiger ein gewisser Schutz für die Steuerelektronik des RPi.&lt;br /&gt;
&lt;br /&gt;
Auch im weiteren Verlauf dieser Einführung soll noch auf eine Trennung der Stromkreise Wert gelegt werden, so dass für erste digitale Schaltexperimente ein Optokoppler genutzt wird. Die spätere Nutzung der &#039;Input Pins&#039; des PiFace um eine Steuerung der D/A-Wandlung durch bestimmte Ereignisse zu ermöglichen, erfolgt ebenfalls passiv.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Auch wenn mit vermeintlich &#039;sicheren&#039; Transformatoren gebastelt wird, muss stets bedacht werden, dass diese an einem 230V-Stromnetz betrieben werden und man eher einmal mehr als weniger prüfen sollte, ob man durch eventuelle Fehler mit lebensgefährlicher Spannung in Berührung kommt!&lt;br /&gt;
&lt;br /&gt;
== Auswahl eines Beispielprojektes ==&lt;br /&gt;
&lt;br /&gt;
Günstige Möglichkeiten ein Gerät zu finden, das mit analogen Spannungen arbeitet, bieten sich u.a. im Spielzeugbereich. Im Grunde eignet sich alles, was mit Batterien oder mit Gleichspannungen unter 24 V betrieben wird.&lt;br /&gt;
&lt;br /&gt;
Da jedoch ein Ziel das Steuern von analogen Spannungen ist, bietet sich insbesondere alles an, bei dem [[Potentiometer]] eingesetzt werden. Einen dieser &#039;Handregler&#039; sollte man übrig haben, da er von seinem Anschlusskabel abgetrennt werden muss, um den oft proprietären Steckanschluss nutzen zu können. In diesem Sinne wird hier eine handelsübliche Spielzeug-Autorennbahn mit Potentiometer-Handreglern genutzt.&lt;br /&gt;
&lt;br /&gt;
== Sonstige Bauteile ==&lt;br /&gt;
&lt;br /&gt;
Für die ersten Grundlagen (s. Teile 2 &amp;amp; 3) genügen bereits rund 2 m isolierter Draht, der nicht aus verdrillten feinen Adern (Litze) bestehen sollte, 50 cm nicht-isolierter Draht, einige niederohmige Widerstände (z.B. je 2 mal 100 Ohm, 80, 60, sowie 20) und ein &#039;Experimentierbrett&#039; (engl. [[Breadboard]]).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Grundlagen und Vorbereitung des Projekts =&lt;br /&gt;
&lt;br /&gt;
== Umwandlung von 1/0 zu Ein/Aus mit einem Relais ==&lt;br /&gt;
&lt;br /&gt;
Vom Prinzip her ist jede Umwandlung eines digitalen 0 oder 1 Signals (das über eine bestimmte Spannungsdifferenz festgelegt ist) in eine (nutzbare) Spannung bereits eine D/A-Wandlung. Dies wird schlicht so realisiert, dass mit einer Eingabe am RPi die Nutzspannung des &#039;Verbrauchers&#039; zunächst einfach an- und ausgeschaltet wird.&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung der zu steuernden Hardware ==&lt;br /&gt;
&lt;br /&gt;
a. Um Fehlerquellen auszuschließen sollte zunächst (und ggf. auch später!) kurz getestet werden, ob der vorhandene Regler wie erwartet funktioniert.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pif_Con9.jpg|thumb|right|400px|Fixierung der Reglerkabel]]&lt;br /&gt;
b. Nach dem Trennen des Reglers von der Einspeisung (und ggf. Ziehen des Netzsteckers) muss das Regler-Kabel abgeschnitten werden (eher nahe beim Regler, da das Kabel bald bis zum Breadboard reichen soll). Die neuen Enden des Einspeiseteils werden abisoliert und auf dem Breadboard diagonal zueinander mit einigen Spalten Abstand fixiert. Auch können bereits die Drähte, die später zum RPi führen, jeweils in den passenden kontaktführenden Spalten eingesteckt werden, z. B. wie rechts zu sehen (die nicht beschrifteten Drähte können vorerst ignoriert werden):&lt;br /&gt;
&lt;br /&gt;
c. Nun bietet sich eine gute Gelegenheit die maximale Spannung am Nutzgerät zu messen. Man verbindet das Regler-Kabel (nun ohne Regler) wieder mit der Einspeisung und die offenen Enden der Drähte mit dem Messgerät, bei dem zunächst ein Messbereich von ca. 10-50 Volt gewählt werden sollte. Dies sollte dann z.B. 14,8 V anzeigen. Natürlich können auch die beiden offenen Enden einen kleinen Moment kurz geschlossen werden, man sollte aber bedenken, dass das zu regelnde Nutzgerät dann die maximal vorgesehene Spannung erhält (hier: maximales Tempo).&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung des RPi ==&lt;br /&gt;
&lt;br /&gt;
Es wird davon ausgegangen, dass entsprechend des zugehörigen &#039;manual&#039; das PiFace bereits auf den RPi gesteckt ist, die nötigen python-Bibliotheken installiert sind und man sich im Terminal-Arbeitsverzeichnis &#039;pi&#039; befindet.&lt;br /&gt;
&lt;br /&gt;
a. Zunächst wird der PiFace-Emulator (im Terminal direkt aus dem Arbeitsverzeichnis) gestartet: &amp;lt;tt&amp;gt;piface/scripts/piface-emulator&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b. Wenn alles richtig installiert wurde, erscheint ein Fenster (unten links), bei dem die vorerst wichtigen blauen Signale am rechten Rand wie folgt angezeigt werden sollten: &lt;br /&gt;
 &lt;br /&gt;
[[Datei:RPi_PiF_em-scs.jpg|400px|Piface-Emulator im default-Zustand]] [[Datei:RPi_PiF_em_scs1.jpg|400px|Piface-Relais 1 auf &#039;1&#039; geschaltet]]&lt;br /&gt;
&lt;br /&gt;
c. Das rechte Fenster ergibt sich, wenn man nun im Fenster auf &amp;quot;Override Enable&amp;quot; und dann &amp;quot;Output Pin 1&amp;quot; klickt. Es müsste ein &amp;quot;Klick&amp;quot; vom Relais 1 zu hören sein sowie der Schaltzustand des unteren Relais 1 (das an den Output Pin 1 gekoppelt ist) auf die Verbindung der beiden unteren Anschlüsse wechseln. Zugleich wird das erste LED-Icon beim Output Pin 1 rot sowie das zugehörige LED-Icon blau.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pif_rel2.png|thumb|right|250px|Schema der Piface-Relais]]&lt;br /&gt;
d. Rechts ist der Schaltzustand der Relais, die zu Beginn genutzt werden, im Grundzustand dargestellt (jeweils der mittlere und obere Kontakt sind kurzgeschlossen, der jeweils untere Kontakt ist frei):&lt;br /&gt;
&lt;br /&gt;
e. Ein weiterer Klick auf &amp;quot;Output Pin 1&amp;quot; versetzt das Relais in den Ausgangszustand, der vor dem nächsten Schritt wieder eingestellt werden sollte.&lt;br /&gt;
&lt;br /&gt;
f. Das Relais lässt sich auch mittels eines Python-Scripts vom RPi aus ansteuern. Dazu wird folgende Textdatei &amp;quot;wandler.py&amp;quot; im Arbeitsverzeichnis abgespeichert und mit dem Befehl &amp;quot;&amp;lt;tt&amp;gt;python wandler.py&amp;lt;/tt&amp;gt;&amp;quot; gestartet:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler.py&lt;br /&gt;
&lt;br /&gt;
 from time import sleep&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
&lt;br /&gt;
 pfio.init()&lt;br /&gt;
&lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
 print &amp;quot;Strom an&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 sleep(2)&lt;br /&gt;
&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Strom aus&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Nach dem Absetzen des Befehls wechselt nun das blaue Signal an Relais 1 für 2 Sekunden und das Relais klickt entsprechend.&lt;br /&gt;
&lt;br /&gt;
== Einsatz eines Relais&#039; zur Umsetzung von Spannungsänderungen ==&lt;br /&gt;
&lt;br /&gt;
a. Ist das Relais wieder im Ausgangszustand, befestigt man nun einen der vom Breadboard führenden Drähte am unteren und einen am mittleren Relaiseingang (im Moment ist die Polarität noch egal). Zunächst sollte nichts passieren (das Relais hält diesen ja Stromkreis noch offen).&lt;br /&gt;
&lt;br /&gt;
b. Startet man aber das Script wieder (&amp;lt;tt&amp;gt;python wandler.py&amp;lt;/tt&amp;gt;) oder klickt auf &#039;Output Pin 1&#039; wird der Nutzstromkreis geschlossen. Nochmals aufgepasst: unser Nutzer erhält wieder die maximal vorgesehene Spannung - also besser vorher im Script &amp;quot;&amp;lt;tt&amp;gt;sleep(0.3)&amp;lt;/tt&amp;gt;&amp;quot; setzen und speichern.&lt;br /&gt;
&lt;br /&gt;
c. Im Prinzip ist damit die programmgesteuerte Umsetzung eines 0/1 Signals in z.B. eine 0V/15V Spannung erreicht.&lt;br /&gt;
&lt;br /&gt;
d. Da wir bald verschiedene Steuerspannungen schalten wollen, geht es jetzt darum herauszufinden, bei welcher Spannung unser Nutzgerät gerade noch bewegt wird. Dies probiert man aus - mit dem kleinsten Widerstand beginnend: indem einer der Drähte in eine freie Breadboardspalte gesteckt wird und aus dieser Spalte der Widerstand zu dem &#039;alten&#039; Steckplatz des Drahtes geführt wird. Nun startet man jeweils das Script bis der Widerstand so hoch ist, dass die Anlaufspannung beim Nutzgerätes gut ausreicht, eine Reaktion des Nutzgerät (Fahrzeug bewegt sich) zu bewirken (z.B. bei 50 Ohm beträgt der Strom im Mittel ca. 130 mA während ohne 190 mA fließen).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Ansteuerung von 3 Schaltstufen =&lt;br /&gt;
&lt;br /&gt;
== Kombination von 2 Relais ==&lt;br /&gt;
&lt;br /&gt;
[[Bild:ZrelMww2.png|thumb|right|250px|Beschaltung der Relais]] a. Die einfachste Stufe der weiteren Verschaltung erreicht man, indem der Widerstand mit einem 2. Relais überbrückt wird. Relais 1 kann dann als &#039;Hauptschalter&#039;, Relais 2 als Spannungsumschalter genutzt werden:&lt;br /&gt;
&lt;br /&gt;
b. Diese Beschaltung kann sogleich mit dem PiFace-Emulator ausprobiert werden. Damit können wir bereits 3 Schaltstufen steuern: keine, verminderte und volle Spannung.&lt;br /&gt;
&lt;br /&gt;
c. Theoretisch ließe sich auch noch eine 4. Spannungsstufe erzeugen, da mit 2 &#039;Bits&#039; (Ein/Aus bei 2 Relais) bereits 4 verschiedene Signale darstellbar sind. Beim jetzigen Aufbau werden aber lediglich die (pin1,pin2)-Signale (0,0), (1,0) und (1,1) &#039;genutzt&#039;, da Relais 1 als Hauptschalter vorgesehen ist und die Kombination (0,1) so nicht ausgewertet wird.&lt;br /&gt;
&lt;br /&gt;
== Programmgesteuerte Schaltung von 2 Relais ==&lt;br /&gt;
&lt;br /&gt;
a. Mit einem veränderten python-Script &amp;quot;wandler2.py&amp;quot; ist auch die programmgesteuerte Schaltung möglich. Dabei werden zusätzlich die Tasten 1 und 2 des PiFace genutzt, um nach dem Start des Scripts (&amp;lt;tt&amp;gt;python wandler2.py&amp;lt;/tt&amp;gt;) den Hauptschalter (Relais 1) zu steuern:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler2.py&lt;br /&gt;
 &lt;br /&gt;
 from time import sleep&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
 pfio.init()&lt;br /&gt;
 &lt;br /&gt;
 taste_1=0&lt;br /&gt;
 taste_2=0&lt;br /&gt;
 intervall_a=0.1&lt;br /&gt;
 intervall_b=0.5&lt;br /&gt;
 # Die Intervalle bestimmen die Schaltzeit für volle/verminderte Spannung&lt;br /&gt;
 &lt;br /&gt;
 print &amp;quot;Zum Start Taste 1 drücken, zum Stoppen Taste 2&amp;quot;&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 while taste_1 == 0:&lt;br /&gt;
   sleep(intervall_a)&lt;br /&gt;
   taste_1=pfio.digital_read(1)&lt;br /&gt;
&lt;br /&gt;
 # Der o.g. &#039;sleep&#039;-Befehl bestimmt die Abfragepausen für Taste 1&lt;br /&gt;
 &lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
 print &amp;quot;Strom an!&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 while taste_2 == 0:&lt;br /&gt;
   pfio.digital_write(2,1)&lt;br /&gt;
   sleep(intervall_a)&lt;br /&gt;
   pfio.digital_write(2,0)&lt;br /&gt;
   sleep(intervall_b)&lt;br /&gt;
   taste_2=pfio.digital_read(2)&lt;br /&gt;
 &lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Strom aus!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
b. Falls beim Ausprobieren von Script-Änderungen mal was schief geht, kann das Script stets auch mit der Tastenkombination (CNTRL-C) gestoppt werden. U.U. muss dann noch zusätzlich Relais 1 und/oder 2 via Emulator zurückgesetzt werden.&lt;br /&gt;
&lt;br /&gt;
c. Beim Verändern des Scripts fällt bald auf, dass die bisherige Programmsteuerung keine direkte Möglichkeit vorsieht, auf Ereignisse zu reagieren. Immerhin wird ein mechanisches Gerät gesteuert, bei dem mit Ausfällen, Fertigungstoleranzen, Umwelteinflüssen etc. zu rechnen ist (im Script wird dies bislang &#039;nur&#039; durch die Abbruchbedingung &#039;Taste 2&#039; berücksichtigt).&lt;br /&gt;
&lt;br /&gt;
== Einfache Sensor-Signale als steuernde Elemente eines Programms ==&lt;br /&gt;
&lt;br /&gt;
a. Eine wichtige Anwendung von D/A-Steuerungen ist die mögliche Reaktion dieser Steuerung auf &#039;äußere&#039; Ereignisse, die z.B. mit Hilfe von Sensoren leistbar ist.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Einf_Sens.jpg|thumb|right|250px|einfacher Sensor]]b. Für unsere Zwecke genügt zunächst ein sehr einfacher Sensor, der ein 0- oder 1-Signal liefert und idealerweise direkt am &#039;Input Pin 1&#039; des PiFace angeschlossen werden kann. So liegt beim Input Pin 1 das Signal &#039;1&#039; an, wenn eine Verbindung zu &#039;Input GND&#039; besteht.&lt;br /&gt;
Z.B. können 2 unisolierte Drähte so platziert werden, dass ein vorbeifahrendes Fahrzeug einen von ihnen genügend bewegt um den Kontakt kurze Zeit zu öffnen. Genau dann liefert dieser &#039;Sensor&#039; das Signal &#039;0&#039;. Eine - die Schwerkraft nutzende - mögliche Bauform ist rechts abgebildet ;-)&lt;br /&gt;
&lt;br /&gt;
c. Natürlich werden zusätzlich 2 isolierte Drähte benötigt, um jeden der beiden offenen Drähte geschützt mit Input Pin 1 und Input GND zu verbinden.&lt;br /&gt;
&lt;br /&gt;
d. Bei jeder Durchfahrt liefert der Sensor nun ein &#039;0&#039;-Signal, was im Script sowohl für eine Zeitmessung als auch für ein &#039;Schaltintervall-Array&#039; genutzt werden kann. Dort können abwechselnd für beide Spannungen Zeiten (die in etwa zum jeweiligen Streckenabschnitt passen) &#039;programmiert&#039; werden. Statt Taste 1 wird nun der Sensor ausgewertet (wobei Taste 1 als Sensor-Ersatz insoweit genutzt werden kann, dass sie gedrückt bleiben bzw. kurz losgelassen werden muss). Zur genaueren Zeitmessung wird noch das modul &#039;clock&#039; benötigt. &amp;quot;&amp;lt;tt&amp;gt;wandler3.py&amp;lt;/tt&amp;gt;&amp;quot; könnte also so aussehen:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler3.py&lt;br /&gt;
 &lt;br /&gt;
 from time import clock&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
 sensor_1=1&lt;br /&gt;
 sensor_2=0&lt;br /&gt;
 rundenzahl=0&lt;br /&gt;
 v_wechsel=0&lt;br /&gt;
 vorrunde=0&lt;br /&gt;
 index_zaehler=1&lt;br /&gt;
 &lt;br /&gt;
 zeit_array=[0,0.2,0.4,0.2,0.4,0.2,0.4,0.2,5,0.2,6]&lt;br /&gt;
 # dieses array enthält die sek. bis zum Spannungswechsel&lt;br /&gt;
&lt;br /&gt;
 array_laenge=9&lt;br /&gt;
 # legt fest, wie viel Werte des arrays genutzt werden sollen&lt;br /&gt;
 &lt;br /&gt;
 sensor_aus=1.3&lt;br /&gt;
 # bis der Sensor sicher in die Ruhestellung kippt, wird er nicht ausgelesen&lt;br /&gt;
  &lt;br /&gt;
 pfio.init()&lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
&lt;br /&gt;
 # das Fahrzeug wird langsam zum Start (=Sensor) bewegt&lt;br /&gt;
 while sensor_1 == 1 :&lt;br /&gt;
   sensor_1=pfio.digital_read(1)&lt;br /&gt;
  &lt;br /&gt;
 print &amp;quot;fliegender Start... zum Beenden Taste 2 drücken&amp;quot;&lt;br /&gt;
 print &amp;quot;Runde Nr., Ges.Zeit, Rundenzeit, mittlere Rundenzeit&amp;quot;&lt;br /&gt;
 start_zeit=clock()&lt;br /&gt;
 runden_start=start_zeit&lt;br /&gt;
  &lt;br /&gt;
 while sensor_2 == 0 :&lt;br /&gt;
   sensor_2=pfio.digital_read(2)&lt;br /&gt;
   v_wechsel=1-v_wechsel&lt;br /&gt;
   pfio.digital_write(2,v_wechsel)&lt;br /&gt;
   sensor_zeit=clock()&lt;br /&gt;
  &lt;br /&gt;
   while zeit_array[index_zaehler]+sensor_zeit &amp;gt; clock() :&lt;br /&gt;
     if runden_start+sensor_aus &amp;lt; clock() :&lt;br /&gt;
 &lt;br /&gt;
       sensor_1=pfio.digital_read(1) &lt;br /&gt;
       if sensor_1 == 0 :&lt;br /&gt;
         rundenzahl=rundenzahl+1&lt;br /&gt;
         runden_start=clock()&lt;br /&gt;
         zeit=runden_start-start_zeit&lt;br /&gt;
         print rundenzahl, zeit, zeit-vorrunde, zeit/rundenzahl&lt;br /&gt;
         vorrunde=zeit&lt;br /&gt;
         sensor_zeit=0&lt;br /&gt;
         index_zaehler=0&lt;br /&gt;
         v_wechsel=0&lt;br /&gt;
  &lt;br /&gt;
   index_zaehler=index_zaehler+1&lt;br /&gt;
   if index_zaehler &amp;gt; array_laenge :&lt;br /&gt;
     sensor_2=1&lt;br /&gt;
     print &amp;quot;array-Ende erreicht!&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Outp 1 &amp;amp; 2 auf 0!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wird das Array-Ende erreicht, wurden entweder zu wenige Einträge vorgesehen oder es befindet sich kein Fahrzeug (mehr) auf der Strecke, das den Sensor und damit des Zurücksetzen des Arrays auslösen konnte.&lt;br /&gt;
&lt;br /&gt;
e. Das Array ist an die jeweilige Strecke anzupassen, wobei der vorderste Eintrag ungenutzt bleibt und dann mit der Dauer für maximale Spannung begonnen wird. Solange man mit Relais arbeitet, sollten die Schaltzeiten nicht zu kurz sein (&amp;gt;0.1 sek.), da diese eine gewisse mechanische Trägheit besitzen.&lt;br /&gt;
&lt;br /&gt;
f. Eben diese mechanische Beschaffenheit der Relais (Verschleiß) ist auch ein guter Grund, auf &#039;volle&#039; digitale Signalumwandlung umzustellen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Optokoppler als Ersatz für Relais =&lt;br /&gt;
&lt;br /&gt;
Ähnlich wie ein Relais dient ein [[Optokoppler]] dazu, eine Signalübertragung zwischen zwei getrennten Stromkreisen zu ermöglichen. Bei diesem Projekt liegt der Einsatz von Optokopplern nahe, da sie schneller schalten und keine beweglichen Teile besitzen. Für unsere Zwecke benötigen wir nun als zusätzliche Elemente: Optokoppler (CNY 17-4), npn-[[Transistor]]en (BC 337-40) zur Signalverstärkung sowie einige Widerstände im Bereich von 2k und 400 Ohm. &lt;br /&gt;
&lt;br /&gt;
== Kaskadierung von Transistoren zur Signalverstärkung ==&lt;br /&gt;
&lt;br /&gt;
a. Entsprechend Schritt 2.4.d. (ein Relais bei 50 Ohm) wird zunächst ein [[Optokoppler]] eingesetzt, dessen Signal durch einen Transistor verstärkt wird, um die &#039;Grundspannung&#039; zu schalten (Pin 3 und 6 beim Optokoppler sollten unbeschaltet bleiben, allein der &#039;Lichtstrom&#039; reicht für eine Ansteuerung aus):&lt;br /&gt;
&lt;br /&gt;
[[Bild:PiF_CNY_BC_1.png|400px|Optokoppler mit Transistor]]&lt;br /&gt;
&lt;br /&gt;
b. Da immer mit einer gewissen Toleranz bei allen Komponenten zu rechnen ist, kann es sein, dass u.U. die Widerstände etwas größer oder kleiner gewählt werden müssen. Beim Ausprobieren sollte man hier in 10% Schritten variieren.&lt;br /&gt;
&lt;br /&gt;
c. Bei Austesten mit Emulator oder Script ist auch zu beachten, dass nun &#039;Output Pin 8&#039; genutzt wird, da dieser nicht mit den Relais verschaltet ist.&lt;br /&gt;
&lt;br /&gt;
== Umsetzung von 3 Schaltstufen mit Optokopplern ==&lt;br /&gt;
&lt;br /&gt;
a. Entsprechend dem Vorgehen beim Relais kann nun auch der kleine Widerstand zusätzlich beschaltet werden um seine gesteuerte Überbrückung zu ermöglichen. Da hier eine relativ geringe Spannung aufgeschaltet wird, kann zu Beginn eine Diode eingesetzt werden, die die Schaltstufe &#039;maximale Spannung&#039; anzeigt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:SmPiFu2ou2T.png|400px|Kombination von 2 Optokopplern]]&lt;br /&gt;
&lt;br /&gt;
b. Vor dem Testen ist wieder zu beachten, dass nun zusätzlich &#039;Output Pin 7&#039; genutzt wird (statt Output Pin 2).&lt;br /&gt;
&lt;br /&gt;
c. Neben dem Weglassen der Diode (was die Maximalgeschwindigkeit leicht erhöht), können auch statt der 400 Ohm Widerstände 1k-Werte oder höher gewählt werden, wenn dadurch der jeweilige [[Basisstrom]] noch hoch genug ist. Im vorliegenden Fall war erst ab 400 Ohm keine weitere Tempoerhöhung mehr feststellbar.&lt;br /&gt;
&lt;br /&gt;
d. Eine mögliche Realisierung sieht so aus: http://youtu.be/xQ7N-PrIULk&lt;br /&gt;
&lt;br /&gt;
== Zusätzliche Erhöhung der Schaltstufen bei D/A-Wandlern ==&lt;br /&gt;
&lt;br /&gt;
a. Zwar benötigen wir in unserem speziellen Beispiel eine &#039;Grundspannung&#039;, die sich dahingehend auswirkt, dass - wie unter 3.1.c. erwähnt - eine Signalkombination nicht ausgewertet wird, aber mit jeder weiteren Schaltstufe würde sich dieses Problem (theoretisch) relativieren, da bei geschickter Auswahl der Widerstände (z.B. im Verhältnis 1 zu 2) jeweils eine Verdoppelung der Kombinationsmöglichkeiten erreichbar ist.&lt;br /&gt;
&lt;br /&gt;
b. Wird hier der 50 Ohm Widerstand asymmetrisch geteilt (z.B. 15 + 35 Ohm, s.a. [[Spannungsteiler]]) um dort ein weiteres Signal umsetzen zu können, ergeben sich direkt folgende 5 Schaltstufen (aus, 50, 35, 15 und 0 Ohm) u.s.w.:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Sm3ou3t2.png|400px|Erhöhung der Schaltstufen]]&lt;br /&gt;
&lt;br /&gt;
c. Zur Ansteuerung dieser Schaltstufen wäre das Script so zu ändern, dass nun zwischen mehr als 2 Stufen gewechselt werden kann und im Array entsprechende Zusatzdaten vorgegeben und ausgelesen werden. Mehr als diese Stufen sind im konkreten Fall aber nicht sinnvoll, da die entstehende Verlustleistung in der Schaltung die maximal verfügbare Leistung reduziert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Weiterführende Ideen =&lt;br /&gt;
&lt;br /&gt;
Die Ausbaumöglichkeiten dieses Projektes sind vielfältig:&lt;br /&gt;
&lt;br /&gt;
== Hardwareseitige Ausbauvarianten ==&lt;br /&gt;
&lt;br /&gt;
- beispielhafte Umsetzung einer differenzierten Abstufung mittels einer logarithmischen Einteilung oder eines möglichst oft durch 2 teilbaren Anfangswertes und der Teiler (640 Ohm, 320, 160...);&lt;br /&gt;
&lt;br /&gt;
- Nachbau des Projekts mit einem Mikrocontroller (ggf. mit LCD-Anzeige);&lt;br /&gt;
&lt;br /&gt;
- Umbau der Steuerung mit dem Ziel, sie direkt an die GPIO-Pins des RPi anzuschließen;&lt;br /&gt;
&lt;br /&gt;
- Entwurf einer Zusatzschaltung, die in diesem Beispiel eine Rückmeldung liefert, ob ein Verbraucher aktiv ist oder nicht (Fahrzeug noch auf der Strecke?);&lt;br /&gt;
&lt;br /&gt;
- Entwurf einer Zusatzschaltung, die erkennt wie viel Strom fliesst: damit wären Rückschlüsse auf den Streckenverlauf möglich (Kurve=etwas mehr Strom, Steigung=noch mehr Strom nötig, etc.) und auch eine programmgesteuerte Optimierung der Array-Schaltzeiten dankbar; &lt;br /&gt;
&lt;br /&gt;
- Einsatz anderer Sensortechniken und/oder mehrerer Sensoren zur Optimierung der Schnelligkeit oder parallelen Steuerung eines 2. Fahrzeuges;&lt;br /&gt;
&lt;br /&gt;
== Softwareseitige Ausbauvarianten ==&lt;br /&gt;
&lt;br /&gt;
- Optimierung des Scripts, indem die Sensor-Abfrage über einen &#039;Listener&#039; umgesetzt wird;&lt;br /&gt;
&lt;br /&gt;
- Erweiterung des Scripts um eine GUI mit Hilfe der python-lib Tkinter, um einen Nutzerzugriff auf das Steuerarray und/oder eine &#039;Verwaltung&#039; mehrerer Fahrzeuge;&lt;br /&gt;
&lt;br /&gt;
- Einbindung eines Web-Interface um eine &#039;Fernsteuerung&#039; zu ermöglichen...&lt;br /&gt;
&lt;br /&gt;
...in jedem Fall: viel Spaß beim Basteln!&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [http://hackaday.com/2013/01/23/replacement-controllers-for-slot-car-racing/ ähnliches Projekt bei &#039;hackaday&#039;] &lt;br /&gt;
* [https://docs.google.com/folder/d/0B-UAZ9CyJCLGQjJ3RDlqa2pqaDg/edit?pli=1&amp;amp;docId=0B-UAZ9CyJCLGNmpMeVpyYlZJUWc Relaisschaltung mit pädagogischer Erweiterung der Universität Manchester (englischspr.)]&lt;br /&gt;
* [http://elinux.org/RPi_Projects/PiFace_controlling_a_slot-car paralleler englischsp. Bericht des Autors zum RPi mit anderem Schwerpunkt] &lt;br /&gt;
* [http://elinux.org/RPi_Projects englischsp. Projektliste zum RPi]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/GhostCarProjekt Verlagerung der gesamten Steuerelektronik ins Fahrzeug]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Raspberry Pi]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Mknot9</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=RPi_als_D/A-Wandler&amp;diff=74400</id>
		<title>RPi als D/A-Wandler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=RPi_als_D/A-Wandler&amp;diff=74400"/>
		<updated>2013-03-08T18:13:30Z</updated>

		<summary type="html">&lt;p&gt;Mknot9: /* Siehe auch */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von mknot9&#039;&#039; (M. Knoop)&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
Oft wird ein Computer &#039;nur&#039; genutzt um darauf Software ablaufen zu lassen. Dessen Möglichkeit zur Steuerung von elektrischen und mechanischen Geräten wird dabei leicht übersehen.&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel richtet sich daher an Einsteiger, die mit dem [[Raspberry Pi]] (&#039;RPi&#039;) Grundlagen der Computersteuerung mit Relais und [[Spannungsteiler]]n nachvollziehen möchten. Es wird schrittweise dargestellt, wie mittels eines D/A-Wandlers (Digital/Analog-Wandler = Umwandlung von digitalen 1/0 Signale) die Steuerung einer stufenweise veränderbaren Ausgangsspannung aufgebaut werden kann.&lt;br /&gt;
&lt;br /&gt;
= Verwendete Hardware =&lt;br /&gt;
&lt;br /&gt;
== RPi in Kombination mit der &#039;PiFace&#039;-Karte als Bastelplattform ==&lt;br /&gt;
&lt;br /&gt;
Dank der einfachen Bauweise bietet sich der RPi mit seinen frei zugänglichen GPIO-Pins als ideale Bastelplattform an. Trotzdem kann es beim anfänglichen Experimentieren mit Schaltungen öfters zu kleinen Fehlern kommen, die schlimmstenfalls die empfindliche Elektronik des RPi dauerhaft beschädigen können.&lt;br /&gt;
&lt;br /&gt;
Daher wird bei diesem Projekt zusätzlich mit der &#039;PiFace[http://elinux.org/RPi_Expansion_Boards#Piface]&#039;-Karte gearbeitet, die man auf die GPIO-Pins stecken kann. Diese Erweiterungskarte verschaltet die GPIO-Pins auf je 8 digitale Ein- und Ausgänge sowie 2 Relais, die eine galvanische Trennung von Stromkreisen ermöglichen. Damit besteht auch für Einsteiger ein gewisser Schutz für die Steuerelektronik des RPi.&lt;br /&gt;
&lt;br /&gt;
Auch im weiteren Verlauf dieser Einführung soll noch auf eine Trennung der Stromkreise Wert gelegt werden, so dass für erste digitale Schaltexperimente ein Optokoppler genutzt wird. Die spätere Nutzung der &#039;Input Pins&#039; des PiFace um eine Steuerung der D/A-Wandlung durch bestimmte Ereignisse zu ermöglichen, erfolgt ebenfalls passiv.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Auch wenn mit vermeintlich &#039;sicheren&#039; Transformatoren gebastelt wird, muss stets bedacht werden, dass diese an einem 230V-Stromnetz betrieben werden und man eher einmal mehr als weniger prüfen sollte, ob man durch eventuelle Fehler mit lebensgefährlicher Spannung in Berührung kommt!&lt;br /&gt;
&lt;br /&gt;
== Auswahl eines Beispielprojektes ==&lt;br /&gt;
&lt;br /&gt;
Günstige Möglichkeiten ein Gerät zu finden, das mit analogen Spannungen arbeitet, bieten sich u.a. im Spielzeugbereich. Im Grunde eignet sich alles, was mit Batterien oder mit Gleichspannungen unter 24 V betrieben wird.&lt;br /&gt;
&lt;br /&gt;
Da jedoch ein Ziel das Steuern von analogen Spannungen ist, bietet sich insbesondere alles an, bei dem [[Potentiometer]] eingesetzt werden. Einen dieser &#039;Handregler&#039; sollte man übrig haben, da er von seinem Anschlusskabel abgetrennt werden muss, um den oft proprietären Steckanschluss nutzen zu können. In diesem Sinne wird hier eine handelsübliche Spielzeug-Autorennbahn mit Potentiometer-Handreglern genutzt.&lt;br /&gt;
&lt;br /&gt;
== Sonstige Bauteile ==&lt;br /&gt;
&lt;br /&gt;
Für die ersten Grundlagen (s. Teile 2 &amp;amp; 3) genügen bereits rund 2 m isolierter Draht, der nicht aus verdrillten feinen Adern (Litze) bestehen sollte, 50 cm nicht-isolierter Draht, einige niederohmige Widerstände (z.B. je 2 mal 100 Ohm, 80, 60, sowie 20) und ein &#039;Experimentierbrett&#039; (engl. [[Breadboard]]).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Grundlagen und Vorbereitung des Projekts =&lt;br /&gt;
&lt;br /&gt;
== Umwandlung von 1/0 zu Ein/Aus mit einem Relais ==&lt;br /&gt;
&lt;br /&gt;
Vom Prinzip her ist jede Umwandlung eines digitalen 0 oder 1 Signals (das über eine bestimmte Spannungsdifferenz festgelegt ist) in eine (nutzbare) Spannung bereits eine D/A-Wandlung. Dies wird schlicht so realisiert, dass mit einer Eingabe am RPi die Nutzspannung des &#039;Verbrauchers&#039; zunächst einfach an- und ausgeschaltet wird.&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung der zu steuernden Hardware ==&lt;br /&gt;
&lt;br /&gt;
a. Um Fehlerquellen auszuschließen sollte zunächst (und ggf. auch später!) kurz getestet werden, ob der vorhandene Regler wie erwartet funktioniert.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pif_Con9.jpg|thumb|right|400px|Fixierung der Reglerkabel]]&lt;br /&gt;
b. Nach dem Trennen des Reglers von der Einspeisung (und ggf. Ziehen des Netzsteckers) muss das Regler-Kabel abgeschnitten werden (eher nahe beim Regler, da das Kabel bald bis zum Breadboard reichen soll). Die neuen Enden des Einspeiseteils werden abisoliert und auf dem Breadboard diagonal zueinander mit einigen Spalten Abstand fixiert. Auch können bereits die Drähte, die später zum RPi führen, jeweils in den passenden kontaktführenden Spalten eingesteckt werden, z. B. wie rechts zu sehen (die nicht beschrifteten Drähte können vorerst ignoriert werden):&lt;br /&gt;
&lt;br /&gt;
c. Nun bietet sich eine gute Gelegenheit die maximale Spannung am Nutzgerät zu messen. Man verbindet das Regler-Kabel (nun ohne Regler) wieder mit der Einspeisung und die offenen Enden der Drähte mit dem Messgerät, bei dem zunächst ein Messbereich von ca. 10-50 Volt gewählt werden sollte. Dies sollte dann z.B. 14,8 V anzeigen. Natürlich können auch die beiden offenen Enden einen kleinen Moment kurz geschlossen werden, man sollte aber bedenken, dass das zu regelnde Nutzgerät dann die maximal vorgesehene Spannung erhält (hier: maximales Tempo).&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung des RPi ==&lt;br /&gt;
&lt;br /&gt;
Es wird davon ausgegangen, dass entsprechend des zugehörigen &#039;manual&#039; das PiFace bereits auf den RPi gesteckt ist, die nötigen python-Bibliotheken installiert sind und man sich im Terminal-Arbeitsverzeichnis &#039;pi&#039; befindet.&lt;br /&gt;
&lt;br /&gt;
a. Zunächst wird der PiFace-Emulator (im Terminal direkt aus dem Arbeitsverzeichnis) gestartet: &amp;lt;tt&amp;gt;piface/scripts/piface-emulator&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b. Wenn alles richtig installiert wurde, erscheint ein Fenster (unten links), bei dem die vorerst wichtigen blauen Signale am rechten Rand wie folgt angezeigt werden sollten: &lt;br /&gt;
 &lt;br /&gt;
[[Datei:RPi_PiF_em-scs.jpg|400px|Piface-Emulator im default-Zustand]] [[Datei:RPi_PiF_em_scs1.jpg|400px|Piface-Relais 1 auf &#039;1&#039; geschaltet]]&lt;br /&gt;
&lt;br /&gt;
c. Das rechte Fenster ergibt sich, wenn man nun im Fenster auf &amp;quot;Override Enable&amp;quot; und dann &amp;quot;Output Pin 1&amp;quot; klickt. Es müsste ein &amp;quot;Klick&amp;quot; vom Relais 1 zu hören sein sowie der Schaltzustand des unteren Relais 1 (das an den Output Pin 1 gekoppelt ist) auf die Verbindung der beiden unteren Anschlüsse wechseln. Zugleich wird das erste LED-Icon beim Output Pin 1 rot sowie das zugehörige LED-Icon blau.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pif_rel2.png|thumb|right|250px|Schema der Piface-Relais]]&lt;br /&gt;
d. Rechts ist der Schaltzustand der Relais, die zu Beginn genutzt werden, im Grundzustand dargestellt (jeweils der mittlere und obere Kontakt sind kurzgeschlossen, der jeweils untere Kontakt ist frei):&lt;br /&gt;
&lt;br /&gt;
e. Ein weiterer Klick auf &amp;quot;Output Pin 1&amp;quot; versetzt das Relais in den Ausgangszustand, der vor dem nächsten Schritt wieder eingestellt werden sollte.&lt;br /&gt;
&lt;br /&gt;
f. Das Relais lässt sich auch mittels eines Python-Scripts vom RPi aus ansteuern. Dazu wird folgende Textdatei &amp;quot;wandler.py&amp;quot; im Arbeitsverzeichnis abgespeichert und mit dem Befehl &amp;quot;&amp;lt;tt&amp;gt;python wandler.py&amp;lt;/tt&amp;gt;&amp;quot; gestartet:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler.py&lt;br /&gt;
&lt;br /&gt;
 from time import sleep&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
&lt;br /&gt;
 pfio.init()&lt;br /&gt;
&lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
 print &amp;quot;Strom an&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 sleep(2)&lt;br /&gt;
&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Strom aus&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Nach dem Absetzen des Befehls wechselt nun das blaue Signal an Relais 1 für 2 Sekunden und das Relais klickt entsprechend.&lt;br /&gt;
&lt;br /&gt;
== Einsatz eines Relais&#039; zur Umsetzung von Spannungsänderungen ==&lt;br /&gt;
&lt;br /&gt;
a. Ist das Relais wieder im Ausgangszustand, befestigt man nun einen der vom Breadboard führenden Drähte am unteren und einen am mittleren Relaiseingang (im Moment ist die Polarität noch egal). Zunächst sollte nichts passieren (das Relais hält diesen ja Stromkreis noch offen).&lt;br /&gt;
&lt;br /&gt;
b. Startet man aber das Script wieder (&amp;lt;tt&amp;gt;python wandler.py&amp;lt;/tt&amp;gt;) oder klickt auf &#039;Output Pin 1&#039; wird der Nutzstromkreis geschlossen. Nochmals aufgepasst: unser Nutzer erhält wieder die maximal vorgesehene Spannung - also besser vorher im Script &amp;quot;&amp;lt;tt&amp;gt;sleep(0.3)&amp;lt;/tt&amp;gt;&amp;quot; setzen und speichern.&lt;br /&gt;
&lt;br /&gt;
c. Im Prinzip ist damit die programmgesteuerte Umsetzung eines 0/1 Signals in z.B. eine 0V/15V Spannung erreicht.&lt;br /&gt;
&lt;br /&gt;
d. Da wir bald verschiedene Steuerspannungen schalten wollen, geht es jetzt darum herauszufinden, bei welcher Spannung unser Nutzgerät gerade noch bewegt wird. Dies probiert man aus - mit dem kleinsten Widerstand beginnend: indem einer der Drähte in eine freie Breadboardspalte gesteckt wird und aus dieser Spalte der Widerstand zu dem &#039;alten&#039; Steckplatz des Drahtes geführt wird. Nun startet man jeweils das Script bis der Widerstand so hoch ist, dass die Anlaufspannung beim Nutzgerätes gut ausreicht, eine Reaktion des Nutzgerät (Fahrzeug bewegt sich) zu bewirken (z.B. bei 50 Ohm beträgt der Strom im Mittel ca. 130 mA während ohne 190 mA fließen).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Ansteuerung von 3 Schaltstufen =&lt;br /&gt;
&lt;br /&gt;
== Kombination von 2 Relais ==&lt;br /&gt;
&lt;br /&gt;
[[Bild:ZrelMww2.png|thumb|right|250px|Beschaltung der Relais]] a. Die einfachste Stufe der weiteren Verschaltung erreicht man, indem der Widerstand mit einem 2. Relais überbrückt wird. Relais 1 kann dann als &#039;Hauptschalter&#039;, Relais 2 als Spannungsumschalter genutzt werden:&lt;br /&gt;
&lt;br /&gt;
b. Diese Beschaltung kann sogleich mit dem PiFace-Emulator ausprobiert werden. Damit können wir bereits 3 Schaltstufen steuern: keine, verminderte und volle Spannung.&lt;br /&gt;
&lt;br /&gt;
c. Theoretisch ließe sich auch noch eine 4. Spannungsstufe erzeugen, da mit 2 &#039;Bits&#039; (Ein/Aus bei 2 Relais) bereits 4 verschiedene Signale darstellbar sind. Beim jetzigen Aufbau werden aber lediglich die (pin1,pin2)-Signale (0,0), (1,0) und (1,1) &#039;genutzt&#039;, da Relais 1 als Hauptschalter vorgesehen ist und die Kombination (0,1) so nicht ausgewertet wird.&lt;br /&gt;
&lt;br /&gt;
== Programmgesteuerte Schaltung von 2 Relais ==&lt;br /&gt;
&lt;br /&gt;
a. Mit einem veränderten python-Script &amp;quot;wandler2.py&amp;quot; ist auch die programmgesteuerte Schaltung möglich. Dabei werden zusätzlich die Tasten 1 und 2 des PiFace genutzt, um nach dem Start des Scripts (&amp;lt;tt&amp;gt;python wandler2.py&amp;lt;/tt&amp;gt;) den Hauptschalter (Relais 1) zu steuern:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler2.py&lt;br /&gt;
 &lt;br /&gt;
 from time import sleep&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
 pfio.init()&lt;br /&gt;
 &lt;br /&gt;
 taste_1=0&lt;br /&gt;
 taste_2=0&lt;br /&gt;
 intervall_a=0.1&lt;br /&gt;
 intervall_b=0.5&lt;br /&gt;
 # Die Intervalle bestimmen die Schaltzeit für volle/verminderte Spannung&lt;br /&gt;
 &lt;br /&gt;
 print &amp;quot;Zum Start Taste 1 drücken, zum Stoppen Taste 2&amp;quot;&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 while taste_1 == 0:&lt;br /&gt;
   sleep(intervall_a)&lt;br /&gt;
   taste_1=pfio.digital_read(1)&lt;br /&gt;
&lt;br /&gt;
 # Der o.g. &#039;sleep&#039;-Befehl bestimmt die Abfragepausen für Taste 1&lt;br /&gt;
 &lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
 print &amp;quot;Strom an!&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 while taste_2 == 0:&lt;br /&gt;
   pfio.digital_write(2,1)&lt;br /&gt;
   sleep(intervall_a)&lt;br /&gt;
   pfio.digital_write(2,0)&lt;br /&gt;
   sleep(intervall_b)&lt;br /&gt;
   taste_2=pfio.digital_read(2)&lt;br /&gt;
 &lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Strom aus!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
b. Falls beim Ausprobieren von Script-Änderungen mal was schief geht, kann das Script stets auch mit der Tastenkombination (CNTRL-C) gestoppt werden. U.U. muss dann noch zusätzlich Relais 1 und/oder 2 via Emulator zurückgesetzt werden.&lt;br /&gt;
&lt;br /&gt;
c. Beim Verändern des Scripts fällt bald auf, dass die bisherige Programmsteuerung keine direkte Möglichkeit vorsieht, auf Ereignisse zu reagieren. Immerhin wird ein mechanisches Gerät gesteuert, bei dem mit Ausfällen, Fertigungstoleranzen, Umwelteinflüssen etc. zu rechnen ist (im Script wird dies bislang &#039;nur&#039; durch die Abbruchbedingung &#039;Taste 2&#039; berücksichtigt).&lt;br /&gt;
&lt;br /&gt;
== Einfache Sensor-Signale als steuernde Elemente eines Programms ==&lt;br /&gt;
&lt;br /&gt;
a. Eine wichtige Anwendung von D/A-Steuerungen ist die mögliche Reaktion dieser Steuerung auf &#039;äußere&#039; Ereignisse, die z.B. mit Hilfe von Sensoren leistbar ist.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Einf_Sens.jpg|thumb|right|250px|einfacher Sensor]]b. Für unsere Zwecke genügt zunächst ein sehr einfacher Sensor, der ein 0- oder 1-Signal liefert und idealerweise direkt am &#039;Input Pin 1&#039; des PiFace angeschlossen werden kann. So liegt beim Input Pin 1 das Signal &#039;1&#039; an, wenn eine Verbindung zu &#039;Input GND&#039; besteht.&lt;br /&gt;
Z.B. können 2 unisolierte Drähte so platziert werden, dass ein vorbeifahrendes Fahrzeug einen von ihnen genügend bewegt um den Kontakt kurze Zeit zu öffnen. Genau dann liefert dieser &#039;Sensor&#039; das Signal &#039;0&#039;. Eine - die Schwerkraft nutzende - mögliche Bauform ist rechts abgebildet ;-)&lt;br /&gt;
&lt;br /&gt;
c. Natürlich werden zusätzlich 2 isolierte Drähte benötigt, um jeden der beiden offenen Drähte geschützt mit Input Pin 1 und Input GND zu verbinden.&lt;br /&gt;
&lt;br /&gt;
d. Bei jeder Durchfahrt liefert der Sensor nun ein &#039;0&#039;-Signal, was im Script sowohl für eine Zeitmessung als auch für ein &#039;Schaltintervall-Array&#039; genutzt werden kann. Dort können abwechselnd für beide Spannungen Zeiten (die in etwa zum jeweiligen Streckenabschnitt passen) &#039;programmiert&#039; werden. Statt Taste 1 wird nun der Sensor ausgewertet (wobei Taste 1 als Sensor-Ersatz insoweit genutzt werden kann, dass sie gedrückt bleiben bzw. kurz losgelassen werden muss). Zur genaueren Zeitmessung wird noch das modul &#039;clock&#039; benötigt. &amp;quot;&amp;lt;tt&amp;gt;wandler3.py&amp;lt;/tt&amp;gt;&amp;quot; könnte also so aussehen:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler3.py&lt;br /&gt;
 &lt;br /&gt;
 from time import clock&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
 sensor_1=1&lt;br /&gt;
 sensor_2=0&lt;br /&gt;
 rundenzahl=0&lt;br /&gt;
 v_wechsel=0&lt;br /&gt;
 vorrunde=0&lt;br /&gt;
 index_zaehler=1&lt;br /&gt;
 &lt;br /&gt;
 zeit_array=[0,0.2,0.4,0.2,0.4,0.2,0.4,0.2,5,0.2,6]&lt;br /&gt;
 # dieses array enthält die sek. bis zum Spannungswechsel&lt;br /&gt;
&lt;br /&gt;
 array_laenge=9&lt;br /&gt;
 # legt fest, wie viel Werte des arrays genutzt werden sollen&lt;br /&gt;
 &lt;br /&gt;
 sensor_aus=1.3&lt;br /&gt;
 # bis der Sensor sicher in die Ruhestellung kippt, wird er nicht ausgelesen&lt;br /&gt;
  &lt;br /&gt;
 pfio.init()&lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
&lt;br /&gt;
 # das Fahrzeug wird langsam zum Start (=Sensor) bewegt&lt;br /&gt;
 while sensor_1 == 1 :&lt;br /&gt;
   sensor_1=pfio.digital_read(1)&lt;br /&gt;
  &lt;br /&gt;
 print &amp;quot;fliegender Start... zum Beenden Taste 2 drücken&amp;quot;&lt;br /&gt;
 print &amp;quot;Runde Nr., Ges.Zeit, Rundenzeit, mittlere Rundenzeit&amp;quot;&lt;br /&gt;
 start_zeit=clock()&lt;br /&gt;
 runden_start=start_zeit&lt;br /&gt;
  &lt;br /&gt;
 while sensor_2 == 0 :&lt;br /&gt;
   sensor_2=pfio.digital_read(2)&lt;br /&gt;
   v_wechsel=1-v_wechsel&lt;br /&gt;
   pfio.digital_write(2,v_wechsel)&lt;br /&gt;
   sensor_zeit=clock()&lt;br /&gt;
  &lt;br /&gt;
   while zeit_array[index_zaehler]+sensor_zeit &amp;gt; clock() :&lt;br /&gt;
     if runden_start+sensor_aus &amp;lt; clock() :&lt;br /&gt;
 &lt;br /&gt;
       sensor_1=pfio.digital_read(1) &lt;br /&gt;
       if sensor_1 == 0 :&lt;br /&gt;
         rundenzahl=rundenzahl+1&lt;br /&gt;
         runden_start=clock()&lt;br /&gt;
         zeit=runden_start-start_zeit&lt;br /&gt;
         print rundenzahl, zeit, zeit-vorrunde, zeit/rundenzahl&lt;br /&gt;
         vorrunde=zeit&lt;br /&gt;
         sensor_zeit=0&lt;br /&gt;
         index_zaehler=0&lt;br /&gt;
         v_wechsel=0&lt;br /&gt;
  &lt;br /&gt;
   index_zaehler=index_zaehler+1&lt;br /&gt;
   if index_zaehler &amp;gt; array_laenge :&lt;br /&gt;
     sensor_2=1&lt;br /&gt;
     print &amp;quot;array-Ende erreicht!&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Outp 1 &amp;amp; 2 auf 0!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wird das Array-Ende erreicht, wurden entweder zu wenige Einträge vorgesehen oder es befindet sich kein Fahrzeug (mehr) auf der Strecke, das den Sensor und damit des Zurücksetzen des Arrays auslösen konnte.&lt;br /&gt;
&lt;br /&gt;
e. Das Array ist an die jeweilige Strecke anzupassen, wobei der vorderste Eintrag ungenutzt bleibt und dann mit der Dauer für maximale Spannung begonnen wird. Solange man mit Relais arbeitet, sollten die Schaltzeiten nicht zu kurz sein (&amp;gt;0.1 sek.), da diese eine gewisse mechanische Trägheit besitzen.&lt;br /&gt;
&lt;br /&gt;
f. Eben diese mechanische Beschaffenheit der Relais (Verschleiß) ist auch ein guter Grund, auf &#039;volle&#039; digitale Signalumwandlung umzustellen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Optokoppler als Ersatz für Relais =&lt;br /&gt;
&lt;br /&gt;
Ähnlich wie ein Relais dient ein [[Optokoppler]] dazu, eine Signalübertragung zwischen zwei getrennten Stromkreisen zu ermöglichen. Bei diesem Projekt liegt der Einsatz von Optokopplern nahe, da sie schneller schalten und keine beweglichen Teile besitzen. Für unsere Zwecke benötigen wir nun als zusätzliche Elemente: Optokoppler (CNY 17-4), npn-[[Transistor]]en (BC 337-40) zur Signalverstärkung sowie einige Widerstände im Bereich von 2k und 400 Ohm. &lt;br /&gt;
&lt;br /&gt;
== Kaskadierung von Transistoren zur Signalverstärkung ==&lt;br /&gt;
&lt;br /&gt;
a. Entsprechend Schritt 2.4.d. (ein Relais bei 50 Ohm) wird zunächst ein [[Optokoppler]] eingesetzt, dessen Signal durch einen Transistor verstärkt wird, um die &#039;Grundspannung&#039; zu schalten (Pin 3 und 6 beim Optokoppler sollten unbeschaltet bleiben, allein der &#039;Lichtstrom&#039; reicht für eine Ansteuerung aus):&lt;br /&gt;
&lt;br /&gt;
[[Bild:PiF_CNY_BC_1.png|400px|Optokoppler mit Transistor]]&lt;br /&gt;
&lt;br /&gt;
b. Da immer mit einer gewissen Toleranz bei allen Komponenten zu rechnen ist, kann es sein, dass u.U. die Widerstände etwas größer oder kleiner gewählt werden müssen. Beim Ausprobieren sollte man hier in 10% Schritten variieren.&lt;br /&gt;
&lt;br /&gt;
c. Bei Austesten mit Emulator oder Script ist auch zu beachten, dass nun &#039;Output Pin 8&#039; genutzt wird, da dieser nicht mit den Relais verschaltet ist.&lt;br /&gt;
&lt;br /&gt;
== Umsetzung von 3 Schaltstufen mit Optokopplern ==&lt;br /&gt;
&lt;br /&gt;
a. Entsprechend dem Vorgehen beim Relais kann nun auch der kleine Widerstand zusätzlich beschaltet werden um seine gesteuerte Überbrückung zu ermöglichen. Da hier eine relativ geringe Spannung aufgeschaltet wird, kann zu Beginn eine Diode eingesetzt werden, die die Schaltstufe &#039;maximale Spannung&#039; anzeigt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:SmPiFu2ou2T.png|400px|Kombination von 2 Optokopplern]]&lt;br /&gt;
&lt;br /&gt;
b. Vor dem Testen ist wieder zu beachten, dass nun zusätzlich &#039;Output Pin 7&#039; genutzt wird (statt Output Pin 2).&lt;br /&gt;
&lt;br /&gt;
c. Eine mögliche Realisierung sieht so aus: http://youtu.be/xQ7N-PrIULk&lt;br /&gt;
&lt;br /&gt;
== Zusätzliche Erhöhung der Schaltstufen bei D/A-Wandlern ==&lt;br /&gt;
&lt;br /&gt;
a. Zwar benötigen wir in unserem speziellen Beispiel eine &#039;Grundspannung&#039;, die sich dahingehend auswirkt, dass - wie unter 3.1.c. erwähnt - eine Signalkombination nicht ausgewertet wird, aber mit jeder weiteren Schaltstufe würde sich dieses Problem (theoretisch) relativieren, da bei geschickter Auswahl der Widerstände (z.B. im Verhältnis 1 zu 2) jeweils eine Verdoppelung der Kombinationsmöglichkeiten erreichbar ist.&lt;br /&gt;
&lt;br /&gt;
b. Wird hier der 50 Ohm Widerstand asymmetrisch geteilt (z.B. 15 + 35 Ohm, s.a. [[Spannungsteiler]]) um dort ein weiteres Signal umsetzen zu können, ergeben sich direkt folgende 5 Schaltstufen (aus, 50, 35, 15 und 0 Ohm) u.s.w.:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Sm3ou3t2.png|400px|Erhöhung der Schaltstufen]]&lt;br /&gt;
&lt;br /&gt;
c. Zur Ansteuerung dieser Schaltstufen wäre das Script so zu ändern, dass nun zwischen mehr als 2 Stufen gewechselt werden kann und im Array entsprechende Zusatzdaten vorgegeben und ausgelesen werden. Mehr als diese Stufen sind im konkreten Fall aber nicht sinnvoll, da die entstehende Verlustleistung in der Schaltung die maximal verfügbare Leistung reduziert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Weiterführende Ideen =&lt;br /&gt;
&lt;br /&gt;
Die Ausbaumöglichkeiten dieses Projektes sind vielfältig:&lt;br /&gt;
&lt;br /&gt;
== Hardwareseitige Ausbauvarianten ==&lt;br /&gt;
&lt;br /&gt;
- beispielhafte Umsetzung einer differenzierten Abstufung mittels einer logarithmischen Einteilung oder eines möglichst oft durch 2 teilbaren Anfangswertes und der Teiler (640 Ohm, 320, 160...);&lt;br /&gt;
&lt;br /&gt;
- Nachbau des Projekts mit einem Mikrocontroller (ggf. mit LCD-Anzeige);&lt;br /&gt;
&lt;br /&gt;
- Umbau der Steuerung mit dem Ziel, sie direkt an die GPIO-Pins des RPi anzuschließen;&lt;br /&gt;
&lt;br /&gt;
- Entwurf einer Zusatzschaltung, die in diesem Beispiel eine Rückmeldung liefert, ob ein Verbraucher aktiv ist oder nicht (Fahrzeug noch auf der Strecke?);&lt;br /&gt;
&lt;br /&gt;
- Entwurf einer Zusatzschaltung, die erkennt wie viel Strom fliesst: damit wären Rückschlüsse auf den Streckenverlauf möglich (Kurve=etwas mehr Strom, Steigung=noch mehr Strom nötig, etc.) und auch eine programmgesteuerte Optimierung der Array-Schaltzeiten dankbar; &lt;br /&gt;
&lt;br /&gt;
- Einsatz anderer Sensortechniken und/oder mehrerer Sensoren zur Optimierung der Schnelligkeit oder parallelen Steuerung eines 2. Fahrzeuges;&lt;br /&gt;
&lt;br /&gt;
== Softwareseitige Ausbauvarianten ==&lt;br /&gt;
&lt;br /&gt;
- Optimierung des Scripts, indem die Sensor-Abfrage über einen &#039;Listener&#039; umgesetzt wird;&lt;br /&gt;
&lt;br /&gt;
- Erweiterung des Scripts um eine GUI mit Hilfe der python-lib Tkinter, um einen Nutzerzugriff auf das Steuerarray und/oder eine &#039;Verwaltung&#039; mehrerer Fahrzeuge;&lt;br /&gt;
&lt;br /&gt;
- Einbindung eines Web-Interface um eine &#039;Fernsteuerung&#039; zu ermöglichen...&lt;br /&gt;
&lt;br /&gt;
...in jedem Fall: viel Spaß beim Basteln!&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [http://hackaday.com/2013/01/23/replacement-controllers-for-slot-car-racing/ ähnliches Projekt bei &#039;hackaday&#039;] &lt;br /&gt;
* [https://docs.google.com/folder/d/0B-UAZ9CyJCLGQjJ3RDlqa2pqaDg/edit?pli=1&amp;amp;docId=0B-UAZ9CyJCLGNmpMeVpyYlZJUWc Relaisschaltung mit pädagogischer Erweiterung der Universität Manchester (englischspr.)]&lt;br /&gt;
* [http://elinux.org/RPi_Projects/PiFace_controlling_a_slot-car paralleler englischsp. Bericht des Autors zum RPi mit anderem Schwerpunkt] &lt;br /&gt;
* [http://elinux.org/RPi_Projects englischsp. Projektliste zum RPi]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/GhostCarProjekt Verlagerung der gesamten Steuerelektronik ins Fahrzeug]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Raspberry Pi]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Mknot9</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=RPi_als_D/A-Wandler&amp;diff=74399</id>
		<title>RPi als D/A-Wandler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=RPi_als_D/A-Wandler&amp;diff=74399"/>
		<updated>2013-03-08T18:12:57Z</updated>

		<summary type="html">&lt;p&gt;Mknot9: /* Siehe auch */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von mknot9&#039;&#039; (M. Knoop)&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
Oft wird ein Computer &#039;nur&#039; genutzt um darauf Software ablaufen zu lassen. Dessen Möglichkeit zur Steuerung von elektrischen und mechanischen Geräten wird dabei leicht übersehen.&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel richtet sich daher an Einsteiger, die mit dem [[Raspberry Pi]] (&#039;RPi&#039;) Grundlagen der Computersteuerung mit Relais und [[Spannungsteiler]]n nachvollziehen möchten. Es wird schrittweise dargestellt, wie mittels eines D/A-Wandlers (Digital/Analog-Wandler = Umwandlung von digitalen 1/0 Signale) die Steuerung einer stufenweise veränderbaren Ausgangsspannung aufgebaut werden kann.&lt;br /&gt;
&lt;br /&gt;
= Verwendete Hardware =&lt;br /&gt;
&lt;br /&gt;
== RPi in Kombination mit der &#039;PiFace&#039;-Karte als Bastelplattform ==&lt;br /&gt;
&lt;br /&gt;
Dank der einfachen Bauweise bietet sich der RPi mit seinen frei zugänglichen GPIO-Pins als ideale Bastelplattform an. Trotzdem kann es beim anfänglichen Experimentieren mit Schaltungen öfters zu kleinen Fehlern kommen, die schlimmstenfalls die empfindliche Elektronik des RPi dauerhaft beschädigen können.&lt;br /&gt;
&lt;br /&gt;
Daher wird bei diesem Projekt zusätzlich mit der &#039;PiFace[http://elinux.org/RPi_Expansion_Boards#Piface]&#039;-Karte gearbeitet, die man auf die GPIO-Pins stecken kann. Diese Erweiterungskarte verschaltet die GPIO-Pins auf je 8 digitale Ein- und Ausgänge sowie 2 Relais, die eine galvanische Trennung von Stromkreisen ermöglichen. Damit besteht auch für Einsteiger ein gewisser Schutz für die Steuerelektronik des RPi.&lt;br /&gt;
&lt;br /&gt;
Auch im weiteren Verlauf dieser Einführung soll noch auf eine Trennung der Stromkreise Wert gelegt werden, so dass für erste digitale Schaltexperimente ein Optokoppler genutzt wird. Die spätere Nutzung der &#039;Input Pins&#039; des PiFace um eine Steuerung der D/A-Wandlung durch bestimmte Ereignisse zu ermöglichen, erfolgt ebenfalls passiv.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Auch wenn mit vermeintlich &#039;sicheren&#039; Transformatoren gebastelt wird, muss stets bedacht werden, dass diese an einem 230V-Stromnetz betrieben werden und man eher einmal mehr als weniger prüfen sollte, ob man durch eventuelle Fehler mit lebensgefährlicher Spannung in Berührung kommt!&lt;br /&gt;
&lt;br /&gt;
== Auswahl eines Beispielprojektes ==&lt;br /&gt;
&lt;br /&gt;
Günstige Möglichkeiten ein Gerät zu finden, das mit analogen Spannungen arbeitet, bieten sich u.a. im Spielzeugbereich. Im Grunde eignet sich alles, was mit Batterien oder mit Gleichspannungen unter 24 V betrieben wird.&lt;br /&gt;
&lt;br /&gt;
Da jedoch ein Ziel das Steuern von analogen Spannungen ist, bietet sich insbesondere alles an, bei dem [[Potentiometer]] eingesetzt werden. Einen dieser &#039;Handregler&#039; sollte man übrig haben, da er von seinem Anschlusskabel abgetrennt werden muss, um den oft proprietären Steckanschluss nutzen zu können. In diesem Sinne wird hier eine handelsübliche Spielzeug-Autorennbahn mit Potentiometer-Handreglern genutzt.&lt;br /&gt;
&lt;br /&gt;
== Sonstige Bauteile ==&lt;br /&gt;
&lt;br /&gt;
Für die ersten Grundlagen (s. Teile 2 &amp;amp; 3) genügen bereits rund 2 m isolierter Draht, der nicht aus verdrillten feinen Adern (Litze) bestehen sollte, 50 cm nicht-isolierter Draht, einige niederohmige Widerstände (z.B. je 2 mal 100 Ohm, 80, 60, sowie 20) und ein &#039;Experimentierbrett&#039; (engl. [[Breadboard]]).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Grundlagen und Vorbereitung des Projekts =&lt;br /&gt;
&lt;br /&gt;
== Umwandlung von 1/0 zu Ein/Aus mit einem Relais ==&lt;br /&gt;
&lt;br /&gt;
Vom Prinzip her ist jede Umwandlung eines digitalen 0 oder 1 Signals (das über eine bestimmte Spannungsdifferenz festgelegt ist) in eine (nutzbare) Spannung bereits eine D/A-Wandlung. Dies wird schlicht so realisiert, dass mit einer Eingabe am RPi die Nutzspannung des &#039;Verbrauchers&#039; zunächst einfach an- und ausgeschaltet wird.&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung der zu steuernden Hardware ==&lt;br /&gt;
&lt;br /&gt;
a. Um Fehlerquellen auszuschließen sollte zunächst (und ggf. auch später!) kurz getestet werden, ob der vorhandene Regler wie erwartet funktioniert.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pif_Con9.jpg|thumb|right|400px|Fixierung der Reglerkabel]]&lt;br /&gt;
b. Nach dem Trennen des Reglers von der Einspeisung (und ggf. Ziehen des Netzsteckers) muss das Regler-Kabel abgeschnitten werden (eher nahe beim Regler, da das Kabel bald bis zum Breadboard reichen soll). Die neuen Enden des Einspeiseteils werden abisoliert und auf dem Breadboard diagonal zueinander mit einigen Spalten Abstand fixiert. Auch können bereits die Drähte, die später zum RPi führen, jeweils in den passenden kontaktführenden Spalten eingesteckt werden, z. B. wie rechts zu sehen (die nicht beschrifteten Drähte können vorerst ignoriert werden):&lt;br /&gt;
&lt;br /&gt;
c. Nun bietet sich eine gute Gelegenheit die maximale Spannung am Nutzgerät zu messen. Man verbindet das Regler-Kabel (nun ohne Regler) wieder mit der Einspeisung und die offenen Enden der Drähte mit dem Messgerät, bei dem zunächst ein Messbereich von ca. 10-50 Volt gewählt werden sollte. Dies sollte dann z.B. 14,8 V anzeigen. Natürlich können auch die beiden offenen Enden einen kleinen Moment kurz geschlossen werden, man sollte aber bedenken, dass das zu regelnde Nutzgerät dann die maximal vorgesehene Spannung erhält (hier: maximales Tempo).&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung des RPi ==&lt;br /&gt;
&lt;br /&gt;
Es wird davon ausgegangen, dass entsprechend des zugehörigen &#039;manual&#039; das PiFace bereits auf den RPi gesteckt ist, die nötigen python-Bibliotheken installiert sind und man sich im Terminal-Arbeitsverzeichnis &#039;pi&#039; befindet.&lt;br /&gt;
&lt;br /&gt;
a. Zunächst wird der PiFace-Emulator (im Terminal direkt aus dem Arbeitsverzeichnis) gestartet: &amp;lt;tt&amp;gt;piface/scripts/piface-emulator&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b. Wenn alles richtig installiert wurde, erscheint ein Fenster (unten links), bei dem die vorerst wichtigen blauen Signale am rechten Rand wie folgt angezeigt werden sollten: &lt;br /&gt;
 &lt;br /&gt;
[[Datei:RPi_PiF_em-scs.jpg|400px|Piface-Emulator im default-Zustand]] [[Datei:RPi_PiF_em_scs1.jpg|400px|Piface-Relais 1 auf &#039;1&#039; geschaltet]]&lt;br /&gt;
&lt;br /&gt;
c. Das rechte Fenster ergibt sich, wenn man nun im Fenster auf &amp;quot;Override Enable&amp;quot; und dann &amp;quot;Output Pin 1&amp;quot; klickt. Es müsste ein &amp;quot;Klick&amp;quot; vom Relais 1 zu hören sein sowie der Schaltzustand des unteren Relais 1 (das an den Output Pin 1 gekoppelt ist) auf die Verbindung der beiden unteren Anschlüsse wechseln. Zugleich wird das erste LED-Icon beim Output Pin 1 rot sowie das zugehörige LED-Icon blau.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pif_rel2.png|thumb|right|250px|Schema der Piface-Relais]]&lt;br /&gt;
d. Rechts ist der Schaltzustand der Relais, die zu Beginn genutzt werden, im Grundzustand dargestellt (jeweils der mittlere und obere Kontakt sind kurzgeschlossen, der jeweils untere Kontakt ist frei):&lt;br /&gt;
&lt;br /&gt;
e. Ein weiterer Klick auf &amp;quot;Output Pin 1&amp;quot; versetzt das Relais in den Ausgangszustand, der vor dem nächsten Schritt wieder eingestellt werden sollte.&lt;br /&gt;
&lt;br /&gt;
f. Das Relais lässt sich auch mittels eines Python-Scripts vom RPi aus ansteuern. Dazu wird folgende Textdatei &amp;quot;wandler.py&amp;quot; im Arbeitsverzeichnis abgespeichert und mit dem Befehl &amp;quot;&amp;lt;tt&amp;gt;python wandler.py&amp;lt;/tt&amp;gt;&amp;quot; gestartet:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler.py&lt;br /&gt;
&lt;br /&gt;
 from time import sleep&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
&lt;br /&gt;
 pfio.init()&lt;br /&gt;
&lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
 print &amp;quot;Strom an&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 sleep(2)&lt;br /&gt;
&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Strom aus&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Nach dem Absetzen des Befehls wechselt nun das blaue Signal an Relais 1 für 2 Sekunden und das Relais klickt entsprechend.&lt;br /&gt;
&lt;br /&gt;
== Einsatz eines Relais&#039; zur Umsetzung von Spannungsänderungen ==&lt;br /&gt;
&lt;br /&gt;
a. Ist das Relais wieder im Ausgangszustand, befestigt man nun einen der vom Breadboard führenden Drähte am unteren und einen am mittleren Relaiseingang (im Moment ist die Polarität noch egal). Zunächst sollte nichts passieren (das Relais hält diesen ja Stromkreis noch offen).&lt;br /&gt;
&lt;br /&gt;
b. Startet man aber das Script wieder (&amp;lt;tt&amp;gt;python wandler.py&amp;lt;/tt&amp;gt;) oder klickt auf &#039;Output Pin 1&#039; wird der Nutzstromkreis geschlossen. Nochmals aufgepasst: unser Nutzer erhält wieder die maximal vorgesehene Spannung - also besser vorher im Script &amp;quot;&amp;lt;tt&amp;gt;sleep(0.3)&amp;lt;/tt&amp;gt;&amp;quot; setzen und speichern.&lt;br /&gt;
&lt;br /&gt;
c. Im Prinzip ist damit die programmgesteuerte Umsetzung eines 0/1 Signals in z.B. eine 0V/15V Spannung erreicht.&lt;br /&gt;
&lt;br /&gt;
d. Da wir bald verschiedene Steuerspannungen schalten wollen, geht es jetzt darum herauszufinden, bei welcher Spannung unser Nutzgerät gerade noch bewegt wird. Dies probiert man aus - mit dem kleinsten Widerstand beginnend: indem einer der Drähte in eine freie Breadboardspalte gesteckt wird und aus dieser Spalte der Widerstand zu dem &#039;alten&#039; Steckplatz des Drahtes geführt wird. Nun startet man jeweils das Script bis der Widerstand so hoch ist, dass die Anlaufspannung beim Nutzgerätes gut ausreicht, eine Reaktion des Nutzgerät (Fahrzeug bewegt sich) zu bewirken (z.B. bei 50 Ohm beträgt der Strom im Mittel ca. 130 mA während ohne 190 mA fließen).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Ansteuerung von 3 Schaltstufen =&lt;br /&gt;
&lt;br /&gt;
== Kombination von 2 Relais ==&lt;br /&gt;
&lt;br /&gt;
[[Bild:ZrelMww2.png|thumb|right|250px|Beschaltung der Relais]] a. Die einfachste Stufe der weiteren Verschaltung erreicht man, indem der Widerstand mit einem 2. Relais überbrückt wird. Relais 1 kann dann als &#039;Hauptschalter&#039;, Relais 2 als Spannungsumschalter genutzt werden:&lt;br /&gt;
&lt;br /&gt;
b. Diese Beschaltung kann sogleich mit dem PiFace-Emulator ausprobiert werden. Damit können wir bereits 3 Schaltstufen steuern: keine, verminderte und volle Spannung.&lt;br /&gt;
&lt;br /&gt;
c. Theoretisch ließe sich auch noch eine 4. Spannungsstufe erzeugen, da mit 2 &#039;Bits&#039; (Ein/Aus bei 2 Relais) bereits 4 verschiedene Signale darstellbar sind. Beim jetzigen Aufbau werden aber lediglich die (pin1,pin2)-Signale (0,0), (1,0) und (1,1) &#039;genutzt&#039;, da Relais 1 als Hauptschalter vorgesehen ist und die Kombination (0,1) so nicht ausgewertet wird.&lt;br /&gt;
&lt;br /&gt;
== Programmgesteuerte Schaltung von 2 Relais ==&lt;br /&gt;
&lt;br /&gt;
a. Mit einem veränderten python-Script &amp;quot;wandler2.py&amp;quot; ist auch die programmgesteuerte Schaltung möglich. Dabei werden zusätzlich die Tasten 1 und 2 des PiFace genutzt, um nach dem Start des Scripts (&amp;lt;tt&amp;gt;python wandler2.py&amp;lt;/tt&amp;gt;) den Hauptschalter (Relais 1) zu steuern:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler2.py&lt;br /&gt;
 &lt;br /&gt;
 from time import sleep&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
 pfio.init()&lt;br /&gt;
 &lt;br /&gt;
 taste_1=0&lt;br /&gt;
 taste_2=0&lt;br /&gt;
 intervall_a=0.1&lt;br /&gt;
 intervall_b=0.5&lt;br /&gt;
 # Die Intervalle bestimmen die Schaltzeit für volle/verminderte Spannung&lt;br /&gt;
 &lt;br /&gt;
 print &amp;quot;Zum Start Taste 1 drücken, zum Stoppen Taste 2&amp;quot;&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 while taste_1 == 0:&lt;br /&gt;
   sleep(intervall_a)&lt;br /&gt;
   taste_1=pfio.digital_read(1)&lt;br /&gt;
&lt;br /&gt;
 # Der o.g. &#039;sleep&#039;-Befehl bestimmt die Abfragepausen für Taste 1&lt;br /&gt;
 &lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
 print &amp;quot;Strom an!&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 while taste_2 == 0:&lt;br /&gt;
   pfio.digital_write(2,1)&lt;br /&gt;
   sleep(intervall_a)&lt;br /&gt;
   pfio.digital_write(2,0)&lt;br /&gt;
   sleep(intervall_b)&lt;br /&gt;
   taste_2=pfio.digital_read(2)&lt;br /&gt;
 &lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Strom aus!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
b. Falls beim Ausprobieren von Script-Änderungen mal was schief geht, kann das Script stets auch mit der Tastenkombination (CNTRL-C) gestoppt werden. U.U. muss dann noch zusätzlich Relais 1 und/oder 2 via Emulator zurückgesetzt werden.&lt;br /&gt;
&lt;br /&gt;
c. Beim Verändern des Scripts fällt bald auf, dass die bisherige Programmsteuerung keine direkte Möglichkeit vorsieht, auf Ereignisse zu reagieren. Immerhin wird ein mechanisches Gerät gesteuert, bei dem mit Ausfällen, Fertigungstoleranzen, Umwelteinflüssen etc. zu rechnen ist (im Script wird dies bislang &#039;nur&#039; durch die Abbruchbedingung &#039;Taste 2&#039; berücksichtigt).&lt;br /&gt;
&lt;br /&gt;
== Einfache Sensor-Signale als steuernde Elemente eines Programms ==&lt;br /&gt;
&lt;br /&gt;
a. Eine wichtige Anwendung von D/A-Steuerungen ist die mögliche Reaktion dieser Steuerung auf &#039;äußere&#039; Ereignisse, die z.B. mit Hilfe von Sensoren leistbar ist.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Einf_Sens.jpg|thumb|right|250px|einfacher Sensor]]b. Für unsere Zwecke genügt zunächst ein sehr einfacher Sensor, der ein 0- oder 1-Signal liefert und idealerweise direkt am &#039;Input Pin 1&#039; des PiFace angeschlossen werden kann. So liegt beim Input Pin 1 das Signal &#039;1&#039; an, wenn eine Verbindung zu &#039;Input GND&#039; besteht.&lt;br /&gt;
Z.B. können 2 unisolierte Drähte so platziert werden, dass ein vorbeifahrendes Fahrzeug einen von ihnen genügend bewegt um den Kontakt kurze Zeit zu öffnen. Genau dann liefert dieser &#039;Sensor&#039; das Signal &#039;0&#039;. Eine - die Schwerkraft nutzende - mögliche Bauform ist rechts abgebildet ;-)&lt;br /&gt;
&lt;br /&gt;
c. Natürlich werden zusätzlich 2 isolierte Drähte benötigt, um jeden der beiden offenen Drähte geschützt mit Input Pin 1 und Input GND zu verbinden.&lt;br /&gt;
&lt;br /&gt;
d. Bei jeder Durchfahrt liefert der Sensor nun ein &#039;0&#039;-Signal, was im Script sowohl für eine Zeitmessung als auch für ein &#039;Schaltintervall-Array&#039; genutzt werden kann. Dort können abwechselnd für beide Spannungen Zeiten (die in etwa zum jeweiligen Streckenabschnitt passen) &#039;programmiert&#039; werden. Statt Taste 1 wird nun der Sensor ausgewertet (wobei Taste 1 als Sensor-Ersatz insoweit genutzt werden kann, dass sie gedrückt bleiben bzw. kurz losgelassen werden muss). Zur genaueren Zeitmessung wird noch das modul &#039;clock&#039; benötigt. &amp;quot;&amp;lt;tt&amp;gt;wandler3.py&amp;lt;/tt&amp;gt;&amp;quot; könnte also so aussehen:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler3.py&lt;br /&gt;
 &lt;br /&gt;
 from time import clock&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
 sensor_1=1&lt;br /&gt;
 sensor_2=0&lt;br /&gt;
 rundenzahl=0&lt;br /&gt;
 v_wechsel=0&lt;br /&gt;
 vorrunde=0&lt;br /&gt;
 index_zaehler=1&lt;br /&gt;
 &lt;br /&gt;
 zeit_array=[0,0.2,0.4,0.2,0.4,0.2,0.4,0.2,5,0.2,6]&lt;br /&gt;
 # dieses array enthält die sek. bis zum Spannungswechsel&lt;br /&gt;
&lt;br /&gt;
 array_laenge=9&lt;br /&gt;
 # legt fest, wie viel Werte des arrays genutzt werden sollen&lt;br /&gt;
 &lt;br /&gt;
 sensor_aus=1.3&lt;br /&gt;
 # bis der Sensor sicher in die Ruhestellung kippt, wird er nicht ausgelesen&lt;br /&gt;
  &lt;br /&gt;
 pfio.init()&lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
&lt;br /&gt;
 # das Fahrzeug wird langsam zum Start (=Sensor) bewegt&lt;br /&gt;
 while sensor_1 == 1 :&lt;br /&gt;
   sensor_1=pfio.digital_read(1)&lt;br /&gt;
  &lt;br /&gt;
 print &amp;quot;fliegender Start... zum Beenden Taste 2 drücken&amp;quot;&lt;br /&gt;
 print &amp;quot;Runde Nr., Ges.Zeit, Rundenzeit, mittlere Rundenzeit&amp;quot;&lt;br /&gt;
 start_zeit=clock()&lt;br /&gt;
 runden_start=start_zeit&lt;br /&gt;
  &lt;br /&gt;
 while sensor_2 == 0 :&lt;br /&gt;
   sensor_2=pfio.digital_read(2)&lt;br /&gt;
   v_wechsel=1-v_wechsel&lt;br /&gt;
   pfio.digital_write(2,v_wechsel)&lt;br /&gt;
   sensor_zeit=clock()&lt;br /&gt;
  &lt;br /&gt;
   while zeit_array[index_zaehler]+sensor_zeit &amp;gt; clock() :&lt;br /&gt;
     if runden_start+sensor_aus &amp;lt; clock() :&lt;br /&gt;
 &lt;br /&gt;
       sensor_1=pfio.digital_read(1) &lt;br /&gt;
       if sensor_1 == 0 :&lt;br /&gt;
         rundenzahl=rundenzahl+1&lt;br /&gt;
         runden_start=clock()&lt;br /&gt;
         zeit=runden_start-start_zeit&lt;br /&gt;
         print rundenzahl, zeit, zeit-vorrunde, zeit/rundenzahl&lt;br /&gt;
         vorrunde=zeit&lt;br /&gt;
         sensor_zeit=0&lt;br /&gt;
         index_zaehler=0&lt;br /&gt;
         v_wechsel=0&lt;br /&gt;
  &lt;br /&gt;
   index_zaehler=index_zaehler+1&lt;br /&gt;
   if index_zaehler &amp;gt; array_laenge :&lt;br /&gt;
     sensor_2=1&lt;br /&gt;
     print &amp;quot;array-Ende erreicht!&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Outp 1 &amp;amp; 2 auf 0!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wird das Array-Ende erreicht, wurden entweder zu wenige Einträge vorgesehen oder es befindet sich kein Fahrzeug (mehr) auf der Strecke, das den Sensor und damit des Zurücksetzen des Arrays auslösen konnte.&lt;br /&gt;
&lt;br /&gt;
e. Das Array ist an die jeweilige Strecke anzupassen, wobei der vorderste Eintrag ungenutzt bleibt und dann mit der Dauer für maximale Spannung begonnen wird. Solange man mit Relais arbeitet, sollten die Schaltzeiten nicht zu kurz sein (&amp;gt;0.1 sek.), da diese eine gewisse mechanische Trägheit besitzen.&lt;br /&gt;
&lt;br /&gt;
f. Eben diese mechanische Beschaffenheit der Relais (Verschleiß) ist auch ein guter Grund, auf &#039;volle&#039; digitale Signalumwandlung umzustellen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Optokoppler als Ersatz für Relais =&lt;br /&gt;
&lt;br /&gt;
Ähnlich wie ein Relais dient ein [[Optokoppler]] dazu, eine Signalübertragung zwischen zwei getrennten Stromkreisen zu ermöglichen. Bei diesem Projekt liegt der Einsatz von Optokopplern nahe, da sie schneller schalten und keine beweglichen Teile besitzen. Für unsere Zwecke benötigen wir nun als zusätzliche Elemente: Optokoppler (CNY 17-4), npn-[[Transistor]]en (BC 337-40) zur Signalverstärkung sowie einige Widerstände im Bereich von 2k und 400 Ohm. &lt;br /&gt;
&lt;br /&gt;
== Kaskadierung von Transistoren zur Signalverstärkung ==&lt;br /&gt;
&lt;br /&gt;
a. Entsprechend Schritt 2.4.d. (ein Relais bei 50 Ohm) wird zunächst ein [[Optokoppler]] eingesetzt, dessen Signal durch einen Transistor verstärkt wird, um die &#039;Grundspannung&#039; zu schalten (Pin 3 und 6 beim Optokoppler sollten unbeschaltet bleiben, allein der &#039;Lichtstrom&#039; reicht für eine Ansteuerung aus):&lt;br /&gt;
&lt;br /&gt;
[[Bild:PiF_CNY_BC_1.png|400px|Optokoppler mit Transistor]]&lt;br /&gt;
&lt;br /&gt;
b. Da immer mit einer gewissen Toleranz bei allen Komponenten zu rechnen ist, kann es sein, dass u.U. die Widerstände etwas größer oder kleiner gewählt werden müssen. Beim Ausprobieren sollte man hier in 10% Schritten variieren.&lt;br /&gt;
&lt;br /&gt;
c. Bei Austesten mit Emulator oder Script ist auch zu beachten, dass nun &#039;Output Pin 8&#039; genutzt wird, da dieser nicht mit den Relais verschaltet ist.&lt;br /&gt;
&lt;br /&gt;
== Umsetzung von 3 Schaltstufen mit Optokopplern ==&lt;br /&gt;
&lt;br /&gt;
a. Entsprechend dem Vorgehen beim Relais kann nun auch der kleine Widerstand zusätzlich beschaltet werden um seine gesteuerte Überbrückung zu ermöglichen. Da hier eine relativ geringe Spannung aufgeschaltet wird, kann zu Beginn eine Diode eingesetzt werden, die die Schaltstufe &#039;maximale Spannung&#039; anzeigt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:SmPiFu2ou2T.png|400px|Kombination von 2 Optokopplern]]&lt;br /&gt;
&lt;br /&gt;
b. Vor dem Testen ist wieder zu beachten, dass nun zusätzlich &#039;Output Pin 7&#039; genutzt wird (statt Output Pin 2).&lt;br /&gt;
&lt;br /&gt;
c. Eine mögliche Realisierung sieht so aus: http://youtu.be/xQ7N-PrIULk&lt;br /&gt;
&lt;br /&gt;
== Zusätzliche Erhöhung der Schaltstufen bei D/A-Wandlern ==&lt;br /&gt;
&lt;br /&gt;
a. Zwar benötigen wir in unserem speziellen Beispiel eine &#039;Grundspannung&#039;, die sich dahingehend auswirkt, dass - wie unter 3.1.c. erwähnt - eine Signalkombination nicht ausgewertet wird, aber mit jeder weiteren Schaltstufe würde sich dieses Problem (theoretisch) relativieren, da bei geschickter Auswahl der Widerstände (z.B. im Verhältnis 1 zu 2) jeweils eine Verdoppelung der Kombinationsmöglichkeiten erreichbar ist.&lt;br /&gt;
&lt;br /&gt;
b. Wird hier der 50 Ohm Widerstand asymmetrisch geteilt (z.B. 15 + 35 Ohm, s.a. [[Spannungsteiler]]) um dort ein weiteres Signal umsetzen zu können, ergeben sich direkt folgende 5 Schaltstufen (aus, 50, 35, 15 und 0 Ohm) u.s.w.:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Sm3ou3t2.png|400px|Erhöhung der Schaltstufen]]&lt;br /&gt;
&lt;br /&gt;
c. Zur Ansteuerung dieser Schaltstufen wäre das Script so zu ändern, dass nun zwischen mehr als 2 Stufen gewechselt werden kann und im Array entsprechende Zusatzdaten vorgegeben und ausgelesen werden. Mehr als diese Stufen sind im konkreten Fall aber nicht sinnvoll, da die entstehende Verlustleistung in der Schaltung die maximal verfügbare Leistung reduziert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Weiterführende Ideen =&lt;br /&gt;
&lt;br /&gt;
Die Ausbaumöglichkeiten dieses Projektes sind vielfältig:&lt;br /&gt;
&lt;br /&gt;
== Hardwareseitige Ausbauvarianten ==&lt;br /&gt;
&lt;br /&gt;
- beispielhafte Umsetzung einer differenzierten Abstufung mittels einer logarithmischen Einteilung oder eines möglichst oft durch 2 teilbaren Anfangswertes und der Teiler (640 Ohm, 320, 160...);&lt;br /&gt;
&lt;br /&gt;
- Nachbau des Projekts mit einem Mikrocontroller (ggf. mit LCD-Anzeige);&lt;br /&gt;
&lt;br /&gt;
- Umbau der Steuerung mit dem Ziel, sie direkt an die GPIO-Pins des RPi anzuschließen;&lt;br /&gt;
&lt;br /&gt;
- Entwurf einer Zusatzschaltung, die in diesem Beispiel eine Rückmeldung liefert, ob ein Verbraucher aktiv ist oder nicht (Fahrzeug noch auf der Strecke?);&lt;br /&gt;
&lt;br /&gt;
- Entwurf einer Zusatzschaltung, die erkennt wie viel Strom fliesst: damit wären Rückschlüsse auf den Streckenverlauf möglich (Kurve=etwas mehr Strom, Steigung=noch mehr Strom nötig, etc.) und auch eine programmgesteuerte Optimierung der Array-Schaltzeiten dankbar; &lt;br /&gt;
&lt;br /&gt;
- Einsatz anderer Sensortechniken und/oder mehrerer Sensoren zur Optimierung der Schnelligkeit oder parallelen Steuerung eines 2. Fahrzeuges;&lt;br /&gt;
&lt;br /&gt;
== Softwareseitige Ausbauvarianten ==&lt;br /&gt;
&lt;br /&gt;
- Optimierung des Scripts, indem die Sensor-Abfrage über einen &#039;Listener&#039; umgesetzt wird;&lt;br /&gt;
&lt;br /&gt;
- Erweiterung des Scripts um eine GUI mit Hilfe der python-lib Tkinter, um einen Nutzerzugriff auf das Steuerarray und/oder eine &#039;Verwaltung&#039; mehrerer Fahrzeuge;&lt;br /&gt;
&lt;br /&gt;
- Einbindung eines Web-Interface um eine &#039;Fernsteuerung&#039; zu ermöglichen...&lt;br /&gt;
&lt;br /&gt;
...in jedem Fall: viel Spaß beim Basteln!&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [http://hackaday.com/2013/01/23/replacement-controllers-for-slot-car-racing/ ähnliches Projekt bei &#039;hackaday&#039;] &lt;br /&gt;
* [https://docs.google.com/folder/d/0B-UAZ9CyJCLGQjJ3RDlqa2pqaDg/edit?pli=1&amp;amp;docId=0B-UAZ9CyJCLGNmpMeVpyYlZJUWc Relaisschaltung mit pädagogischer Erweiterung der Universität Manchester (englischspr.)]&lt;br /&gt;
* [http://elinux.org/RPi_Projects/PiFace_controlling_a_slot-car paralleler englischsp. Bericht des Autors zum RPi mit anderem Schwerpunkt] &lt;br /&gt;
* [http://elinux.org/RPi_Projects englischsp. Projektliste zum RPi]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/GhostCarProjekt Verlagerung des gesamten Steuerelektronik ins Fahrzeug]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Raspberry Pi]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Mknot9</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=RPi_als_D/A-Wandler&amp;diff=74397</id>
		<title>RPi als D/A-Wandler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=RPi_als_D/A-Wandler&amp;diff=74397"/>
		<updated>2013-03-08T18:10:01Z</updated>

		<summary type="html">&lt;p&gt;Mknot9: /* Hardwareseitige Ausbauvarianten */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von mknot9&#039;&#039; (M. Knoop)&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
Oft wird ein Computer &#039;nur&#039; genutzt um darauf Software ablaufen zu lassen. Dessen Möglichkeit zur Steuerung von elektrischen und mechanischen Geräten wird dabei leicht übersehen.&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel richtet sich daher an Einsteiger, die mit dem [[Raspberry Pi]] (&#039;RPi&#039;) Grundlagen der Computersteuerung mit Relais und [[Spannungsteiler]]n nachvollziehen möchten. Es wird schrittweise dargestellt, wie mittels eines D/A-Wandlers (Digital/Analog-Wandler = Umwandlung von digitalen 1/0 Signale) die Steuerung einer stufenweise veränderbaren Ausgangsspannung aufgebaut werden kann.&lt;br /&gt;
&lt;br /&gt;
= Verwendete Hardware =&lt;br /&gt;
&lt;br /&gt;
== RPi in Kombination mit der &#039;PiFace&#039;-Karte als Bastelplattform ==&lt;br /&gt;
&lt;br /&gt;
Dank der einfachen Bauweise bietet sich der RPi mit seinen frei zugänglichen GPIO-Pins als ideale Bastelplattform an. Trotzdem kann es beim anfänglichen Experimentieren mit Schaltungen öfters zu kleinen Fehlern kommen, die schlimmstenfalls die empfindliche Elektronik des RPi dauerhaft beschädigen können.&lt;br /&gt;
&lt;br /&gt;
Daher wird bei diesem Projekt zusätzlich mit der &#039;PiFace[http://elinux.org/RPi_Expansion_Boards#Piface]&#039;-Karte gearbeitet, die man auf die GPIO-Pins stecken kann. Diese Erweiterungskarte verschaltet die GPIO-Pins auf je 8 digitale Ein- und Ausgänge sowie 2 Relais, die eine galvanische Trennung von Stromkreisen ermöglichen. Damit besteht auch für Einsteiger ein gewisser Schutz für die Steuerelektronik des RPi.&lt;br /&gt;
&lt;br /&gt;
Auch im weiteren Verlauf dieser Einführung soll noch auf eine Trennung der Stromkreise Wert gelegt werden, so dass für erste digitale Schaltexperimente ein Optokoppler genutzt wird. Die spätere Nutzung der &#039;Input Pins&#039; des PiFace um eine Steuerung der D/A-Wandlung durch bestimmte Ereignisse zu ermöglichen, erfolgt ebenfalls passiv.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Auch wenn mit vermeintlich &#039;sicheren&#039; Transformatoren gebastelt wird, muss stets bedacht werden, dass diese an einem 230V-Stromnetz betrieben werden und man eher einmal mehr als weniger prüfen sollte, ob man durch eventuelle Fehler mit lebensgefährlicher Spannung in Berührung kommt!&lt;br /&gt;
&lt;br /&gt;
== Auswahl eines Beispielprojektes ==&lt;br /&gt;
&lt;br /&gt;
Günstige Möglichkeiten ein Gerät zu finden, das mit analogen Spannungen arbeitet, bieten sich u.a. im Spielzeugbereich. Im Grunde eignet sich alles, was mit Batterien oder mit Gleichspannungen unter 24 V betrieben wird.&lt;br /&gt;
&lt;br /&gt;
Da jedoch ein Ziel das Steuern von analogen Spannungen ist, bietet sich insbesondere alles an, bei dem [[Potentiometer]] eingesetzt werden. Einen dieser &#039;Handregler&#039; sollte man übrig haben, da er von seinem Anschlusskabel abgetrennt werden muss, um den oft proprietären Steckanschluss nutzen zu können. In diesem Sinne wird hier eine handelsübliche Spielzeug-Autorennbahn mit Potentiometer-Handreglern genutzt.&lt;br /&gt;
&lt;br /&gt;
== Sonstige Bauteile ==&lt;br /&gt;
&lt;br /&gt;
Für die ersten Grundlagen (s. Teile 2 &amp;amp; 3) genügen bereits rund 2 m isolierter Draht, der nicht aus verdrillten feinen Adern (Litze) bestehen sollte, 50 cm nicht-isolierter Draht, einige niederohmige Widerstände (z.B. je 2 mal 100 Ohm, 80, 60, sowie 20) und ein &#039;Experimentierbrett&#039; (engl. [[Breadboard]]).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Grundlagen und Vorbereitung des Projekts =&lt;br /&gt;
&lt;br /&gt;
== Umwandlung von 1/0 zu Ein/Aus mit einem Relais ==&lt;br /&gt;
&lt;br /&gt;
Vom Prinzip her ist jede Umwandlung eines digitalen 0 oder 1 Signals (das über eine bestimmte Spannungsdifferenz festgelegt ist) in eine (nutzbare) Spannung bereits eine D/A-Wandlung. Dies wird schlicht so realisiert, dass mit einer Eingabe am RPi die Nutzspannung des &#039;Verbrauchers&#039; zunächst einfach an- und ausgeschaltet wird.&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung der zu steuernden Hardware ==&lt;br /&gt;
&lt;br /&gt;
a. Um Fehlerquellen auszuschließen sollte zunächst (und ggf. auch später!) kurz getestet werden, ob der vorhandene Regler wie erwartet funktioniert.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pif_Con9.jpg|thumb|right|400px|Fixierung der Reglerkabel]]&lt;br /&gt;
b. Nach dem Trennen des Reglers von der Einspeisung (und ggf. Ziehen des Netzsteckers) muss das Regler-Kabel abgeschnitten werden (eher nahe beim Regler, da das Kabel bald bis zum Breadboard reichen soll). Die neuen Enden des Einspeiseteils werden abisoliert und auf dem Breadboard diagonal zueinander mit einigen Spalten Abstand fixiert. Auch können bereits die Drähte, die später zum RPi führen, jeweils in den passenden kontaktführenden Spalten eingesteckt werden, z. B. wie rechts zu sehen (die nicht beschrifteten Drähte können vorerst ignoriert werden):&lt;br /&gt;
&lt;br /&gt;
c. Nun bietet sich eine gute Gelegenheit die maximale Spannung am Nutzgerät zu messen. Man verbindet das Regler-Kabel (nun ohne Regler) wieder mit der Einspeisung und die offenen Enden der Drähte mit dem Messgerät, bei dem zunächst ein Messbereich von ca. 10-50 Volt gewählt werden sollte. Dies sollte dann z.B. 14,8 V anzeigen. Natürlich können auch die beiden offenen Enden einen kleinen Moment kurz geschlossen werden, man sollte aber bedenken, dass das zu regelnde Nutzgerät dann die maximal vorgesehene Spannung erhält (hier: maximales Tempo).&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung des RPi ==&lt;br /&gt;
&lt;br /&gt;
Es wird davon ausgegangen, dass entsprechend des zugehörigen &#039;manual&#039; das PiFace bereits auf den RPi gesteckt ist, die nötigen python-Bibliotheken installiert sind und man sich im Terminal-Arbeitsverzeichnis &#039;pi&#039; befindet.&lt;br /&gt;
&lt;br /&gt;
a. Zunächst wird der PiFace-Emulator (im Terminal direkt aus dem Arbeitsverzeichnis) gestartet: &amp;lt;tt&amp;gt;piface/scripts/piface-emulator&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b. Wenn alles richtig installiert wurde, erscheint ein Fenster (unten links), bei dem die vorerst wichtigen blauen Signale am rechten Rand wie folgt angezeigt werden sollten: &lt;br /&gt;
 &lt;br /&gt;
[[Datei:RPi_PiF_em-scs.jpg|400px|Piface-Emulator im default-Zustand]] [[Datei:RPi_PiF_em_scs1.jpg|400px|Piface-Relais 1 auf &#039;1&#039; geschaltet]]&lt;br /&gt;
&lt;br /&gt;
c. Das rechte Fenster ergibt sich, wenn man nun im Fenster auf &amp;quot;Override Enable&amp;quot; und dann &amp;quot;Output Pin 1&amp;quot; klickt. Es müsste ein &amp;quot;Klick&amp;quot; vom Relais 1 zu hören sein sowie der Schaltzustand des unteren Relais 1 (das an den Output Pin 1 gekoppelt ist) auf die Verbindung der beiden unteren Anschlüsse wechseln. Zugleich wird das erste LED-Icon beim Output Pin 1 rot sowie das zugehörige LED-Icon blau.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pif_rel2.png|thumb|right|250px|Schema der Piface-Relais]]&lt;br /&gt;
d. Rechts ist der Schaltzustand der Relais, die zu Beginn genutzt werden, im Grundzustand dargestellt (jeweils der mittlere und obere Kontakt sind kurzgeschlossen, der jeweils untere Kontakt ist frei):&lt;br /&gt;
&lt;br /&gt;
e. Ein weiterer Klick auf &amp;quot;Output Pin 1&amp;quot; versetzt das Relais in den Ausgangszustand, der vor dem nächsten Schritt wieder eingestellt werden sollte.&lt;br /&gt;
&lt;br /&gt;
f. Das Relais lässt sich auch mittels eines Python-Scripts vom RPi aus ansteuern. Dazu wird folgende Textdatei &amp;quot;wandler.py&amp;quot; im Arbeitsverzeichnis abgespeichert und mit dem Befehl &amp;quot;&amp;lt;tt&amp;gt;python wandler.py&amp;lt;/tt&amp;gt;&amp;quot; gestartet:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler.py&lt;br /&gt;
&lt;br /&gt;
 from time import sleep&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
&lt;br /&gt;
 pfio.init()&lt;br /&gt;
&lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
 print &amp;quot;Strom an&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 sleep(2)&lt;br /&gt;
&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Strom aus&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Nach dem Absetzen des Befehls wechselt nun das blaue Signal an Relais 1 für 2 Sekunden und das Relais klickt entsprechend.&lt;br /&gt;
&lt;br /&gt;
== Einsatz eines Relais&#039; zur Umsetzung von Spannungsänderungen ==&lt;br /&gt;
&lt;br /&gt;
a. Ist das Relais wieder im Ausgangszustand, befestigt man nun einen der vom Breadboard führenden Drähte am unteren und einen am mittleren Relaiseingang (im Moment ist die Polarität noch egal). Zunächst sollte nichts passieren (das Relais hält diesen ja Stromkreis noch offen).&lt;br /&gt;
&lt;br /&gt;
b. Startet man aber das Script wieder (&amp;lt;tt&amp;gt;python wandler.py&amp;lt;/tt&amp;gt;) oder klickt auf &#039;Output Pin 1&#039; wird der Nutzstromkreis geschlossen. Nochmals aufgepasst: unser Nutzer erhält wieder die maximal vorgesehene Spannung - also besser vorher im Script &amp;quot;&amp;lt;tt&amp;gt;sleep(0.3)&amp;lt;/tt&amp;gt;&amp;quot; setzen und speichern.&lt;br /&gt;
&lt;br /&gt;
c. Im Prinzip ist damit die programmgesteuerte Umsetzung eines 0/1 Signals in z.B. eine 0V/15V Spannung erreicht.&lt;br /&gt;
&lt;br /&gt;
d. Da wir bald verschiedene Steuerspannungen schalten wollen, geht es jetzt darum herauszufinden, bei welcher Spannung unser Nutzgerät gerade noch bewegt wird. Dies probiert man aus - mit dem kleinsten Widerstand beginnend: indem einer der Drähte in eine freie Breadboardspalte gesteckt wird und aus dieser Spalte der Widerstand zu dem &#039;alten&#039; Steckplatz des Drahtes geführt wird. Nun startet man jeweils das Script bis der Widerstand so hoch ist, dass die Anlaufspannung beim Nutzgerätes gut ausreicht, eine Reaktion des Nutzgerät (Fahrzeug bewegt sich) zu bewirken (z.B. bei 50 Ohm beträgt der Strom im Mittel ca. 130 mA während ohne 190 mA fließen).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Ansteuerung von 3 Schaltstufen =&lt;br /&gt;
&lt;br /&gt;
== Kombination von 2 Relais ==&lt;br /&gt;
&lt;br /&gt;
[[Bild:ZrelMww2.png|thumb|right|250px|Beschaltung der Relais]] a. Die einfachste Stufe der weiteren Verschaltung erreicht man, indem der Widerstand mit einem 2. Relais überbrückt wird. Relais 1 kann dann als &#039;Hauptschalter&#039;, Relais 2 als Spannungsumschalter genutzt werden:&lt;br /&gt;
&lt;br /&gt;
b. Diese Beschaltung kann sogleich mit dem PiFace-Emulator ausprobiert werden. Damit können wir bereits 3 Schaltstufen steuern: keine, verminderte und volle Spannung.&lt;br /&gt;
&lt;br /&gt;
c. Theoretisch ließe sich auch noch eine 4. Spannungsstufe erzeugen, da mit 2 &#039;Bits&#039; (Ein/Aus bei 2 Relais) bereits 4 verschiedene Signale darstellbar sind. Beim jetzigen Aufbau werden aber lediglich die (pin1,pin2)-Signale (0,0), (1,0) und (1,1) &#039;genutzt&#039;, da Relais 1 als Hauptschalter vorgesehen ist und die Kombination (0,1) so nicht ausgewertet wird.&lt;br /&gt;
&lt;br /&gt;
== Programmgesteuerte Schaltung von 2 Relais ==&lt;br /&gt;
&lt;br /&gt;
a. Mit einem veränderten python-Script &amp;quot;wandler2.py&amp;quot; ist auch die programmgesteuerte Schaltung möglich. Dabei werden zusätzlich die Tasten 1 und 2 des PiFace genutzt, um nach dem Start des Scripts (&amp;lt;tt&amp;gt;python wandler2.py&amp;lt;/tt&amp;gt;) den Hauptschalter (Relais 1) zu steuern:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler2.py&lt;br /&gt;
 &lt;br /&gt;
 from time import sleep&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
 pfio.init()&lt;br /&gt;
 &lt;br /&gt;
 taste_1=0&lt;br /&gt;
 taste_2=0&lt;br /&gt;
 intervall_a=0.1&lt;br /&gt;
 intervall_b=0.5&lt;br /&gt;
 # Die Intervalle bestimmen die Schaltzeit für volle/verminderte Spannung&lt;br /&gt;
 &lt;br /&gt;
 print &amp;quot;Zum Start Taste 1 drücken, zum Stoppen Taste 2&amp;quot;&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 while taste_1 == 0:&lt;br /&gt;
   sleep(intervall_a)&lt;br /&gt;
   taste_1=pfio.digital_read(1)&lt;br /&gt;
&lt;br /&gt;
 # Der o.g. &#039;sleep&#039;-Befehl bestimmt die Abfragepausen für Taste 1&lt;br /&gt;
 &lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
 print &amp;quot;Strom an!&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 while taste_2 == 0:&lt;br /&gt;
   pfio.digital_write(2,1)&lt;br /&gt;
   sleep(intervall_a)&lt;br /&gt;
   pfio.digital_write(2,0)&lt;br /&gt;
   sleep(intervall_b)&lt;br /&gt;
   taste_2=pfio.digital_read(2)&lt;br /&gt;
 &lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Strom aus!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
b. Falls beim Ausprobieren von Script-Änderungen mal was schief geht, kann das Script stets auch mit der Tastenkombination (CNTRL-C) gestoppt werden. U.U. muss dann noch zusätzlich Relais 1 und/oder 2 via Emulator zurückgesetzt werden.&lt;br /&gt;
&lt;br /&gt;
c. Beim Verändern des Scripts fällt bald auf, dass die bisherige Programmsteuerung keine direkte Möglichkeit vorsieht, auf Ereignisse zu reagieren. Immerhin wird ein mechanisches Gerät gesteuert, bei dem mit Ausfällen, Fertigungstoleranzen, Umwelteinflüssen etc. zu rechnen ist (im Script wird dies bislang &#039;nur&#039; durch die Abbruchbedingung &#039;Taste 2&#039; berücksichtigt).&lt;br /&gt;
&lt;br /&gt;
== Einfache Sensor-Signale als steuernde Elemente eines Programms ==&lt;br /&gt;
&lt;br /&gt;
a. Eine wichtige Anwendung von D/A-Steuerungen ist die mögliche Reaktion dieser Steuerung auf &#039;äußere&#039; Ereignisse, die z.B. mit Hilfe von Sensoren leistbar ist.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Einf_Sens.jpg|thumb|right|250px|einfacher Sensor]]b. Für unsere Zwecke genügt zunächst ein sehr einfacher Sensor, der ein 0- oder 1-Signal liefert und idealerweise direkt am &#039;Input Pin 1&#039; des PiFace angeschlossen werden kann. So liegt beim Input Pin 1 das Signal &#039;1&#039; an, wenn eine Verbindung zu &#039;Input GND&#039; besteht.&lt;br /&gt;
Z.B. können 2 unisolierte Drähte so platziert werden, dass ein vorbeifahrendes Fahrzeug einen von ihnen genügend bewegt um den Kontakt kurze Zeit zu öffnen. Genau dann liefert dieser &#039;Sensor&#039; das Signal &#039;0&#039;. Eine - die Schwerkraft nutzende - mögliche Bauform ist rechts abgebildet ;-)&lt;br /&gt;
&lt;br /&gt;
c. Natürlich werden zusätzlich 2 isolierte Drähte benötigt, um jeden der beiden offenen Drähte geschützt mit Input Pin 1 und Input GND zu verbinden.&lt;br /&gt;
&lt;br /&gt;
d. Bei jeder Durchfahrt liefert der Sensor nun ein &#039;0&#039;-Signal, was im Script sowohl für eine Zeitmessung als auch für ein &#039;Schaltintervall-Array&#039; genutzt werden kann. Dort können abwechselnd für beide Spannungen Zeiten (die in etwa zum jeweiligen Streckenabschnitt passen) &#039;programmiert&#039; werden. Statt Taste 1 wird nun der Sensor ausgewertet (wobei Taste 1 als Sensor-Ersatz insoweit genutzt werden kann, dass sie gedrückt bleiben bzw. kurz losgelassen werden muss). Zur genaueren Zeitmessung wird noch das modul &#039;clock&#039; benötigt. &amp;quot;&amp;lt;tt&amp;gt;wandler3.py&amp;lt;/tt&amp;gt;&amp;quot; könnte also so aussehen:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler3.py&lt;br /&gt;
 &lt;br /&gt;
 from time import clock&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
 sensor_1=1&lt;br /&gt;
 sensor_2=0&lt;br /&gt;
 rundenzahl=0&lt;br /&gt;
 v_wechsel=0&lt;br /&gt;
 vorrunde=0&lt;br /&gt;
 index_zaehler=1&lt;br /&gt;
 &lt;br /&gt;
 zeit_array=[0,0.2,0.4,0.2,0.4,0.2,0.4,0.2,5,0.2,6]&lt;br /&gt;
 # dieses array enthält die sek. bis zum Spannungswechsel&lt;br /&gt;
&lt;br /&gt;
 array_laenge=9&lt;br /&gt;
 # legt fest, wie viel Werte des arrays genutzt werden sollen&lt;br /&gt;
 &lt;br /&gt;
 sensor_aus=1.3&lt;br /&gt;
 # bis der Sensor sicher in die Ruhestellung kippt, wird er nicht ausgelesen&lt;br /&gt;
  &lt;br /&gt;
 pfio.init()&lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
&lt;br /&gt;
 # das Fahrzeug wird langsam zum Start (=Sensor) bewegt&lt;br /&gt;
 while sensor_1 == 1 :&lt;br /&gt;
   sensor_1=pfio.digital_read(1)&lt;br /&gt;
  &lt;br /&gt;
 print &amp;quot;fliegender Start... zum Beenden Taste 2 drücken&amp;quot;&lt;br /&gt;
 print &amp;quot;Runde Nr., Ges.Zeit, Rundenzeit, mittlere Rundenzeit&amp;quot;&lt;br /&gt;
 start_zeit=clock()&lt;br /&gt;
 runden_start=start_zeit&lt;br /&gt;
  &lt;br /&gt;
 while sensor_2 == 0 :&lt;br /&gt;
   sensor_2=pfio.digital_read(2)&lt;br /&gt;
   v_wechsel=1-v_wechsel&lt;br /&gt;
   pfio.digital_write(2,v_wechsel)&lt;br /&gt;
   sensor_zeit=clock()&lt;br /&gt;
  &lt;br /&gt;
   while zeit_array[index_zaehler]+sensor_zeit &amp;gt; clock() :&lt;br /&gt;
     if runden_start+sensor_aus &amp;lt; clock() :&lt;br /&gt;
 &lt;br /&gt;
       sensor_1=pfio.digital_read(1) &lt;br /&gt;
       if sensor_1 == 0 :&lt;br /&gt;
         rundenzahl=rundenzahl+1&lt;br /&gt;
         runden_start=clock()&lt;br /&gt;
         zeit=runden_start-start_zeit&lt;br /&gt;
         print rundenzahl, zeit, zeit-vorrunde, zeit/rundenzahl&lt;br /&gt;
         vorrunde=zeit&lt;br /&gt;
         sensor_zeit=0&lt;br /&gt;
         index_zaehler=0&lt;br /&gt;
         v_wechsel=0&lt;br /&gt;
  &lt;br /&gt;
   index_zaehler=index_zaehler+1&lt;br /&gt;
   if index_zaehler &amp;gt; array_laenge :&lt;br /&gt;
     sensor_2=1&lt;br /&gt;
     print &amp;quot;array-Ende erreicht!&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Outp 1 &amp;amp; 2 auf 0!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wird das Array-Ende erreicht, wurden entweder zu wenige Einträge vorgesehen oder es befindet sich kein Fahrzeug (mehr) auf der Strecke, das den Sensor und damit des Zurücksetzen des Arrays auslösen konnte.&lt;br /&gt;
&lt;br /&gt;
e. Das Array ist an die jeweilige Strecke anzupassen, wobei der vorderste Eintrag ungenutzt bleibt und dann mit der Dauer für maximale Spannung begonnen wird. Solange man mit Relais arbeitet, sollten die Schaltzeiten nicht zu kurz sein (&amp;gt;0.1 sek.), da diese eine gewisse mechanische Trägheit besitzen.&lt;br /&gt;
&lt;br /&gt;
f. Eben diese mechanische Beschaffenheit der Relais (Verschleiß) ist auch ein guter Grund, auf &#039;volle&#039; digitale Signalumwandlung umzustellen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Optokoppler als Ersatz für Relais =&lt;br /&gt;
&lt;br /&gt;
Ähnlich wie ein Relais dient ein [[Optokoppler]] dazu, eine Signalübertragung zwischen zwei getrennten Stromkreisen zu ermöglichen. Bei diesem Projekt liegt der Einsatz von Optokopplern nahe, da sie schneller schalten und keine beweglichen Teile besitzen. Für unsere Zwecke benötigen wir nun als zusätzliche Elemente: Optokoppler (CNY 17-4), npn-[[Transistor]]en (BC 337-40) zur Signalverstärkung sowie einige Widerstände im Bereich von 2k und 400 Ohm. &lt;br /&gt;
&lt;br /&gt;
== Kaskadierung von Transistoren zur Signalverstärkung ==&lt;br /&gt;
&lt;br /&gt;
a. Entsprechend Schritt 2.4.d. (ein Relais bei 50 Ohm) wird zunächst ein [[Optokoppler]] eingesetzt, dessen Signal durch einen Transistor verstärkt wird, um die &#039;Grundspannung&#039; zu schalten (Pin 3 und 6 beim Optokoppler sollten unbeschaltet bleiben, allein der &#039;Lichtstrom&#039; reicht für eine Ansteuerung aus):&lt;br /&gt;
&lt;br /&gt;
[[Bild:PiF_CNY_BC_1.png|400px|Optokoppler mit Transistor]]&lt;br /&gt;
&lt;br /&gt;
b. Da immer mit einer gewissen Toleranz bei allen Komponenten zu rechnen ist, kann es sein, dass u.U. die Widerstände etwas größer oder kleiner gewählt werden müssen. Beim Ausprobieren sollte man hier in 10% Schritten variieren.&lt;br /&gt;
&lt;br /&gt;
c. Bei Austesten mit Emulator oder Script ist auch zu beachten, dass nun &#039;Output Pin 8&#039; genutzt wird, da dieser nicht mit den Relais verschaltet ist.&lt;br /&gt;
&lt;br /&gt;
== Umsetzung von 3 Schaltstufen mit Optokopplern ==&lt;br /&gt;
&lt;br /&gt;
a. Entsprechend dem Vorgehen beim Relais kann nun auch der kleine Widerstand zusätzlich beschaltet werden um seine gesteuerte Überbrückung zu ermöglichen. Da hier eine relativ geringe Spannung aufgeschaltet wird, kann zu Beginn eine Diode eingesetzt werden, die die Schaltstufe &#039;maximale Spannung&#039; anzeigt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:SmPiFu2ou2T.png|400px|Kombination von 2 Optokopplern]]&lt;br /&gt;
&lt;br /&gt;
b. Vor dem Testen ist wieder zu beachten, dass nun zusätzlich &#039;Output Pin 7&#039; genutzt wird (statt Output Pin 2).&lt;br /&gt;
&lt;br /&gt;
c. Eine mögliche Realisierung sieht so aus: http://youtu.be/xQ7N-PrIULk&lt;br /&gt;
&lt;br /&gt;
== Zusätzliche Erhöhung der Schaltstufen bei D/A-Wandlern ==&lt;br /&gt;
&lt;br /&gt;
a. Zwar benötigen wir in unserem speziellen Beispiel eine &#039;Grundspannung&#039;, die sich dahingehend auswirkt, dass - wie unter 3.1.c. erwähnt - eine Signalkombination nicht ausgewertet wird, aber mit jeder weiteren Schaltstufe würde sich dieses Problem (theoretisch) relativieren, da bei geschickter Auswahl der Widerstände (z.B. im Verhältnis 1 zu 2) jeweils eine Verdoppelung der Kombinationsmöglichkeiten erreichbar ist.&lt;br /&gt;
&lt;br /&gt;
b. Wird hier der 50 Ohm Widerstand asymmetrisch geteilt (z.B. 15 + 35 Ohm, s.a. [[Spannungsteiler]]) um dort ein weiteres Signal umsetzen zu können, ergeben sich direkt folgende 5 Schaltstufen (aus, 50, 35, 15 und 0 Ohm) u.s.w.:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Sm3ou3t2.png|400px|Erhöhung der Schaltstufen]]&lt;br /&gt;
&lt;br /&gt;
c. Zur Ansteuerung dieser Schaltstufen wäre das Script so zu ändern, dass nun zwischen mehr als 2 Stufen gewechselt werden kann und im Array entsprechende Zusatzdaten vorgegeben und ausgelesen werden. Mehr als diese Stufen sind im konkreten Fall aber nicht sinnvoll, da die entstehende Verlustleistung in der Schaltung die maximal verfügbare Leistung reduziert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Weiterführende Ideen =&lt;br /&gt;
&lt;br /&gt;
Die Ausbaumöglichkeiten dieses Projektes sind vielfältig:&lt;br /&gt;
&lt;br /&gt;
== Hardwareseitige Ausbauvarianten ==&lt;br /&gt;
&lt;br /&gt;
- beispielhafte Umsetzung einer differenzierten Abstufung mittels einer logarithmischen Einteilung oder eines möglichst oft durch 2 teilbaren Anfangswertes und der Teiler (640 Ohm, 320, 160...);&lt;br /&gt;
&lt;br /&gt;
- Nachbau des Projekts mit einem Mikrocontroller (ggf. mit LCD-Anzeige);&lt;br /&gt;
&lt;br /&gt;
- Umbau der Steuerung mit dem Ziel, sie direkt an die GPIO-Pins des RPi anzuschließen;&lt;br /&gt;
&lt;br /&gt;
- Entwurf einer Zusatzschaltung, die in diesem Beispiel eine Rückmeldung liefert, ob ein Verbraucher aktiv ist oder nicht (Fahrzeug noch auf der Strecke?);&lt;br /&gt;
&lt;br /&gt;
- Entwurf einer Zusatzschaltung, die erkennt wie viel Strom fliesst: damit wären Rückschlüsse auf den Streckenverlauf möglich (Kurve=etwas mehr Strom, Steigung=noch mehr Strom nötig, etc.) und auch eine programmgesteuerte Optimierung der Array-Schaltzeiten dankbar; &lt;br /&gt;
&lt;br /&gt;
- Einsatz anderer Sensortechniken und/oder mehrerer Sensoren zur Optimierung der Schnelligkeit oder parallelen Steuerung eines 2. Fahrzeuges;&lt;br /&gt;
&lt;br /&gt;
== Softwareseitige Ausbauvarianten ==&lt;br /&gt;
&lt;br /&gt;
- Optimierung des Scripts, indem die Sensor-Abfrage über einen &#039;Listener&#039; umgesetzt wird;&lt;br /&gt;
&lt;br /&gt;
- Erweiterung des Scripts um eine GUI mit Hilfe der python-lib Tkinter, um einen Nutzerzugriff auf das Steuerarray und/oder eine &#039;Verwaltung&#039; mehrerer Fahrzeuge;&lt;br /&gt;
&lt;br /&gt;
- Einbindung eines Web-Interface um eine &#039;Fernsteuerung&#039; zu ermöglichen...&lt;br /&gt;
&lt;br /&gt;
...in jedem Fall: viel Spaß beim Basteln!&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [http://hackaday.com/2013/01/23/replacement-controllers-for-slot-car-racing/ ähnliches Projekt bei &#039;hackaday&#039;] &lt;br /&gt;
* [https://docs.google.com/folder/d/0B-UAZ9CyJCLGQjJ3RDlqa2pqaDg/edit?pli=1&amp;amp;docId=0B-UAZ9CyJCLGNmpMeVpyYlZJUWc Relaisschaltung mit pädagogischer Erweiterung der Universität Manchester (englischspr.)]&lt;br /&gt;
* [http://elinux.org/RPi_Projects/PiFace_controlling_a_slot-car paralleler englischsp. Bericht des Autors zum RPi mit anderem Schwerpunkt] &lt;br /&gt;
* [http://elinux.org/RPi_Projects englischsp. Projektliste zum RPi]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Raspberry Pi]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Mknot9</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=RPi_als_D/A-Wandler&amp;diff=74388</id>
		<title>RPi als D/A-Wandler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=RPi_als_D/A-Wandler&amp;diff=74388"/>
		<updated>2013-03-08T18:01:45Z</updated>

		<summary type="html">&lt;p&gt;Mknot9: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von mknot9&#039;&#039; (M. Knoop)&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
Oft wird ein Computer &#039;nur&#039; genutzt um darauf Software ablaufen zu lassen. Dessen Möglichkeit zur Steuerung von elektrischen und mechanischen Geräten wird dabei leicht übersehen.&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel richtet sich daher an Einsteiger, die mit dem [[Raspberry Pi]] (&#039;RPi&#039;) Grundlagen der Computersteuerung mit Relais und [[Spannungsteiler]]n nachvollziehen möchten. Es wird schrittweise dargestellt, wie mittels eines D/A-Wandlers (Digital/Analog-Wandler = Umwandlung von digitalen 1/0 Signale) die Steuerung einer stufenweise veränderbaren Ausgangsspannung aufgebaut werden kann.&lt;br /&gt;
&lt;br /&gt;
= Verwendete Hardware =&lt;br /&gt;
&lt;br /&gt;
== RPi in Kombination mit der &#039;PiFace&#039;-Karte als Bastelplattform ==&lt;br /&gt;
&lt;br /&gt;
Dank der einfachen Bauweise bietet sich der RPi mit seinen frei zugänglichen GPIO-Pins als ideale Bastelplattform an. Trotzdem kann es beim anfänglichen Experimentieren mit Schaltungen öfters zu kleinen Fehlern kommen, die schlimmstenfalls die empfindliche Elektronik des RPi dauerhaft beschädigen können.&lt;br /&gt;
&lt;br /&gt;
Daher wird bei diesem Projekt zusätzlich mit der &#039;PiFace[http://elinux.org/RPi_Expansion_Boards#Piface]&#039;-Karte gearbeitet, die man auf die GPIO-Pins stecken kann. Diese Erweiterungskarte verschaltet die GPIO-Pins auf je 8 digitale Ein- und Ausgänge sowie 2 Relais, die eine galvanische Trennung von Stromkreisen ermöglichen. Damit besteht auch für Einsteiger ein gewisser Schutz für die Steuerelektronik des RPi.&lt;br /&gt;
&lt;br /&gt;
Auch im weiteren Verlauf dieser Einführung soll noch auf eine Trennung der Stromkreise Wert gelegt werden, so dass für erste digitale Schaltexperimente ein Optokoppler genutzt wird. Die spätere Nutzung der &#039;Input Pins&#039; des PiFace um eine Steuerung der D/A-Wandlung durch bestimmte Ereignisse zu ermöglichen, erfolgt ebenfalls passiv.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Auch wenn mit vermeintlich &#039;sicheren&#039; Transformatoren gebastelt wird, muss stets bedacht werden, dass diese an einem 230V-Stromnetz betrieben werden und man eher einmal mehr als weniger prüfen sollte, ob man durch eventuelle Fehler mit lebensgefährlicher Spannung in Berührung kommt!&lt;br /&gt;
&lt;br /&gt;
== Auswahl eines Beispielprojektes ==&lt;br /&gt;
&lt;br /&gt;
Günstige Möglichkeiten ein Gerät zu finden, das mit analogen Spannungen arbeitet, bieten sich u.a. im Spielzeugbereich. Im Grunde eignet sich alles, was mit Batterien oder mit Gleichspannungen unter 24 V betrieben wird.&lt;br /&gt;
&lt;br /&gt;
Da jedoch ein Ziel das Steuern von analogen Spannungen ist, bietet sich insbesondere alles an, bei dem [[Potentiometer]] eingesetzt werden. Einen dieser &#039;Handregler&#039; sollte man übrig haben, da er von seinem Anschlusskabel abgetrennt werden muss, um den oft proprietären Steckanschluss nutzen zu können. In diesem Sinne wird hier eine handelsübliche Spielzeug-Autorennbahn mit Potentiometer-Handreglern genutzt.&lt;br /&gt;
&lt;br /&gt;
== Sonstige Bauteile ==&lt;br /&gt;
&lt;br /&gt;
Für die ersten Grundlagen (s. Teile 2 &amp;amp; 3) genügen bereits rund 2 m isolierter Draht, der nicht aus verdrillten feinen Adern (Litze) bestehen sollte, 50 cm nicht-isolierter Draht, einige niederohmige Widerstände (z.B. je 2 mal 100 Ohm, 80, 60, sowie 20) und ein &#039;Experimentierbrett&#039; (engl. [[Breadboard]]).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Grundlagen und Vorbereitung des Projekts =&lt;br /&gt;
&lt;br /&gt;
== Umwandlung von 1/0 zu Ein/Aus mit einem Relais ==&lt;br /&gt;
&lt;br /&gt;
Vom Prinzip her ist jede Umwandlung eines digitalen 0 oder 1 Signals (das über eine bestimmte Spannungsdifferenz festgelegt ist) in eine (nutzbare) Spannung bereits eine D/A-Wandlung. Dies wird schlicht so realisiert, dass mit einer Eingabe am RPi die Nutzspannung des &#039;Verbrauchers&#039; zunächst einfach an- und ausgeschaltet wird.&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung der zu steuernden Hardware ==&lt;br /&gt;
&lt;br /&gt;
a. Um Fehlerquellen auszuschließen sollte zunächst (und ggf. auch später!) kurz getestet werden, ob der vorhandene Regler wie erwartet funktioniert.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pif_Con9.jpg|thumb|right|400px|Fixierung der Reglerkabel]]&lt;br /&gt;
b. Nach dem Trennen des Reglers von der Einspeisung (und ggf. Ziehen des Netzsteckers) muss das Regler-Kabel abgeschnitten werden (eher nahe beim Regler, da das Kabel bald bis zum Breadboard reichen soll). Die neuen Enden des Einspeiseteils werden abisoliert und auf dem Breadboard diagonal zueinander mit einigen Spalten Abstand fixiert. Auch können bereits die Drähte, die später zum RPi führen, jeweils in den passenden kontaktführenden Spalten eingesteckt werden, z. B. wie rechts zu sehen (die nicht beschrifteten Drähte können vorerst ignoriert werden):&lt;br /&gt;
&lt;br /&gt;
c. Nun bietet sich eine gute Gelegenheit die maximale Spannung am Nutzgerät zu messen. Man verbindet das Regler-Kabel (nun ohne Regler) wieder mit der Einspeisung und die offenen Enden der Drähte mit dem Messgerät, bei dem zunächst ein Messbereich von ca. 10-50 Volt gewählt werden sollte. Dies sollte dann z.B. 14,8 V anzeigen. Natürlich können auch die beiden offenen Enden einen kleinen Moment kurz geschlossen werden, man sollte aber bedenken, dass das zu regelnde Nutzgerät dann die maximal vorgesehene Spannung erhält (hier: maximales Tempo).&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung des RPi ==&lt;br /&gt;
&lt;br /&gt;
Es wird davon ausgegangen, dass entsprechend des zugehörigen &#039;manual&#039; das PiFace bereits auf den RPi gesteckt ist, die nötigen python-Bibliotheken installiert sind und man sich im Terminal-Arbeitsverzeichnis &#039;pi&#039; befindet.&lt;br /&gt;
&lt;br /&gt;
a. Zunächst wird der PiFace-Emulator (im Terminal direkt aus dem Arbeitsverzeichnis) gestartet: &amp;lt;tt&amp;gt;piface/scripts/piface-emulator&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b. Wenn alles richtig installiert wurde, erscheint ein Fenster (unten links), bei dem die vorerst wichtigen blauen Signale am rechten Rand wie folgt angezeigt werden sollten: &lt;br /&gt;
 &lt;br /&gt;
[[Datei:RPi_PiF_em-scs.jpg|400px|Piface-Emulator im default-Zustand]] [[Datei:RPi_PiF_em_scs1.jpg|400px|Piface-Relais 1 auf &#039;1&#039; geschaltet]]&lt;br /&gt;
&lt;br /&gt;
c. Das rechte Fenster ergibt sich, wenn man nun im Fenster auf &amp;quot;Override Enable&amp;quot; und dann &amp;quot;Output Pin 1&amp;quot; klickt. Es müsste ein &amp;quot;Klick&amp;quot; vom Relais 1 zu hören sein sowie der Schaltzustand des unteren Relais 1 (das an den Output Pin 1 gekoppelt ist) auf die Verbindung der beiden unteren Anschlüsse wechseln. Zugleich wird das erste LED-Icon beim Output Pin 1 rot sowie das zugehörige LED-Icon blau.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pif_rel2.png|thumb|right|250px|Schema der Piface-Relais]]&lt;br /&gt;
d. Rechts ist der Schaltzustand der Relais, die zu Beginn genutzt werden, im Grundzustand dargestellt (jeweils der mittlere und obere Kontakt sind kurzgeschlossen, der jeweils untere Kontakt ist frei):&lt;br /&gt;
&lt;br /&gt;
e. Ein weiterer Klick auf &amp;quot;Output Pin 1&amp;quot; versetzt das Relais in den Ausgangszustand, der vor dem nächsten Schritt wieder eingestellt werden sollte.&lt;br /&gt;
&lt;br /&gt;
f. Das Relais lässt sich auch mittels eines Python-Scripts vom RPi aus ansteuern. Dazu wird folgende Textdatei &amp;quot;wandler.py&amp;quot; im Arbeitsverzeichnis abgespeichert und mit dem Befehl &amp;quot;&amp;lt;tt&amp;gt;python wandler.py&amp;lt;/tt&amp;gt;&amp;quot; gestartet:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler.py&lt;br /&gt;
&lt;br /&gt;
 from time import sleep&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
&lt;br /&gt;
 pfio.init()&lt;br /&gt;
&lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
 print &amp;quot;Strom an&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 sleep(2)&lt;br /&gt;
&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Strom aus&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Nach dem Absetzen des Befehls wechselt nun das blaue Signal an Relais 1 für 2 Sekunden und das Relais klickt entsprechend.&lt;br /&gt;
&lt;br /&gt;
== Einsatz eines Relais&#039; zur Umsetzung von Spannungsänderungen ==&lt;br /&gt;
&lt;br /&gt;
a. Ist das Relais wieder im Ausgangszustand, befestigt man nun einen der vom Breadboard führenden Drähte am unteren und einen am mittleren Relaiseingang (im Moment ist die Polarität noch egal). Zunächst sollte nichts passieren (das Relais hält diesen ja Stromkreis noch offen).&lt;br /&gt;
&lt;br /&gt;
b. Startet man aber das Script wieder (&amp;lt;tt&amp;gt;python wandler.py&amp;lt;/tt&amp;gt;) oder klickt auf &#039;Output Pin 1&#039; wird der Nutzstromkreis geschlossen. Nochmals aufgepasst: unser Nutzer erhält wieder die maximal vorgesehene Spannung - also besser vorher im Script &amp;quot;&amp;lt;tt&amp;gt;sleep(0.3)&amp;lt;/tt&amp;gt;&amp;quot; setzen und speichern.&lt;br /&gt;
&lt;br /&gt;
c. Im Prinzip ist damit die programmgesteuerte Umsetzung eines 0/1 Signals in z.B. eine 0V/15V Spannung erreicht.&lt;br /&gt;
&lt;br /&gt;
d. Da wir bald verschiedene Steuerspannungen schalten wollen, geht es jetzt darum herauszufinden, bei welcher Spannung unser Nutzgerät gerade noch bewegt wird. Dies probiert man aus - mit dem kleinsten Widerstand beginnend: indem einer der Drähte in eine freie Breadboardspalte gesteckt wird und aus dieser Spalte der Widerstand zu dem &#039;alten&#039; Steckplatz des Drahtes geführt wird. Nun startet man jeweils das Script bis der Widerstand so hoch ist, dass die Anlaufspannung beim Nutzgerätes gut ausreicht, eine Reaktion des Nutzgerät (Fahrzeug bewegt sich) zu bewirken (z.B. bei 50 Ohm beträgt der Strom im Mittel ca. 130 mA während ohne 190 mA fließen).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Ansteuerung von 3 Schaltstufen =&lt;br /&gt;
&lt;br /&gt;
== Kombination von 2 Relais ==&lt;br /&gt;
&lt;br /&gt;
[[Bild:ZrelMww2.png|thumb|right|250px|Beschaltung der Relais]] a. Die einfachste Stufe der weiteren Verschaltung erreicht man, indem der Widerstand mit einem 2. Relais überbrückt wird. Relais 1 kann dann als &#039;Hauptschalter&#039;, Relais 2 als Spannungsumschalter genutzt werden:&lt;br /&gt;
&lt;br /&gt;
b. Diese Beschaltung kann sogleich mit dem PiFace-Emulator ausprobiert werden. Damit können wir bereits 3 Schaltstufen steuern: keine, verminderte und volle Spannung.&lt;br /&gt;
&lt;br /&gt;
c. Theoretisch ließe sich auch noch eine 4. Spannungsstufe erzeugen, da mit 2 &#039;Bits&#039; (Ein/Aus bei 2 Relais) bereits 4 verschiedene Signale darstellbar sind. Beim jetzigen Aufbau werden aber lediglich die (pin1,pin2)-Signale (0,0), (1,0) und (1,1) &#039;genutzt&#039;, da Relais 1 als Hauptschalter vorgesehen ist und die Kombination (0,1) so nicht ausgewertet wird.&lt;br /&gt;
&lt;br /&gt;
== Programmgesteuerte Schaltung von 2 Relais ==&lt;br /&gt;
&lt;br /&gt;
a. Mit einem veränderten python-Script &amp;quot;wandler2.py&amp;quot; ist auch die programmgesteuerte Schaltung möglich. Dabei werden zusätzlich die Tasten 1 und 2 des PiFace genutzt, um nach dem Start des Scripts (&amp;lt;tt&amp;gt;python wandler2.py&amp;lt;/tt&amp;gt;) den Hauptschalter (Relais 1) zu steuern:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler2.py&lt;br /&gt;
 &lt;br /&gt;
 from time import sleep&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
 pfio.init()&lt;br /&gt;
 &lt;br /&gt;
 taste_1=0&lt;br /&gt;
 taste_2=0&lt;br /&gt;
 intervall_a=0.1&lt;br /&gt;
 intervall_b=0.5&lt;br /&gt;
 # Die Intervalle bestimmen die Schaltzeit für volle/verminderte Spannung&lt;br /&gt;
 &lt;br /&gt;
 print &amp;quot;Zum Start Taste 1 drücken, zum Stoppen Taste 2&amp;quot;&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 while taste_1 == 0:&lt;br /&gt;
   sleep(intervall_a)&lt;br /&gt;
   taste_1=pfio.digital_read(1)&lt;br /&gt;
&lt;br /&gt;
 # Der o.g. &#039;sleep&#039;-Befehl bestimmt die Abfragepausen für Taste 1&lt;br /&gt;
 &lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
 print &amp;quot;Strom an!&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 while taste_2 == 0:&lt;br /&gt;
   pfio.digital_write(2,1)&lt;br /&gt;
   sleep(intervall_a)&lt;br /&gt;
   pfio.digital_write(2,0)&lt;br /&gt;
   sleep(intervall_b)&lt;br /&gt;
   taste_2=pfio.digital_read(2)&lt;br /&gt;
 &lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Strom aus!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
b. Falls beim Ausprobieren von Script-Änderungen mal was schief geht, kann das Script stets auch mit der Tastenkombination (CNTRL-C) gestoppt werden. U.U. muss dann noch zusätzlich Relais 1 und/oder 2 via Emulator zurückgesetzt werden.&lt;br /&gt;
&lt;br /&gt;
c. Beim Verändern des Scripts fällt bald auf, dass die bisherige Programmsteuerung keine direkte Möglichkeit vorsieht, auf Ereignisse zu reagieren. Immerhin wird ein mechanisches Gerät gesteuert, bei dem mit Ausfällen, Fertigungstoleranzen, Umwelteinflüssen etc. zu rechnen ist (im Script wird dies bislang &#039;nur&#039; durch die Abbruchbedingung &#039;Taste 2&#039; berücksichtigt).&lt;br /&gt;
&lt;br /&gt;
== Einfache Sensor-Signale als steuernde Elemente eines Programms ==&lt;br /&gt;
&lt;br /&gt;
a. Eine wichtige Anwendung von D/A-Steuerungen ist die mögliche Reaktion dieser Steuerung auf &#039;äußere&#039; Ereignisse, die z.B. mit Hilfe von Sensoren leistbar ist.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Einf_Sens.jpg|thumb|right|250px|einfacher Sensor]]b. Für unsere Zwecke genügt zunächst ein sehr einfacher Sensor, der ein 0- oder 1-Signal liefert und idealerweise direkt am &#039;Input Pin 1&#039; des PiFace angeschlossen werden kann. So liegt beim Input Pin 1 das Signal &#039;1&#039; an, wenn eine Verbindung zu &#039;Input GND&#039; besteht.&lt;br /&gt;
Z.B. können 2 unisolierte Drähte so platziert werden, dass ein vorbeifahrendes Fahrzeug einen von ihnen genügend bewegt um den Kontakt kurze Zeit zu öffnen. Genau dann liefert dieser &#039;Sensor&#039; das Signal &#039;0&#039;. Eine - die Schwerkraft nutzende - mögliche Bauform ist rechts abgebildet ;-)&lt;br /&gt;
&lt;br /&gt;
c. Natürlich werden zusätzlich 2 isolierte Drähte benötigt, um jeden der beiden offenen Drähte geschützt mit Input Pin 1 und Input GND zu verbinden.&lt;br /&gt;
&lt;br /&gt;
d. Bei jeder Durchfahrt liefert der Sensor nun ein &#039;0&#039;-Signal, was im Script sowohl für eine Zeitmessung als auch für ein &#039;Schaltintervall-Array&#039; genutzt werden kann. Dort können abwechselnd für beide Spannungen Zeiten (die in etwa zum jeweiligen Streckenabschnitt passen) &#039;programmiert&#039; werden. Statt Taste 1 wird nun der Sensor ausgewertet (wobei Taste 1 als Sensor-Ersatz insoweit genutzt werden kann, dass sie gedrückt bleiben bzw. kurz losgelassen werden muss). Zur genaueren Zeitmessung wird noch das modul &#039;clock&#039; benötigt. &amp;quot;&amp;lt;tt&amp;gt;wandler3.py&amp;lt;/tt&amp;gt;&amp;quot; könnte also so aussehen:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler3.py&lt;br /&gt;
 &lt;br /&gt;
 from time import clock&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
 sensor_1=1&lt;br /&gt;
 sensor_2=0&lt;br /&gt;
 rundenzahl=0&lt;br /&gt;
 v_wechsel=0&lt;br /&gt;
 vorrunde=0&lt;br /&gt;
 index_zaehler=1&lt;br /&gt;
 &lt;br /&gt;
 zeit_array=[0,0.2,0.4,0.2,0.4,0.2,0.4,0.2,5,0.2,6]&lt;br /&gt;
 # dieses array enthält die sek. bis zum Spannungswechsel&lt;br /&gt;
&lt;br /&gt;
 array_laenge=9&lt;br /&gt;
 # legt fest, wie viel Werte des arrays genutzt werden sollen&lt;br /&gt;
 &lt;br /&gt;
 sensor_aus=1.3&lt;br /&gt;
 # bis der Sensor sicher in die Ruhestellung kippt, wird er nicht ausgelesen&lt;br /&gt;
  &lt;br /&gt;
 pfio.init()&lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
&lt;br /&gt;
 # das Fahrzeug wird langsam zum Start (=Sensor) bewegt&lt;br /&gt;
 while sensor_1 == 1 :&lt;br /&gt;
   sensor_1=pfio.digital_read(1)&lt;br /&gt;
  &lt;br /&gt;
 print &amp;quot;fliegender Start... zum Beenden Taste 2 drücken&amp;quot;&lt;br /&gt;
 print &amp;quot;Runde Nr., Ges.Zeit, Rundenzeit, mittlere Rundenzeit&amp;quot;&lt;br /&gt;
 start_zeit=clock()&lt;br /&gt;
 runden_start=start_zeit&lt;br /&gt;
  &lt;br /&gt;
 while sensor_2 == 0 :&lt;br /&gt;
   sensor_2=pfio.digital_read(2)&lt;br /&gt;
   v_wechsel=1-v_wechsel&lt;br /&gt;
   pfio.digital_write(2,v_wechsel)&lt;br /&gt;
   sensor_zeit=clock()&lt;br /&gt;
  &lt;br /&gt;
   while zeit_array[index_zaehler]+sensor_zeit &amp;gt; clock() :&lt;br /&gt;
     if runden_start+sensor_aus &amp;lt; clock() :&lt;br /&gt;
 &lt;br /&gt;
       sensor_1=pfio.digital_read(1) &lt;br /&gt;
       if sensor_1 == 0 :&lt;br /&gt;
         rundenzahl=rundenzahl+1&lt;br /&gt;
         runden_start=clock()&lt;br /&gt;
         zeit=runden_start-start_zeit&lt;br /&gt;
         print rundenzahl, zeit, zeit-vorrunde, zeit/rundenzahl&lt;br /&gt;
         vorrunde=zeit&lt;br /&gt;
         sensor_zeit=0&lt;br /&gt;
         index_zaehler=0&lt;br /&gt;
         v_wechsel=0&lt;br /&gt;
  &lt;br /&gt;
   index_zaehler=index_zaehler+1&lt;br /&gt;
   if index_zaehler &amp;gt; array_laenge :&lt;br /&gt;
     sensor_2=1&lt;br /&gt;
     print &amp;quot;array-Ende erreicht!&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Outp 1 &amp;amp; 2 auf 0!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wird das Array-Ende erreicht, wurden entweder zu wenige Einträge vorgesehen oder es befindet sich kein Fahrzeug (mehr) auf der Strecke, das den Sensor und damit des Zurücksetzen des Arrays auslösen konnte.&lt;br /&gt;
&lt;br /&gt;
e. Das Array ist an die jeweilige Strecke anzupassen, wobei der vorderste Eintrag ungenutzt bleibt und dann mit der Dauer für maximale Spannung begonnen wird. Solange man mit Relais arbeitet, sollten die Schaltzeiten nicht zu kurz sein (&amp;gt;0.1 sek.), da diese eine gewisse mechanische Trägheit besitzen.&lt;br /&gt;
&lt;br /&gt;
f. Eben diese mechanische Beschaffenheit der Relais (Verschleiß) ist auch ein guter Grund, auf &#039;volle&#039; digitale Signalumwandlung umzustellen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Optokoppler als Ersatz für Relais =&lt;br /&gt;
&lt;br /&gt;
Ähnlich wie ein Relais dient ein [[Optokoppler]] dazu, eine Signalübertragung zwischen zwei getrennten Stromkreisen zu ermöglichen. Bei diesem Projekt liegt der Einsatz von Optokopplern nahe, da sie schneller schalten und keine beweglichen Teile besitzen. Für unsere Zwecke benötigen wir nun als zusätzliche Elemente: Optokoppler (CNY 17-4), npn-[[Transistor]]en (BC 337-40) zur Signalverstärkung sowie einige Widerstände im Bereich von 2k und 400 Ohm. &lt;br /&gt;
&lt;br /&gt;
== Kaskadierung von Transistoren zur Signalverstärkung ==&lt;br /&gt;
&lt;br /&gt;
a. Entsprechend Schritt 2.4.d. (ein Relais bei 50 Ohm) wird zunächst ein [[Optokoppler]] eingesetzt, dessen Signal durch einen Transistor verstärkt wird, um die &#039;Grundspannung&#039; zu schalten (Pin 3 und 6 beim Optokoppler sollten unbeschaltet bleiben, allein der &#039;Lichtstrom&#039; reicht für eine Ansteuerung aus):&lt;br /&gt;
&lt;br /&gt;
[[Bild:PiF_CNY_BC_1.png|400px|Optokoppler mit Transistor]]&lt;br /&gt;
&lt;br /&gt;
b. Da immer mit einer gewissen Toleranz bei allen Komponenten zu rechnen ist, kann es sein, dass u.U. die Widerstände etwas größer oder kleiner gewählt werden müssen. Beim Ausprobieren sollte man hier in 10% Schritten variieren.&lt;br /&gt;
&lt;br /&gt;
c. Bei Austesten mit Emulator oder Script ist auch zu beachten, dass nun &#039;Output Pin 8&#039; genutzt wird, da dieser nicht mit den Relais verschaltet ist.&lt;br /&gt;
&lt;br /&gt;
== Umsetzung von 3 Schaltstufen mit Optokopplern ==&lt;br /&gt;
&lt;br /&gt;
a. Entsprechend dem Vorgehen beim Relais kann nun auch der kleine Widerstand zusätzlich beschaltet werden um seine gesteuerte Überbrückung zu ermöglichen. Da hier eine relativ geringe Spannung aufgeschaltet wird, kann zu Beginn eine Diode eingesetzt werden, die die Schaltstufe &#039;maximale Spannung&#039; anzeigt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:SmPiFu2ou2T.png|400px|Kombination von 2 Optokopplern]]&lt;br /&gt;
&lt;br /&gt;
b. Vor dem Testen ist wieder zu beachten, dass nun zusätzlich &#039;Output Pin 7&#039; genutzt wird (statt Output Pin 2).&lt;br /&gt;
&lt;br /&gt;
c. Eine mögliche Realisierung sieht so aus: http://youtu.be/xQ7N-PrIULk&lt;br /&gt;
&lt;br /&gt;
== Zusätzliche Erhöhung der Schaltstufen bei D/A-Wandlern ==&lt;br /&gt;
&lt;br /&gt;
a. Zwar benötigen wir in unserem speziellen Beispiel eine &#039;Grundspannung&#039;, die sich dahingehend auswirkt, dass - wie unter 3.1.c. erwähnt - eine Signalkombination nicht ausgewertet wird, aber mit jeder weiteren Schaltstufe würde sich dieses Problem (theoretisch) relativieren, da bei geschickter Auswahl der Widerstände (z.B. im Verhältnis 1 zu 2) jeweils eine Verdoppelung der Kombinationsmöglichkeiten erreichbar ist.&lt;br /&gt;
&lt;br /&gt;
b. Wird hier der 50 Ohm Widerstand asymmetrisch geteilt (z.B. 15 + 35 Ohm, s.a. [[Spannungsteiler]]) um dort ein weiteres Signal umsetzen zu können, ergeben sich direkt folgende 5 Schaltstufen (aus, 50, 35, 15 und 0 Ohm) u.s.w.:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Sm3ou3t2.png|400px|Erhöhung der Schaltstufen]]&lt;br /&gt;
&lt;br /&gt;
c. Zur Ansteuerung dieser Schaltstufen wäre das Script so zu ändern, dass nun zwischen mehr als 2 Stufen gewechselt werden kann und im Array entsprechende Zusatzdaten vorgegeben und ausgelesen werden. Mehr als diese Stufen sind im konkreten Fall aber nicht sinnvoll, da die entstehende Verlustleistung in der Schaltung die maximal verfügbare Leistung reduziert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Weiterführende Ideen =&lt;br /&gt;
&lt;br /&gt;
Die Ausbaumöglichkeiten dieses Projektes sind vielfältig:&lt;br /&gt;
&lt;br /&gt;
== Hardwareseitige Ausbauvarianten ==&lt;br /&gt;
&lt;br /&gt;
- beispielhafte Umsetzung einer differenzierten Abstufung mittels einer logarithmischen Einteilung oder eines möglichst oft durch 2 teilbaren Anfangswertes und der Teiler (640 Ohm, 320, 160...);&lt;br /&gt;
&lt;br /&gt;
- Nachbau des Projekts mit einem Mikrocontroller (ggf. mit LCD-Anzeige);&lt;br /&gt;
&lt;br /&gt;
- Umbau der Steuerung mit dem Ziel, sie direkt an die GPIO-Pins des RPi anzuschließen;&lt;br /&gt;
&lt;br /&gt;
- Ergänzung um eine Sensorik, die in diesem Beispiel eine Rückmeldung liefert, ob ein Verbraucher aktiv ist oder nicht (Fahrzeug noch auf der Strecke?);&lt;br /&gt;
&lt;br /&gt;
- Einsatz anderer Sensortechniken und/oder mehrerer Sensoren zur Optimierung der Schnelligkeit oder parallelen Steuerung eines 2. Fahrzeuges;&lt;br /&gt;
&lt;br /&gt;
== Softwareseitige Ausbauvarianten ==&lt;br /&gt;
&lt;br /&gt;
- Optimierung des Scripts, indem die Sensor-Abfrage über einen &#039;Listener&#039; umgesetzt wird;&lt;br /&gt;
&lt;br /&gt;
- Erweiterung des Scripts um eine GUI mit Hilfe der python-lib Tkinter, um einen Nutzerzugriff auf das Steuerarray und/oder eine &#039;Verwaltung&#039; mehrerer Fahrzeuge;&lt;br /&gt;
&lt;br /&gt;
- Einbindung eines Web-Interface um eine &#039;Fernsteuerung&#039; zu ermöglichen...&lt;br /&gt;
&lt;br /&gt;
...in jedem Fall: viel Spaß beim Basteln!&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [http://hackaday.com/2013/01/23/replacement-controllers-for-slot-car-racing/ ähnliches Projekt bei &#039;hackaday&#039;] &lt;br /&gt;
* [https://docs.google.com/folder/d/0B-UAZ9CyJCLGQjJ3RDlqa2pqaDg/edit?pli=1&amp;amp;docId=0B-UAZ9CyJCLGNmpMeVpyYlZJUWc Relaisschaltung mit pädagogischer Erweiterung der Universität Manchester (englischspr.)]&lt;br /&gt;
* [http://elinux.org/RPi_Projects/PiFace_controlling_a_slot-car paralleler englischsp. Bericht des Autors zum RPi mit anderem Schwerpunkt] &lt;br /&gt;
* [http://elinux.org/RPi_Projects englischsp. Projektliste zum RPi]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Raspberry Pi]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Mknot9</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=RPi_als_D/A-Wandler&amp;diff=74143</id>
		<title>RPi als D/A-Wandler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=RPi_als_D/A-Wandler&amp;diff=74143"/>
		<updated>2013-03-07T21:27:30Z</updated>

		<summary type="html">&lt;p&gt;Mknot9: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von mknot9&#039;&#039; (M. Knoop)&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
Oft wird ein Computer &#039;nur&#039; genutzt um darauf Software ablaufen zu lassen. Dessen Möglichkeit zur Steuerung von elektrischen und mechanischen Geräten wird dabei leicht übersehen.&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel richtet sich daher an Einsteiger, die mit dem [[Raspberry Pi]] (&#039;RPi&#039;) Grundlagen der Computersteuerung mit Relais und [[Spannungsteiler]]n nachvollziehen möchten. Es wird schrittweise dargestellt, wie mittels eines D/A-Wandlers (Digital/Analog-Wandler = Umwandlung von digitalen 1/0 Signale) die Steuerung einer stufenweise veränderbaren Ausgangsspannung aufgebaut werden kann.&lt;br /&gt;
&lt;br /&gt;
= Verwendete Hardware =&lt;br /&gt;
&lt;br /&gt;
== RPi in Kombination mit der &#039;PiFace&#039;-Karte als Bastelplattform ==&lt;br /&gt;
&lt;br /&gt;
Dank der einfachen Bauweise bietet sich der RPi mit seinen frei zugänglichen GPIO-Pins als ideale Bastelplattform an. Trotzdem kann es beim anfänglichen Experimentieren mit Schaltungen öfters zu kleinen Fehlern kommen, die schlimmstenfalls die empfindliche Elektronik des RPi dauerhaft beschädigen können.&lt;br /&gt;
&lt;br /&gt;
Daher wird bei diesem Projekt zusätzlich mit der &#039;PiFace[http://elinux.org/RPi_Expansion_Boards#Piface]&#039;-Karte gearbeitet, die man auf die GPIO-Pins stecken kann. Diese Erweiterungskarte verschaltet die GPIO-Pins auf je 8 digitale Ein- und Ausgänge sowie 2 Relais, die eine galvanische Trennung von Stromkreisen ermöglichen. Damit besteht auch für Einsteiger ein gewisser Schutz für die Steuerelektronik des RPi.&lt;br /&gt;
&lt;br /&gt;
Auch im weiteren Verlauf dieser Einführung soll noch auf eine Trennung der Stromkreise Wert gelegt werden, so dass für erste digitale Schaltexperimente ein Optokoppler genutzt wird. Die spätere Nutzung der &#039;Input Pins&#039; des PiFace um eine Steuerung der D/A-Wandlung durch bestimmte Ereignisse zu ermöglichen, erfolgt ebenfalls passiv.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Auch wenn mit vermeindlich &#039;sicheren&#039; Transformatoren gebastelt wird, muss stets bedacht werden, dass diese an einem 230V-Stromnetz betrieben werden und man eher einmal mehr als weniger prüfen sollte, ob man durch eventuelle Fehler mit lebensgefährlicher Spannung in Berührung kommt!&lt;br /&gt;
&lt;br /&gt;
== Auswahl eines Beispielprojektes ==&lt;br /&gt;
&lt;br /&gt;
Günstige Möglichkeiten ein Gerät zu finden, das mit analogen Spannungen arbeitet, bieten sich u.a. im Spielzeugbereich. Im Grunde eignet sich alles, was mit Batterien oder mit Gleichspannungen unter 24 V betrieben wird.&lt;br /&gt;
&lt;br /&gt;
Da jedoch ein Ziel das Steuern von analogen Spannungen ist, bietet sich insbesondere alles an, bei dem [[Potentiometer]] eingesetzt werden. Einen dieser &#039;Handregler&#039; sollte man übrig haben, da er von seinem Anschlusskabel abgetrennt werden muss, um den oft proprietären Steckanschluss nutzen zu können. In diesem Sinne wird hier eine handelsübliche Spielzeug-Autorennbahn mit Potentiometer-Handreglern genutzt.&lt;br /&gt;
&lt;br /&gt;
== Sonstige Bauteile ==&lt;br /&gt;
&lt;br /&gt;
Für die ersten Grundlagen (s. Teile 2 &amp;amp; 3) genügen bereits rund 2 m isolierter Draht, der nicht aus verdrillten feinen Adern (Litze) bestehen sollte, 50 cm nicht-isolierter Draht, einige niederohmige Widerstände (z.B. je 2 mal 100 Ohm, 80, 60, sowie 20) und ein &#039;Experimentierbrett&#039; (engl. [[Breadboard]]).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Grundlagen und Vorbereitung des Projekts =&lt;br /&gt;
&lt;br /&gt;
== Umwandlung von 1/0 zu Ein/Aus mit einem Relais ==&lt;br /&gt;
&lt;br /&gt;
Vom Prinzip her ist jede Umwandlung eines digitalen 0 oder 1 Signals (das über eine bestimmte Spannungsdifferenz festgelegt ist) in eine (nutzbare) Spannung bereits eine D/A-Wandlung. Dies wird schlicht so realisiert, dass mit einer Eingabe am RPi die Nutzspannung des &#039;Verbrauchers&#039; zunächst einfach an- und ausgeschaltet wird.&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung der zu steuernden Hardware ==&lt;br /&gt;
&lt;br /&gt;
a. Um Fehlerquellen auszuschliessen sollte zunächst (und ggf. auch später!) kurz getestet werden, ob der vorhandene Regler wie erwartet funktioniert.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pif_Con9.jpg|thumb|right|400px|Fixierung der Reglerkabel]]&lt;br /&gt;
b. Nach dem Trennen des Reglers von der Einspeisung (und ggf. Ziehen des Netzsteckers) muss das Regler-Kabel abgeschnitten werden (eher nahe beim Regler, da das Kabel bald bis zum Breadboard reichen soll). Die neuen Enden des Einspeiseteils werden abisoliert und auf dem Breadboard diagonal zueinander mit einigen Spalten Abstand fixiert. Auch können bereits die Drähte, die später zum RPi führen, jeweils in den passenden kontaktführenden Spalten eingesteckt werden, z. B. wie rechts zu sehen (die nicht beschrifteten Drähte können vorerst ignoriert werden):&lt;br /&gt;
&lt;br /&gt;
c. Nun bietet sich eine gute Gelegenheit die maximale Spannung am Nutzgerät zu messen. Man verbindet das Regler-Kabel (nun ohne Regler) wieder mit der Einspeisung und die offenen Enden der Drähte mit dem Messgerät, bei dem zunächst ein Messbereich von ca. 10-50 Volt gewählt werden sollte. Dies sollte dann z.B. 14,8 V anzeigen. Natürlich können auch die beiden offenen Enden einen kleinen Moment kurz geschlossen werden, man sollte aber bedenken, dass das zu regelnde Nutzgerät dann die maximal vorgesehene Spannung erhält (hier: maximales Tempo).&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung des RPi ==&lt;br /&gt;
&lt;br /&gt;
Es wird davon ausgegangen, dass entsprechend des zugehörigen &#039;manual&#039; das PiFace bereits auf den RPi gesteckt ist, die nötigen python-Bilbliotheken installiert sind und man sich im Terminal-Arbeitsverzeichnis &#039;pi&#039; befindet.&lt;br /&gt;
&lt;br /&gt;
a. Zunächst wird der PiFace-Emulator (im Terminal direkt aus dem Arbeitsverzeichnis) gestartet: &amp;lt;tt&amp;gt;piface/scripts/piface-emulator&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b. Wenn alles richtig installiert wurde, erscheint ein Fenster (unten links), bei dem die vorerst wichtigen blauen Signale am rechten Rand wie folgt angezeigt werden sollten: &lt;br /&gt;
 &lt;br /&gt;
[[Datei:RPi_PiF_em-scs.jpg|400px|Piface-Emulator im default-Zustand]] [[Datei:RPi_PiF_em_scs1.jpg|400px|Piface-Relais 1 auf &#039;1&#039; geschaltet]]&lt;br /&gt;
&lt;br /&gt;
c. Das rechte Fenster ergibt sich, wenn man nun im Fenster auf &amp;quot;Override Enable&amp;quot; und dann &amp;quot;Output Pin 1&amp;quot; klickt. Es müsste ein &amp;quot;Klack&amp;quot; vom Relais 1 zu hören sein sowie der Schaltzustand des unteren Relais 1 (das an den Output Pin 1 gekoppelt ist) auf die Verbindung der beiden unteren Anschlüsse wechseln. Zugleich wird das erste LED-Icon beim Output Pin 1 rot sowie das zugehörige LED-Icon blau.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pif_rel2.png|thumb|right|250px|Schema der Piface-Relais]]&lt;br /&gt;
d. Rechts ist der Schaltzustand der Relais, die zu Beginn genutzt werden, im Grundzustand dargestellt (jeweils der mittlere und obere Kontakt sind kurzgeschlossen, der jeweils untere Kontakt ist frei):&lt;br /&gt;
&lt;br /&gt;
e. Ein weiterer Klick auf &amp;quot;Output Pin 1&amp;quot; versetzt das Relais in den Ausgangszustand, der vor dem nächsten Schritt wieder eingestellt werden sollte.&lt;br /&gt;
&lt;br /&gt;
f. Das Relais läßt sich auch mittel eines Python-Scripts vom RPi aus ansteuern. Dazu wird folgende Textdatei &amp;quot;wandler.py&amp;quot; im Arbeitsverzeichnis abgespeichert und mit dem Befehl &amp;quot;&amp;lt;tt&amp;gt;python wandler.py&amp;lt;/tt&amp;gt;&amp;quot; gestartet:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler.py&lt;br /&gt;
&lt;br /&gt;
 from time import sleep&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
&lt;br /&gt;
 pfio.init()&lt;br /&gt;
&lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
 print &amp;quot;Strom an&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 sleep(2)&lt;br /&gt;
&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Strom aus&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Nach dem Absetzen des Befehls wechselt nun das blaue Signal an Relais 1 für 2 Sekunden und das Relais klackt entsprechend.&lt;br /&gt;
&lt;br /&gt;
== Einsatz eines Relais&#039; zur Umsetzung von Spannungsänderungen ==&lt;br /&gt;
&lt;br /&gt;
a. Ist das Relais wieder im Ausgangszustand, befestigt man nun einen der vom Breadboard führenden Drähte am unteren und einen am mittleren Relaiseingang (im Moment ist die Polarität noch egal). Zunächst sollte nichts passieren (das Relais hält diesen ja Stromkreis noch offen).&lt;br /&gt;
&lt;br /&gt;
b. Startet man aber das Script wieder (&amp;lt;tt&amp;gt;python wandler.py&amp;lt;/tt&amp;gt;) oder klickt auf &#039;Output Pin 1&#039; wird der Nutzstromkreis geschlossen. Nochmals aufgepasst: unser Nutzer erhält wieder die maximal vorgesehene Spannung - also besser vorher im Script &amp;quot;&amp;lt;tt&amp;gt;sleep(0.3)&amp;lt;/tt&amp;gt;&amp;quot; setzen und speichern.&lt;br /&gt;
&lt;br /&gt;
c. Im Prinzip ist damit die programmgesteuerte Umsetzung eines 0/1 Signals in z.B. eine 0V/15V Spannung erreicht.&lt;br /&gt;
&lt;br /&gt;
d. Da wir bald verschiedene Steuerspannungen schalten wollen, geht es jetzt darum herauszufinden, bei welcher Spannung unser Nutzgerät gerade noch bewegt wird. Dies probiert man aus - mit dem kleinsten Widerstand beginnend: indem einer der Drähte in eine freie Breadboardspalte gesteckt wird und aus dieser Spalte der Widerstand zu dem &#039;alten&#039; Steckplatz des Drahtes geführt wird. Nun startet man jeweils das Script bis der Widerstand so hoch ist, dass die Anlaufspannung beim Nutzgerätes gut ausreicht, eine Reaktion des Nutzgerät (Fahrzeug bewegt sich) zu bewirken (z.B. bei 50 Ohm beträgt der Strom ca. 130 mA während ohne 190 mA fliessen).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Ansteuerung von 3 Schaltstufen =&lt;br /&gt;
&lt;br /&gt;
== Kombination von 2 Relais ==&lt;br /&gt;
&lt;br /&gt;
[[Bild:ZrelMww2.png|thumb|right|250px|Beschaltung der Relais]] a. Die einfachste Stufe der weiteren Verschaltung erreicht man, indem der Widerstand mit einem 2. Relais überbrückt wird. Relais 1 kann dann als &#039;Hauptschalter&#039;, Relais 2 als Spannungsumschalter genutzt werden:&lt;br /&gt;
&lt;br /&gt;
b. Diese Beschaltung kann sogleich mit dem PiFace-Emulator ausprobiert werden. Damit können wir bereits 3 Schaltstufen steuern: keine, verminderte und volle Spannung.&lt;br /&gt;
&lt;br /&gt;
c. Theoretisch liesse sich auch noch eine 4. Spannungsstufe erzeugen, da mit 2 &#039;Bits&#039; (Ein/Aus bei 2 Relais) bereits 4 verschiedene Signale darstellbar sind. Beim jetzigen Aufbau werden aber lediglich die (pin1,pin2)-Signale (0,0), (1,0) und (1,1) &#039;genutzt&#039;, da Relais 1 als Hauptschalter vorgesehen ist und die Kombination (0,1) so nicht ausgewertet wird.&lt;br /&gt;
&lt;br /&gt;
== Programmgesteuerte Schaltung von 2 Relais ==&lt;br /&gt;
&lt;br /&gt;
a. Mit einem veränderten python-Script &amp;quot;wandler2.py&amp;quot; ist auch die programmgesteuerte Schaltung möglich. Dabei werden zusätzlich die Tasten 1 und 2 des PiFace genutzt, um nach dem Start des Scripts (&amp;lt;tt&amp;gt;python wandler2.py&amp;lt;/tt&amp;gt;) den Hauptschalter (Relais 1) zu steuern:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler2.py&lt;br /&gt;
 &lt;br /&gt;
 from time import sleep&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
 pfio.init()&lt;br /&gt;
 &lt;br /&gt;
 taste_1=0&lt;br /&gt;
 taste_2=0&lt;br /&gt;
 intervall_a=0.1&lt;br /&gt;
 intervall_b=0.5&lt;br /&gt;
 # Die Intervalle bestimmen die Schaltzeit für volle/verminderte Spannung&lt;br /&gt;
 &lt;br /&gt;
 print &amp;quot;Zum Start Taste 1 drücken, zum Stoppen Taste 2&amp;quot;&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 while taste_1 == 0:&lt;br /&gt;
   sleep(intervall_a)&lt;br /&gt;
   taste_1=pfio.digital_read(1)&lt;br /&gt;
&lt;br /&gt;
 # Der o.g. &#039;sleep&#039;-Befehl bestimmt die Abfragepausen für Taste 1&lt;br /&gt;
 &lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
 print &amp;quot;Strom an!&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 while taste_2 == 0:&lt;br /&gt;
   pfio.digital_write(2,1)&lt;br /&gt;
   sleep(intervall_a)&lt;br /&gt;
   pfio.digital_write(2,0)&lt;br /&gt;
   sleep(intervall_b)&lt;br /&gt;
   taste_2=pfio.digital_read(2)&lt;br /&gt;
 &lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Strom aus!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
b. Falls beim Ausprobieren von Script-Änderungen mal was schief geht, kann das Script stets auch mit der Tastenkombination (CNTRL-C) gestoppt werden. U.U. muss dann noch zusätzlich Relais 1 und/oder 2 via Emulator zurückgesetzt werden.&lt;br /&gt;
&lt;br /&gt;
c. Beim Verändern des Scripts fällt bald auf, dass die bisherige Programmsteuerung keine direkte Möglichkeit vorsieht, auf Ereignisse zu reagieren. Immerhin wird ein mechanisches Gerät gesteuert, bei dem mit Ausfällen, Fertigungstoleranzen, Umwelteinflüssen etc. zu rechnen ist (im Script wird dies bislang &#039;nur&#039; durch die Abbruchbedingung &#039;Taste 2&#039; berücksichtigt).&lt;br /&gt;
&lt;br /&gt;
== Einfache Sensor-Signale als steuernde Elemente eines Programms ==&lt;br /&gt;
&lt;br /&gt;
a. Eine wichtige Anwendung von D/A-Steuerungen ist die mögliche Reaktion dieser Steuerung auf &#039;äußere&#039; Ereignisse, die z.B. mit Hilfe von Sensoren leistbar ist.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Einf_Sens.jpg|thumb|right|250px|einfacher Sensor]]b. Für unsere Zwecke genügt zunächst ein sehr einfacher Sensor, der ein 0- oder 1-Signal liefert und idealerweise direkt am &#039;Input Pin 1&#039; des PiFace angeschlossen werden kann. So liegt beim Input Pin 1 das Signal &#039;1&#039; an, wenn eine Verbindung zu &#039;Input GND&#039; besteht.&lt;br /&gt;
Z.B. können 2 unisolierte Drähte so plaziert werden, dass ein vorbeifahrendes Fahrzeug einen von ihnen genügend bewegt um den Kontakt kurze Zeit zu öffnen. Genau dann liefert dieser &#039;Sensor&#039; das Signal &#039;0&#039;. Eine - die Schwerkraft nutzende - mögliche Bauform ist rechts abgebildet ;-)&lt;br /&gt;
&lt;br /&gt;
c. Natürlich werden zusätzlich 2 isolierte Drähte benötigt, um jeden der beiden offenen Drähte geschützt mit Input Pin 1 und Input GND zu verbinden.&lt;br /&gt;
&lt;br /&gt;
d. Bei jeder Durchfahrt liefert der Sensor nun ein &#039;0&#039;-Signal, was im Script sowohl für eine Zeitmessung als auch für ein &#039;Schaltintervall-Array&#039; genutzt werden kann. Dort können abwechselnd für beide Spannungen Zeiten (die in etwa zum jeweiligen Streckenabschnitt passen) &#039;programmiert&#039; werden. Statt Taste 1 wird nun der Sensor ausgewertet (wobei Taste 1 als Sensor-Ersatz insoweit genutzt werden kann, dass sie gedrückt bleiben bzw. kurz losgelassen werden muss). Zur genaueren Zeitmessung wird noch das modul &#039;clock&#039; benötigt. &amp;quot;&amp;lt;tt&amp;gt;wandler3.py&amp;lt;/tt&amp;gt;&amp;quot; könnte also so aussehen:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler3.py&lt;br /&gt;
 &lt;br /&gt;
 from time import clock&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
 sensor_1=1&lt;br /&gt;
 sensor_2=0&lt;br /&gt;
 rundenzahl=0&lt;br /&gt;
 v_wechsel=0&lt;br /&gt;
 vorrunde=0&lt;br /&gt;
 index_zaehler=1&lt;br /&gt;
 &lt;br /&gt;
 zeit_array=[0,0.2,0.4,0.2,0.4,0.2,0.4,0.2,5,0.2,6]&lt;br /&gt;
 # dieses array enthält die sek. bis zum Spannungswechsel&lt;br /&gt;
&lt;br /&gt;
 array_laenge=9&lt;br /&gt;
 # legt fest, wie viel Werte des arrays genutzt werden sollen&lt;br /&gt;
 &lt;br /&gt;
 sensor_aus=1.3&lt;br /&gt;
 # bis der Sensor sicher in die Ruhestellung kippt, wird er nicht ausgelesen&lt;br /&gt;
  &lt;br /&gt;
 pfio.init()&lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
&lt;br /&gt;
 # das Fahrzeug wird langsam zum Start (=Sensor) bewegt&lt;br /&gt;
 while sensor_1 == 1 :&lt;br /&gt;
   sensor_1=pfio.digital_read(1)&lt;br /&gt;
  &lt;br /&gt;
 print &amp;quot;fliegender Start... zum Beenden Taste 2 drücken&amp;quot;&lt;br /&gt;
 print &amp;quot;Runde Nr., Ges.Zeit, Rundenzeit, mittlere Rundenzeit&amp;quot;&lt;br /&gt;
 start_zeit=clock()&lt;br /&gt;
 runden_start=start_zeit&lt;br /&gt;
  &lt;br /&gt;
 while sensor_2 == 0 :&lt;br /&gt;
   sensor_2=pfio.digital_read(2)&lt;br /&gt;
   v_wechsel=1-v_wechsel&lt;br /&gt;
   pfio.digital_write(2,v_wechsel)&lt;br /&gt;
   sensor_zeit=clock()&lt;br /&gt;
  &lt;br /&gt;
   while zeit_array[index_zaehler]+sensor_zeit &amp;gt; clock() :&lt;br /&gt;
     if runden_start+sensor_aus &amp;lt; clock() :&lt;br /&gt;
 &lt;br /&gt;
       sensor_1=pfio.digital_read(1) &lt;br /&gt;
       if sensor_1 == 0 :&lt;br /&gt;
         rundenzahl=rundenzahl+1&lt;br /&gt;
         runden_start=clock()&lt;br /&gt;
         zeit=runden_start-start_zeit&lt;br /&gt;
         print rundenzahl, zeit, zeit-vorrunde, zeit/rundenzahl&lt;br /&gt;
         vorrunde=zeit&lt;br /&gt;
         sensor_zeit=0&lt;br /&gt;
         index_zaehler=0&lt;br /&gt;
         v_wechsel=0&lt;br /&gt;
  &lt;br /&gt;
   index_zaehler=index_zaehler+1&lt;br /&gt;
   if index_zaehler &amp;gt; array_laenge :&lt;br /&gt;
     sensor_2=1&lt;br /&gt;
     print &amp;quot;array-Ende erreicht!&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Outp 1 &amp;amp; 2 auf 0!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wird das Array-Ende erreicht, wurden entweder zu wenige Einträge vorgesehen oder es befindet sich kein Fahrzeug (mehr) auf der Strecke, das den Sensor und damit des Zurücksetzen des Arrays auslösen konnte.&lt;br /&gt;
&lt;br /&gt;
e. Das Array ist an die jeweilige Strecke anzupassen, wobei der vorderste Eintrag ungenutzt bleibt und dann mit der Dauer für maximale Spannung begonnen wird. Solange man mit Relais arbeitet, sollten die Schaltzeiten nicht zu kurz sein (&amp;gt;0.1 sek), da diese eine gewisse mechanische Trägheit besitzen.&lt;br /&gt;
&lt;br /&gt;
f. Eben diese mechanische Beschaffenheit der Relais (Verschleiß) ist auch ein guter Grund, auf &#039;volle&#039; digitale Signalumwandlung umzustellen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Optokoppler als Ersatz für Relais =&lt;br /&gt;
&lt;br /&gt;
Ähnlich wie ein Relais dient ein [[Optokoppler]] dazu, eine Signalübertragung zwischen zwei getrennten Stromkreisen zu ermöglichen. Bei diesem Projekt liegt der Einsatz von Optokopplern nahe, da sie schneller schalten und keine beweglichen Teile besitzen. Für unsere Zwecke benötigen wir nun als zusätzliche Elemente: Optokoppler (CNY 17-4), npn-[[Transistor]]en (BC 337-40) zur Signalverstärkung sowie einige Widerstände im Bereich von 2k und 400 Ohm. &lt;br /&gt;
&lt;br /&gt;
== Kaskadierung von Transistoren zur Signalverstärkung ==&lt;br /&gt;
&lt;br /&gt;
a. Entsprechend Schritt 2.4.d. (ein Relais bei 50 Ohm) wird zunächst ein [[Optokoppler]] eingesetzt, dessen Signal durch einen Transistor verstärkt wird, um die &#039;Grundspannung&#039; zu schalten (Pin 3 und 6 beim Optokoppler sollten unbeschaltet bleiben, allein der &#039;Lichtstrom&#039; reicht für eine Ansteuerung aus):&lt;br /&gt;
&lt;br /&gt;
[[Bild:PiF_CNY_BC_1.png|400px|Optokoppler mit Transistor]]&lt;br /&gt;
&lt;br /&gt;
b. Da immer mit einer gewissen Toleranz bei allen Komponenten zu rechnen ist, kann es sein, dass u.U. die Widerstände etwas größer oder kleiner gewählt werden müssen. Beim Ausprobieren sollte man hier in 10% Schritten variieren.&lt;br /&gt;
&lt;br /&gt;
c. Bei Austesten mit Emulator oder Script ist auch zu beachten, dass nun &#039;Output Pin 8&#039; genutzt wird, da dieser nicht mit den Relais verschaltet ist.&lt;br /&gt;
&lt;br /&gt;
== Umsetzung von 3 Schaltstufen mit Optokopplern ==&lt;br /&gt;
&lt;br /&gt;
a. Entsprechend dem Vorgehen beim Relais kann nun auch der kleine Widerstand zusätzlich beschaltet werden um seine gesteuerte Überbrückung zu ermöglichen. Da hier eine relativ geringe Spannung aufgeschaltet wird, kann zu Beginn eine Diode eingesetzt werden, die die Schaltstufe &#039;maximale Spannung&#039; anzeigt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:SmPiFu2ou2T.png|400px|Kombination von 2 Optokopplern]]&lt;br /&gt;
&lt;br /&gt;
b. Vor dem Testen ist wieder zu beachten, dass nun zusätzlich &#039;Output Pin 7&#039; genutzt wird (statt Output Pin 2).&lt;br /&gt;
&lt;br /&gt;
c. Eine mögliche Realisierung sieht so aus: http://youtu.be/xQ7N-PrIULk&lt;br /&gt;
&lt;br /&gt;
== Zusätzliche Erhöhung der Schaltstufen bei D/A-Wandlern ==&lt;br /&gt;
&lt;br /&gt;
a. Zwar benötigen wir in unserem speziellen Beispiel eine &#039;Grundspannung&#039;, die sich dahingehend auswirkt, dass - wie unter 3.1.c. erwähnt - eine Signalkombination nicht ausgewertet wird, aber mit jeder weiteren Schaltstufe würde sich dieses Problem (theoretisch) relativieren, da bei geschickter Auswahl der Widerstände (z.B. im Verhältnis 1 zu 2) jeweils eine Verdoppelung der Kombinationsmöglichkeiten erreichbar ist.&lt;br /&gt;
&lt;br /&gt;
b. Wird hier der 50 Ohm Widerstand asymmetrisch geteilt (z.B. 15 + 35 Ohm, s.a. [[Spannungsteiler]]) um dort ein weiteres Signal umsetzen zu können, ergeben sich direkt folgende 5 Schaltstufen (aus, 50, 35, 15 und 0 Ohm) u.s.w.:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Sm3ou3t2.png|400px|Erhöhung der Schaltstufen]]&lt;br /&gt;
&lt;br /&gt;
c. Zur Ansteuerung dieser Schaltstufen wäre das Script so zu ändern, dass nun zwischen mehr als 2 Stufen gewechselt werden kann und im Array entsprechende Zusatzdaten vorgegeben und ausgelesen werden. Mehr als diese Stufen sind im konkreten Fall aber nicht sinnvoll, da die entstehende Verlustleistung in der Schaltung die maximal verfügbare Leistung reduziert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Weiterführende Ideen =&lt;br /&gt;
&lt;br /&gt;
Die Ausbaumöglichkeiten dieses Projektes sind vielfältig:&lt;br /&gt;
&lt;br /&gt;
== Hardwareseitige Ausbauvarianten ==&lt;br /&gt;
&lt;br /&gt;
- beispielhafte Umsetzung einer differenzierten Abstufung mittels einer logarithmischen Einteilung oder eines möglichst oft durch 2 teilbaren Anfangswertes und der Teiler (640 Ohm, 320, 160...);&lt;br /&gt;
&lt;br /&gt;
- Nachbau des Projekts mit einem Microcontroller (ggf. mit LCD-Anzeige);&lt;br /&gt;
&lt;br /&gt;
- Umbau der Steuerung mit dem Ziel, sie direkt an die GPIO-Pins des RPi anzuschließen;&lt;br /&gt;
&lt;br /&gt;
- Ergänzung um eine Sensorik, die in diesem Beispiel eine Rückmeldung liefert, ob ein Verbraucher aktiv ist oder nicht (Fahrzeug noch auf der Strecke?);&lt;br /&gt;
&lt;br /&gt;
- Einsatz anderer Sensortechniken und/oder mehrerer Sensoren zur Optimierung der Schnelligkeit oder parallelen Steuerung eines 2. Fahrzeuges;&lt;br /&gt;
&lt;br /&gt;
== Softwareseitige Ausbauvarianten ==&lt;br /&gt;
&lt;br /&gt;
- Optimierung des Scripts, indem die Sensor-Abfrage über einen &#039;Listener&#039; umgesetzt wird;&lt;br /&gt;
&lt;br /&gt;
- Erweiterung des Scripts um eine GUI mit Hilfe der python-lib Tkinter, um einen Nutzerzugriff auf das Steuerarray und/oder eine &#039;Verwaltung&#039; mehrerer Fahrzeuge;&lt;br /&gt;
&lt;br /&gt;
- Einbindung eines Web-Interface um eine &#039;Fernsteuerung&#039; zu ermöglichen...&lt;br /&gt;
&lt;br /&gt;
...in jedem Fall: viel Spass beim Basteln!&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [http://hackaday.com/2013/01/23/replacement-controllers-for-slot-car-racing/ ähnliches Projekt bei &#039;hackaday&#039;] &lt;br /&gt;
* [https://docs.google.com/folder/d/0B-UAZ9CyJCLGQjJ3RDlqa2pqaDg/edit?pli=1&amp;amp;docId=0B-UAZ9CyJCLGNmpMeVpyYlZJUWc Relaisschaltung mit pädagogischer Erweiterung der Universität Manchester (englischspr.)]&lt;br /&gt;
* [http://elinux.org/RPi_Projects/PiFace_controlling_a_slot-car paralleler englischsp. Bericht des Autors zum RPi mit anderem Schwerpunkt] &lt;br /&gt;
* [http://elinux.org/RPi_Projects englischsp. Projektliste zum RPi]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Raspberry Pi]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Mknot9</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=RPi_als_D/A-Wandler&amp;diff=74138</id>
		<title>RPi als D/A-Wandler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=RPi_als_D/A-Wandler&amp;diff=74138"/>
		<updated>2013-03-07T21:20:58Z</updated>

		<summary type="html">&lt;p&gt;Mknot9: /* Hardwareseitige Ausbauvarianten */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von mknot9&#039;&#039; (in Arbeit)&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
Oft wird ein Computer &#039;nur&#039; genutzt um darauf Software ablaufen zu lassen. Dessen Möglichkeit zur Steuerung von elektrischen und mechanischen Geräten wird dabei leicht übersehen.&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel richtet sich daher an Einsteiger, die mit dem [[Raspberry Pi]] (&#039;RPi&#039;) Grundlagen der Computersteuerung mit Relais und [[Spannungsteiler]]n nachvollziehen möchten. Es wird schrittweise dargestellt, wie mittels eines D/A-Wandlers (Digital/Analog-Wandler = Umwandlung von digitalen 1/0 Signale) die Steuerung einer stufenweise veränderbaren Ausgangsspannung aufgebaut werden kann.&lt;br /&gt;
&lt;br /&gt;
= Verwendete Hardware =&lt;br /&gt;
&lt;br /&gt;
== RPi in Kombination mit der &#039;PiFace&#039;-Karte als Bastelplattform ==&lt;br /&gt;
&lt;br /&gt;
Dank der einfachen Bauweise bietet sich der RPi mit seinen frei zugänglichen GPIO-Pins als ideale Bastelplattform an. Trotzdem kann es beim anfänglichen Experimentieren mit Schaltungen öfters zu kleinen Fehlern kommen, die schlimmstenfalls die empfindliche Elektronik des RPi dauerhaft beschädigen können.&lt;br /&gt;
&lt;br /&gt;
Daher wird bei diesem Projekt zusätzlich mit der &#039;PiFace[http://elinux.org/RPi_Expansion_Boards#Piface]&#039;-Karte gearbeitet, die man auf die GPIO-Pins stecken kann. Diese Erweiterungskarte verschaltet die GPIO-Pins auf je 8 digitale Ein- und Ausgänge sowie 2 Relais, die eine galvanische Trennung von Stromkreisen ermöglichen. Damit besteht auch für Einsteiger ein gewisser Schutz für die Steuerelektronik des RPi.&lt;br /&gt;
&lt;br /&gt;
Auch im weiteren Verlauf dieser Einführung soll noch auf eine Trennung der Stromkreise Wert gelegt werden, so dass für erste digitale Schaltexperimente ein Optokoppler genutzt wird. Die spätere Nutzung der &#039;Input Pins&#039; des PiFace um eine Steuerung der D/A-Wandlung durch bestimmte Ereignisse zu ermöglichen, erfolgt ebenfalls passiv.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Auch wenn mit vermeindlich &#039;sicheren&#039; Transformatoren gebastelt wird, muss stets bedacht werden, dass diese an einem 230V-Stromnetz betrieben werden und man eher einmal mehr als weniger prüfen sollte, ob man durch eventuelle Fehler mit lebensgefährlicher Spannung in Berührung kommt!&lt;br /&gt;
&lt;br /&gt;
== Auswahl eines Beispielprojektes ==&lt;br /&gt;
&lt;br /&gt;
Günstige Möglichkeiten ein Gerät zu finden, das mit analogen Spannungen arbeitet, bieten sich u.a. im Spielzeugbereich. Im Grunde eignet sich alles, was mit Batterien oder mit Gleichspannungen unter 24 V betrieben wird.&lt;br /&gt;
&lt;br /&gt;
Da jedoch ein Ziel das Steuern von analogen Spannungen ist, bietet sich insbesondere alles an, bei dem [[Potentiometer]] eingesetzt werden. Einen dieser &#039;Handregler&#039; sollte man übrig haben, da er von seinem Anschlusskabel abgetrennt werden muss, um den oft proprietären Steckanschluss nutzen zu können. In diesem Sinne wird hier eine handelsübliche Spielzeug-Autorennbahn mit Potentiometer-Handreglern genutzt.&lt;br /&gt;
&lt;br /&gt;
== Sonstige Bauteile ==&lt;br /&gt;
&lt;br /&gt;
Für die ersten Grundlagen (s. Teile 2 &amp;amp; 3) genügen bereits rund 2 m isolierter Draht, der nicht aus verdrillten feinen Adern (Litze) bestehen sollte, 50 cm nicht-isolierter Draht, einige niederohmige Widerstände (z.B. je 2 mal 100 Ohm, 80, 60, sowie 20) und ein &#039;Experimentierbrett&#039; (engl. [[Breadboard]]).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Grundlagen und Vorbereitung des Projekts =&lt;br /&gt;
&lt;br /&gt;
== Umwandlung von 1/0 zu Ein/Aus mit einem Relais ==&lt;br /&gt;
&lt;br /&gt;
Vom Prinzip her ist jede Umwandlung eines digitalen 0 oder 1 Signals (das über eine bestimmte Spannungsdifferenz festgelegt ist) in eine (nutzbare) Spannung bereits eine D/A-Wandlung. Dies wird schlicht so realisiert, dass mit einer Eingabe am RPi die Nutzspannung des &#039;Verbrauchers&#039; zunächst einfach an- und ausgeschaltet wird.&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung der zu steuernden Hardware ==&lt;br /&gt;
&lt;br /&gt;
a. Um Fehlerquellen auszuschliessen sollte zunächst (und ggf. auch später!) kurz getestet werden, ob der vorhandene Regler wie erwartet funktioniert.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pif_Con9.jpg|thumb|right|400px|Fixierung der Reglerkabel]]&lt;br /&gt;
b. Nach dem Trennen des Reglers von der Einspeisung (und ggf. Ziehen des Netzsteckers) muss das Regler-Kabel abgeschnitten werden (eher nahe beim Regler, da das Kabel bald bis zum Breadboard reichen soll). Die neuen Enden des Einspeiseteils werden abisoliert und auf dem Breadboard diagonal zueinander mit einigen Spalten Abstand fixiert. Auch können bereits die Drähte, die später zum RPi führen, jeweils in den passenden kontaktführenden Spalten eingesteckt werden, z. B. wie rechts zu sehen (die nicht beschrifteten Drähte können vorerst ignoriert werden):&lt;br /&gt;
&lt;br /&gt;
c. Nun bietet sich eine gute Gelegenheit die maximale Spannung am Nutzgerät zu messen. Man verbindet das Regler-Kabel (nun ohne Regler) wieder mit der Einspeisung und die offenen Enden der Drähte mit dem Messgerät, bei dem zunächst ein Messbereich von ca. 10-50 Volt gewählt werden sollte. Dies sollte dann z.B. 14,8 V anzeigen. Natürlich können auch die beiden offenen Enden einen kleinen Moment kurz geschlossen werden, man sollte aber bedenken, dass das zu regelnde Nutzgerät dann die maximal vorgesehene Spannung erhält (hier: maximales Tempo).&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung des RPi ==&lt;br /&gt;
&lt;br /&gt;
Es wird davon ausgegangen, dass entsprechend des zugehörigen &#039;manual&#039; das PiFace bereits auf den RPi gesteckt ist, die nötigen python-Bilbliotheken installiert sind und man sich im Terminal-Arbeitsverzeichnis &#039;pi&#039; befindet.&lt;br /&gt;
&lt;br /&gt;
a. Zunächst wird der PiFace-Emulator (im Terminal direkt aus dem Arbeitsverzeichnis) gestartet: &amp;lt;tt&amp;gt;piface/scripts/piface-emulator&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b. Wenn alles richtig installiert wurde, erscheint ein Fenster (unten links), bei dem die vorerst wichtigen blauen Signale am rechten Rand wie folgt angezeigt werden sollten: &lt;br /&gt;
 &lt;br /&gt;
[[Datei:RPi_PiF_em-scs.jpg|400px|Piface-Emulator im default-Zustand]] [[Datei:RPi_PiF_em_scs1.jpg|400px|Piface-Relais 1 auf &#039;1&#039; geschaltet]]&lt;br /&gt;
&lt;br /&gt;
c. Das rechte Fenster ergibt sich, wenn man nun im Fenster auf &amp;quot;Override Enable&amp;quot; und dann &amp;quot;Output Pin 1&amp;quot; klickt. Es müsste ein &amp;quot;Klack&amp;quot; vom Relais 1 zu hören sein sowie der Schaltzustand des unteren Relais 1 (das an den Output Pin 1 gekoppelt ist) auf die Verbindung der beiden unteren Anschlüsse wechseln. Zugleich wird das erste LED-Icon beim Output Pin 1 rot sowie das zugehörige LED-Icon blau.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pif_rel2.png|thumb|right|250px|Schema der Piface-Relais]]&lt;br /&gt;
d. Rechts ist der Schaltzustand der Relais, die zu Beginn genutzt werden, im Grundzustand dargestellt (jeweils der mittlere und obere Kontakt sind kurzgeschlossen, der jeweils untere Kontakt ist frei):&lt;br /&gt;
&lt;br /&gt;
e. Ein weiterer Klick auf &amp;quot;Output Pin 1&amp;quot; versetzt das Relais in den Ausgangszustand, der vor dem nächsten Schritt wieder eingestellt werden sollte.&lt;br /&gt;
&lt;br /&gt;
f. Das Relais läßt sich auch mittel eines Python-Scripts vom RPi aus ansteuern. Dazu wird folgende Textdatei &amp;quot;wandler.py&amp;quot; im Arbeitsverzeichnis abgespeichert und mit dem Befehl &amp;quot;&amp;lt;tt&amp;gt;python wandler.py&amp;lt;/tt&amp;gt;&amp;quot; gestartet:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler.py&lt;br /&gt;
&lt;br /&gt;
 from time import sleep&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
&lt;br /&gt;
 pfio.init()&lt;br /&gt;
&lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
 print &amp;quot;Strom an&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 sleep(2)&lt;br /&gt;
&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Strom aus&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Nach dem Absetzen des Befehls wechselt nun das blaue Signal an Relais 1 für 2 Sekunden und das Relais klackt entsprechend.&lt;br /&gt;
&lt;br /&gt;
== Einsatz eines Relais&#039; zur Umsetzung von Spannungsänderungen ==&lt;br /&gt;
&lt;br /&gt;
a. Ist das Relais wieder im Ausgangszustand, befestigt man nun einen der vom Breadboard führenden Drähte am unteren und einen am mittleren Relaiseingang (im Moment ist die Polarität noch egal). Zunächst sollte nichts passieren (das Relais hält diesen ja Stromkreis noch offen).&lt;br /&gt;
&lt;br /&gt;
b. Startet man aber das Script wieder (&amp;lt;tt&amp;gt;python wandler.py&amp;lt;/tt&amp;gt;) oder klickt auf &#039;Output Pin 1&#039; wird der Nutzstromkreis geschlossen. Nochmals aufgepasst: unser Nutzer erhält wieder die maximal vorgesehene Spannung - also besser vorher im Script &amp;quot;&amp;lt;tt&amp;gt;sleep(0.3)&amp;lt;/tt&amp;gt;&amp;quot; setzen und speichern.&lt;br /&gt;
&lt;br /&gt;
c. Im Prinzip ist damit die programmgesteuerte Umsetzung eines 0/1 Signals in z.B. eine 0V/15V Spannung erreicht.&lt;br /&gt;
&lt;br /&gt;
d. Da wir bald verschiedene Steuerspannungen schalten wollen, geht es jetzt darum herauszufinden, bei welcher Spannung unser Nutzgerät gerade noch bewegt wird. Dies probiert man aus - mit dem kleinsten Widerstand beginnend: indem einer der Drähte in eine freie Breadboardspalte gesteckt wird und aus dieser Spalte der Widerstand zu dem &#039;alten&#039; Steckplatz des Drahtes geführt wird. Nun startet man jeweils das Script bis der Widerstand so hoch ist, dass die Anlaufspannung beim Nutzgerätes gut ausreicht, eine Reaktion des Nutzgerät (Fahrzeug bewegt sich) zu bewirken (z.B. bei 50 Ohm beträgt der Strom ca. 130 mA während ohne 190 mA fliessen).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Ansteuerung von 3 Schaltstufen =&lt;br /&gt;
&lt;br /&gt;
== Kombination von 2 Relais ==&lt;br /&gt;
&lt;br /&gt;
[[Bild:ZrelMww2.png|thumb|right|250px|Beschaltung der Relais]] a. Die einfachste Stufe der weiteren Verschaltung erreicht man, indem der Widerstand mit einem 2. Relais überbrückt wird. Relais 1 kann dann als &#039;Hauptschalter&#039;, Relais 2 als Spannungsumschalter genutzt werden:&lt;br /&gt;
&lt;br /&gt;
b. Diese Beschaltung kann sogleich mit dem PiFace-Emulator ausprobiert werden. Damit können wir bereits 3 Schaltstufen steuern: keine, verminderte und volle Spannung.&lt;br /&gt;
&lt;br /&gt;
c. Theoretisch liesse sich auch noch eine 4. Spannungsstufe erzeugen, da mit 2 &#039;Bits&#039; (Ein/Aus bei 2 Relais) bereits 4 verschiedene Signale darstellbar sind. Beim jetzigen Aufbau werden aber lediglich die (pin1,pin2)-Signale (0,0), (1,0) und (1,1) &#039;genutzt&#039;, da Relais 1 als Hauptschalter vorgesehen ist und die Kombination (0,1) so nicht ausgewertet wird.&lt;br /&gt;
&lt;br /&gt;
== Programmgesteuerte Schaltung von 2 Relais ==&lt;br /&gt;
&lt;br /&gt;
a. Mit einem veränderten python-Script &amp;quot;wandler2.py&amp;quot; ist auch die programmgesteuerte Schaltung möglich. Dabei werden zusätzlich die Tasten 1 und 2 des PiFace genutzt, um nach dem Start des Scripts (&amp;lt;tt&amp;gt;python wandler2.py&amp;lt;/tt&amp;gt;) den Hauptschalter (Relais 1) zu steuern:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler2.py&lt;br /&gt;
 &lt;br /&gt;
 from time import sleep&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
 pfio.init()&lt;br /&gt;
 &lt;br /&gt;
 taste_1=0&lt;br /&gt;
 taste_2=0&lt;br /&gt;
 intervall_a=0.1&lt;br /&gt;
 intervall_b=0.5&lt;br /&gt;
 # Die Intervalle bestimmen die Schaltzeit für volle/verminderte Spannung&lt;br /&gt;
 &lt;br /&gt;
 print &amp;quot;Zum Start Taste 1 drücken, zum Stoppen Taste 2&amp;quot;&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 while taste_1 == 0:&lt;br /&gt;
   sleep(intervall_a)&lt;br /&gt;
   taste_1=pfio.digital_read(1)&lt;br /&gt;
&lt;br /&gt;
 # Der o.g. &#039;sleep&#039;-Befehl bestimmt die Abfragepausen für Taste 1&lt;br /&gt;
 &lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
 print &amp;quot;Strom an!&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 while taste_2 == 0:&lt;br /&gt;
   pfio.digital_write(2,1)&lt;br /&gt;
   sleep(intervall_a)&lt;br /&gt;
   pfio.digital_write(2,0)&lt;br /&gt;
   sleep(intervall_b)&lt;br /&gt;
   taste_2=pfio.digital_read(2)&lt;br /&gt;
 &lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Strom aus!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
b. Falls beim Ausprobieren von Script-Änderungen mal was schief geht, kann das Script stets auch mit der Tastenkombination (CNTRL-C) gestoppt werden. U.U. muss dann noch zusätzlich Relais 1 und/oder 2 via Emulator zurückgesetzt werden.&lt;br /&gt;
&lt;br /&gt;
c. Beim Verändern des Scripts fällt bald auf, dass die bisherige Programmsteuerung keine direkte Möglichkeit vorsieht, auf Ereignisse zu reagieren. Immerhin wird ein mechanisches Gerät gesteuert, bei dem mit Ausfällen, Fertigungstoleranzen, Umwelteinflüssen etc. zu rechnen ist (im Script wird dies bislang &#039;nur&#039; durch die Abbruchbedingung &#039;Taste 2&#039; berücksichtigt).&lt;br /&gt;
&lt;br /&gt;
== Einfache Sensor-Signale als steuernde Elemente eines Programms ==&lt;br /&gt;
&lt;br /&gt;
a. Eine wichtige Anwendung von D/A-Steuerungen ist die mögliche Reaktion dieser Steuerung auf &#039;äußere&#039; Ereignisse, die z.B. mit Hilfe von Sensoren leistbar ist.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Einf_Sens.jpg|thumb|right|250px|einfacher Sensor]]b. Für unsere Zwecke genügt zunächst ein sehr einfacher Sensor, der ein 0- oder 1-Signal liefert und idealerweise direkt am &#039;Input Pin 1&#039; des PiFace angeschlossen werden kann. So liegt beim Input Pin 1 das Signal &#039;1&#039; an, wenn eine Verbindung zu &#039;Input GND&#039; besteht.&lt;br /&gt;
Z.B. können 2 unisolierte Drähte so plaziert werden, dass ein vorbeifahrendes Fahrzeug einen von ihnen genügend bewegt um den Kontakt kurze Zeit zu öffnen. Genau dann liefert dieser &#039;Sensor&#039; das Signal &#039;0&#039;. Eine - die Schwerkraft nutzende - mögliche Bauform ist rechts abgebildet ;-)&lt;br /&gt;
&lt;br /&gt;
c. Natürlich werden zusätzlich 2 isolierte Drähte benötigt, um jeden der beiden offenen Drähte geschützt mit Input Pin 1 und Input GND zu verbinden.&lt;br /&gt;
&lt;br /&gt;
d. Bei jeder Durchfahrt liefert der Sensor nun ein &#039;0&#039;-Signal, was im Script sowohl für eine Zeitmessung als auch für ein &#039;Schaltintervall-Array&#039; genutzt werden kann. Dort können abwechselnd für beide Spannungen Zeiten (die in etwa zum jeweiligen Streckenabschnitt passen) &#039;programmiert&#039; werden. Statt Taste 1 wird nun der Sensor ausgewertet (wobei Taste 1 als Sensor-Ersatz insoweit genutzt werden kann, dass sie gedrückt bleiben bzw. kurz losgelassen werden muss). Zur genaueren Zeitmessung wird noch das modul &#039;clock&#039; benötigt. &amp;quot;&amp;lt;tt&amp;gt;wandler3.py&amp;lt;/tt&amp;gt;&amp;quot; könnte also so aussehen:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler3.py&lt;br /&gt;
 &lt;br /&gt;
 from time import clock&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
 sensor_1=1&lt;br /&gt;
 sensor_2=0&lt;br /&gt;
 rundenzahl=0&lt;br /&gt;
 v_wechsel=0&lt;br /&gt;
 vorrunde=0&lt;br /&gt;
 index_zaehler=1&lt;br /&gt;
 &lt;br /&gt;
 zeit_array=[0,0.2,0.4,0.2,0.4,0.2,0.4,0.2,5,0.2,6]&lt;br /&gt;
 # dieses array enthält die sek. bis zum Spannungswechsel&lt;br /&gt;
&lt;br /&gt;
 array_laenge=9&lt;br /&gt;
 # legt fest, wie viel Werte des arrays genutzt werden sollen&lt;br /&gt;
 &lt;br /&gt;
 sensor_aus=1.3&lt;br /&gt;
 # bis der Sensor sicher in die Ruhestellung kippt, wird er nicht ausgelesen&lt;br /&gt;
  &lt;br /&gt;
 pfio.init()&lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
&lt;br /&gt;
 # das Fahrzeug wird langsam zum Start (=Sensor) bewegt&lt;br /&gt;
 while sensor_1 == 1 :&lt;br /&gt;
   sensor_1=pfio.digital_read(1)&lt;br /&gt;
  &lt;br /&gt;
 print &amp;quot;fliegender Start... zum Beenden Taste 2 drücken&amp;quot;&lt;br /&gt;
 print &amp;quot;Runde Nr., Ges.Zeit, Rundenzeit, mittlere Rundenzeit&amp;quot;&lt;br /&gt;
 start_zeit=clock()&lt;br /&gt;
 runden_start=start_zeit&lt;br /&gt;
  &lt;br /&gt;
 while sensor_2 == 0 :&lt;br /&gt;
   sensor_2=pfio.digital_read(2)&lt;br /&gt;
   v_wechsel=1-v_wechsel&lt;br /&gt;
   pfio.digital_write(2,v_wechsel)&lt;br /&gt;
   sensor_zeit=clock()&lt;br /&gt;
  &lt;br /&gt;
   while zeit_array[index_zaehler]+sensor_zeit &amp;gt; clock() :&lt;br /&gt;
     if runden_start+sensor_aus &amp;lt; clock() :&lt;br /&gt;
 &lt;br /&gt;
       sensor_1=pfio.digital_read(1) &lt;br /&gt;
       if sensor_1 == 0 :&lt;br /&gt;
         rundenzahl=rundenzahl+1&lt;br /&gt;
         runden_start=clock()&lt;br /&gt;
         zeit=runden_start-start_zeit&lt;br /&gt;
         print rundenzahl, zeit, zeit-vorrunde, zeit/rundenzahl&lt;br /&gt;
         vorrunde=zeit&lt;br /&gt;
         sensor_zeit=0&lt;br /&gt;
         index_zaehler=0&lt;br /&gt;
         v_wechsel=0&lt;br /&gt;
  &lt;br /&gt;
   index_zaehler=index_zaehler+1&lt;br /&gt;
   if index_zaehler &amp;gt; array_laenge :&lt;br /&gt;
     sensor_2=1&lt;br /&gt;
     print &amp;quot;array-Ende erreicht!&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Outp 1 &amp;amp; 2 auf 0!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wird das Array-Ende erreicht, wurden entweder zu wenige Einträge vorgesehen oder es befindet sich kein Fahrzeug (mehr) auf der Strecke, das den Sensor und damit des Zurücksetzen des Arrays auslösen konnte.&lt;br /&gt;
&lt;br /&gt;
e. Das Array ist an die jeweilige Strecke anzupassen, wobei der vorderste Eintrag ungenutzt bleibt und dann mit der Dauer für maximale Spannung begonnen wird. Solange man mit Relais arbeitet, sollten die Schaltzeiten nicht zu kurz sein (&amp;gt;0.1 sek), da diese eine gewisse mechanische Trägheit besitzen.&lt;br /&gt;
&lt;br /&gt;
f. Eben diese mechanische Beschaffenheit der Relais (Verschleiß) ist auch ein guter Grund, auf &#039;volle&#039; digitale Signalumwandlung umzustellen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Optokoppler als Ersatz für Relais =&lt;br /&gt;
&lt;br /&gt;
Ähnlich wie ein Relais dient ein [[Optokoppler]] dazu, eine Signalübertragung zwischen zwei getrennten Stromkreisen zu ermöglichen. Bei diesem Projekt liegt der Einsatz von Optokopplern nahe, da sie schneller schalten und keine beweglichen Teile besitzen. Für unsere Zwecke benötigen wir nun als zusätzliche Elemente: Optokoppler (CNY 17-4), npn-[[Transistor]]en (BC 337-40) zur Signalverstärkung sowie einige Widerstände im Bereich von 2k und 400 Ohm. &lt;br /&gt;
&lt;br /&gt;
== Kaskadierung von Transistoren zur Signalverstärkung ==&lt;br /&gt;
&lt;br /&gt;
a. Entsprechend Schritt 2.4.d. (ein Relais bei 50 Ohm) wird zunächst ein [[Optokoppler]] eingesetzt, dessen Signal durch einen Transistor verstärkt wird, um die &#039;Grundspannung&#039; zu schalten (Pin 3 und 6 beim Optokoppler sollten unbeschaltet bleiben, allein der &#039;Lichtstrom&#039; reicht für eine Ansteuerung aus):&lt;br /&gt;
&lt;br /&gt;
[[Bild:PiF_CNY_BC_1.png|400px|Optokoppler mit Transistor]]&lt;br /&gt;
&lt;br /&gt;
b. Da immer mit einer gewissen Toleranz bei allen Komponenten zu rechnen ist, kann es sein, dass u.U. die Widerstände etwas größer oder kleiner gewählt werden müssen. Beim Ausprobieren sollte man hier in 10% Schritten variieren.&lt;br /&gt;
&lt;br /&gt;
c. Bei Austesten mit Emulator oder Script ist auch zu beachten, dass nun &#039;Output Pin 8&#039; genutzt wird, da dieser nicht mit den Relais verschaltet ist.&lt;br /&gt;
&lt;br /&gt;
== Umsetzung von 3 Schaltstufen mit Optokopplern ==&lt;br /&gt;
&lt;br /&gt;
a. Entsprechend dem Vorgehen beim Relais kann nun auch der kleine Widerstand zusätzlich beschaltet werden um seine gesteuerte Überbrückung zu ermöglichen. Da hier eine relativ geringe Spannung aufgeschaltet wird, kann zu Beginn eine Diode eingesetzt werden, die die Schaltstufe &#039;maximale Spannung&#039; anzeigt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:SmPiFu2ou2T.png|400px|Kombination von 2 Optokopplern]]&lt;br /&gt;
&lt;br /&gt;
b. Vor dem Testen ist wieder zu beachten, dass nun zusätzlich &#039;Output Pin 7&#039; genutzt wird (statt Output Pin 2).&lt;br /&gt;
&lt;br /&gt;
c. Eine mögliche Realisierung sieht so aus:[http://youtu.be/xQ7N-PrIULk].&lt;br /&gt;
&lt;br /&gt;
== Zusätzliche Erhöhung der Schaltstufen bei D/A-Wandlern ==&lt;br /&gt;
&lt;br /&gt;
a. Zwar benötigen wir in unserem speziellen Beispiel eine &#039;Grundspannung&#039;, die sich dahingehend auswirkt, dass - wie unter 3.1.c. erwähnt - eine Signalkombination nicht ausgewertet wird, aber mit jeder weiteren Schaltstufe würde sich dieses Problem (theoretisch) relativieren, da bei geschickter Auswahl der Widerstände (z.B. im Verhältnis 1 zu 2) jeweils eine Verdoppelung der Kombinationsmöglichkeiten erreichbar ist.&lt;br /&gt;
&lt;br /&gt;
b. Wird hier der 50 Ohm Widerstand asymmetrisch geteilt (z.B. 15 + 35 Ohm, s.a. [[Spannungsteiler]]) um dort ein weiteres Signal umsetzen zu können, ergeben sich direkt folgende 5 Schaltstufen (aus, 50, 35, 15 und 0 Ohm) u.s.w.:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Sm3ou3t2.png|400px|Erhöhung der Schaltstufen]]&lt;br /&gt;
&lt;br /&gt;
c. Zur Ansteuerung dieser Schaltstufen wäre das Script so zu ändern, dass nun zwischen mehr als 2 Stufen gewechselt werden kann und im Array entsprechende Zusatzdaten vorgegeben und ausgelesen werden. Mehr als diese Stufen sind im konkreten Fall aber nicht sinnvoll, da die entstehende Verlustleistung in der Schaltung die maximal verfügbare Leistung reduziert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Weiterführende Ideen =&lt;br /&gt;
&lt;br /&gt;
Die Ausbaumöglichkeiten dieses Projektes sind vielfältig:&lt;br /&gt;
&lt;br /&gt;
== Hardwareseitige Ausbauvarianten ==&lt;br /&gt;
&lt;br /&gt;
- beispielhafte Umsetzung einer differenzierten Abstufung mittels einer logarithmischen Einteilung oder eines möglichst oft durch 2 teilbaren Anfangswertes und der Teiler (640 Ohm, 320, 160...);&lt;br /&gt;
&lt;br /&gt;
- Nachbau des Projekts mit einem Microcontroller (ggf. mit LCD-Anzeige);&lt;br /&gt;
&lt;br /&gt;
- Umbau der Steuerung mit dem Ziel, sie direkt an die GPIO-Pins des RPi anzuschließen;&lt;br /&gt;
&lt;br /&gt;
- Ergänzung um eine Sensorik, die in diesem Beispiel eine Rückmeldung liefert, ob ein Verbraucher aktiv ist oder nicht (Fahrzeug noch auf der Strecke?);&lt;br /&gt;
&lt;br /&gt;
- Einsatz anderer Sensortechniken und/oder mehrerer Sensoren zur Optimierung der Schnelligkeit oder parallelen Steuerung eines 2. Fahrzeuges;&lt;br /&gt;
&lt;br /&gt;
== Softwareseitige Ausbauvarianten ==&lt;br /&gt;
&lt;br /&gt;
- Optimierung des Scripts, indem die Sensor-Abfrage über einen &#039;Listener&#039; umgesetzt wird;&lt;br /&gt;
&lt;br /&gt;
- Erweiterung des Scripts um eine GUI mit Hilfe der python-lib Tkinter, um einen Nutzerzugriff auf das Steuerarray und/oder eine &#039;Verwaltung&#039; mehrerer Fahrzeuge;&lt;br /&gt;
&lt;br /&gt;
- Einbindung eines Web-Interface um eine &#039;Fernsteuerung&#039; zu ermöglichen...&lt;br /&gt;
&lt;br /&gt;
...in jedem Fall: viel Spass beim Basteln!&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [http://hackaday.com/2013/01/23/replacement-controllers-for-slot-car-racing/ ähnliches Projekt bei &#039;hackaday&#039;] &lt;br /&gt;
* [https://docs.google.com/folder/d/0B-UAZ9CyJCLGQjJ3RDlqa2pqaDg/edit?pli=1&amp;amp;docId=0B-UAZ9CyJCLGNmpMeVpyYlZJUWc Relaisschaltung mit pädagogischer Erweiterung der Universität Manchester (englischspr.)]&lt;br /&gt;
* [http://elinux.org/RPi_Projects/PiFace_controlling_a_slot-car paralleler englischsp. Bericht des Autors zum RPi mit anderem Schwerpunkt] &lt;br /&gt;
* [http://elinux.org/RPi_Projects englischsp. Projektliste zum RPi]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Raspberry Pi]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Mknot9</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=RPi_als_D/A-Wandler&amp;diff=74137</id>
		<title>RPi als D/A-Wandler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=RPi_als_D/A-Wandler&amp;diff=74137"/>
		<updated>2013-03-07T21:17:07Z</updated>

		<summary type="html">&lt;p&gt;Mknot9: /* Siehe auch */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von mknot9&#039;&#039; (in Arbeit)&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
Oft wird ein Computer &#039;nur&#039; genutzt um darauf Software ablaufen zu lassen. Dessen Möglichkeit zur Steuerung von elektrischen und mechanischen Geräten wird dabei leicht übersehen.&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel richtet sich daher an Einsteiger, die mit dem [[Raspberry Pi]] (&#039;RPi&#039;) Grundlagen der Computersteuerung mit Relais und [[Spannungsteiler]]n nachvollziehen möchten. Es wird schrittweise dargestellt, wie mittels eines D/A-Wandlers (Digital/Analog-Wandler = Umwandlung von digitalen 1/0 Signale) die Steuerung einer stufenweise veränderbaren Ausgangsspannung aufgebaut werden kann.&lt;br /&gt;
&lt;br /&gt;
= Verwendete Hardware =&lt;br /&gt;
&lt;br /&gt;
== RPi in Kombination mit der &#039;PiFace&#039;-Karte als Bastelplattform ==&lt;br /&gt;
&lt;br /&gt;
Dank der einfachen Bauweise bietet sich der RPi mit seinen frei zugänglichen GPIO-Pins als ideale Bastelplattform an. Trotzdem kann es beim anfänglichen Experimentieren mit Schaltungen öfters zu kleinen Fehlern kommen, die schlimmstenfalls die empfindliche Elektronik des RPi dauerhaft beschädigen können.&lt;br /&gt;
&lt;br /&gt;
Daher wird bei diesem Projekt zusätzlich mit der &#039;PiFace[http://elinux.org/RPi_Expansion_Boards#Piface]&#039;-Karte gearbeitet, die man auf die GPIO-Pins stecken kann. Diese Erweiterungskarte verschaltet die GPIO-Pins auf je 8 digitale Ein- und Ausgänge sowie 2 Relais, die eine galvanische Trennung von Stromkreisen ermöglichen. Damit besteht auch für Einsteiger ein gewisser Schutz für die Steuerelektronik des RPi.&lt;br /&gt;
&lt;br /&gt;
Auch im weiteren Verlauf dieser Einführung soll noch auf eine Trennung der Stromkreise Wert gelegt werden, so dass für erste digitale Schaltexperimente ein Optokoppler genutzt wird. Die spätere Nutzung der &#039;Input Pins&#039; des PiFace um eine Steuerung der D/A-Wandlung durch bestimmte Ereignisse zu ermöglichen, erfolgt ebenfalls passiv.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Auch wenn mit vermeindlich &#039;sicheren&#039; Transformatoren gebastelt wird, muss stets bedacht werden, dass diese an einem 230V-Stromnetz betrieben werden und man eher einmal mehr als weniger prüfen sollte, ob man durch eventuelle Fehler mit lebensgefährlicher Spannung in Berührung kommt!&lt;br /&gt;
&lt;br /&gt;
== Auswahl eines Beispielprojektes ==&lt;br /&gt;
&lt;br /&gt;
Günstige Möglichkeiten ein Gerät zu finden, das mit analogen Spannungen arbeitet, bieten sich u.a. im Spielzeugbereich. Im Grunde eignet sich alles, was mit Batterien oder mit Gleichspannungen unter 24 V betrieben wird.&lt;br /&gt;
&lt;br /&gt;
Da jedoch ein Ziel das Steuern von analogen Spannungen ist, bietet sich insbesondere alles an, bei dem [[Potentiometer]] eingesetzt werden. Einen dieser &#039;Handregler&#039; sollte man übrig haben, da er von seinem Anschlusskabel abgetrennt werden muss, um den oft proprietären Steckanschluss nutzen zu können. In diesem Sinne wird hier eine handelsübliche Spielzeug-Autorennbahn mit Potentiometer-Handreglern genutzt.&lt;br /&gt;
&lt;br /&gt;
== Sonstige Bauteile ==&lt;br /&gt;
&lt;br /&gt;
Für die ersten Grundlagen (s. Teile 2 &amp;amp; 3) genügen bereits rund 2 m isolierter Draht, der nicht aus verdrillten feinen Adern (Litze) bestehen sollte, 50 cm nicht-isolierter Draht, einige niederohmige Widerstände (z.B. je 2 mal 100 Ohm, 80, 60, sowie 20) und ein &#039;Experimentierbrett&#039; (engl. [[Breadboard]]).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Grundlagen und Vorbereitung des Projekts =&lt;br /&gt;
&lt;br /&gt;
== Umwandlung von 1/0 zu Ein/Aus mit einem Relais ==&lt;br /&gt;
&lt;br /&gt;
Vom Prinzip her ist jede Umwandlung eines digitalen 0 oder 1 Signals (das über eine bestimmte Spannungsdifferenz festgelegt ist) in eine (nutzbare) Spannung bereits eine D/A-Wandlung. Dies wird schlicht so realisiert, dass mit einer Eingabe am RPi die Nutzspannung des &#039;Verbrauchers&#039; zunächst einfach an- und ausgeschaltet wird.&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung der zu steuernden Hardware ==&lt;br /&gt;
&lt;br /&gt;
a. Um Fehlerquellen auszuschliessen sollte zunächst (und ggf. auch später!) kurz getestet werden, ob der vorhandene Regler wie erwartet funktioniert.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pif_Con9.jpg|thumb|right|400px|Fixierung der Reglerkabel]]&lt;br /&gt;
b. Nach dem Trennen des Reglers von der Einspeisung (und ggf. Ziehen des Netzsteckers) muss das Regler-Kabel abgeschnitten werden (eher nahe beim Regler, da das Kabel bald bis zum Breadboard reichen soll). Die neuen Enden des Einspeiseteils werden abisoliert und auf dem Breadboard diagonal zueinander mit einigen Spalten Abstand fixiert. Auch können bereits die Drähte, die später zum RPi führen, jeweils in den passenden kontaktführenden Spalten eingesteckt werden, z. B. wie rechts zu sehen (die nicht beschrifteten Drähte können vorerst ignoriert werden):&lt;br /&gt;
&lt;br /&gt;
c. Nun bietet sich eine gute Gelegenheit die maximale Spannung am Nutzgerät zu messen. Man verbindet das Regler-Kabel (nun ohne Regler) wieder mit der Einspeisung und die offenen Enden der Drähte mit dem Messgerät, bei dem zunächst ein Messbereich von ca. 10-50 Volt gewählt werden sollte. Dies sollte dann z.B. 14,8 V anzeigen. Natürlich können auch die beiden offenen Enden einen kleinen Moment kurz geschlossen werden, man sollte aber bedenken, dass das zu regelnde Nutzgerät dann die maximal vorgesehene Spannung erhält (hier: maximales Tempo).&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung des RPi ==&lt;br /&gt;
&lt;br /&gt;
Es wird davon ausgegangen, dass entsprechend des zugehörigen &#039;manual&#039; das PiFace bereits auf den RPi gesteckt ist, die nötigen python-Bilbliotheken installiert sind und man sich im Terminal-Arbeitsverzeichnis &#039;pi&#039; befindet.&lt;br /&gt;
&lt;br /&gt;
a. Zunächst wird der PiFace-Emulator (im Terminal direkt aus dem Arbeitsverzeichnis) gestartet: &amp;lt;tt&amp;gt;piface/scripts/piface-emulator&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b. Wenn alles richtig installiert wurde, erscheint ein Fenster (unten links), bei dem die vorerst wichtigen blauen Signale am rechten Rand wie folgt angezeigt werden sollten: &lt;br /&gt;
 &lt;br /&gt;
[[Datei:RPi_PiF_em-scs.jpg|400px|Piface-Emulator im default-Zustand]] [[Datei:RPi_PiF_em_scs1.jpg|400px|Piface-Relais 1 auf &#039;1&#039; geschaltet]]&lt;br /&gt;
&lt;br /&gt;
c. Das rechte Fenster ergibt sich, wenn man nun im Fenster auf &amp;quot;Override Enable&amp;quot; und dann &amp;quot;Output Pin 1&amp;quot; klickt. Es müsste ein &amp;quot;Klack&amp;quot; vom Relais 1 zu hören sein sowie der Schaltzustand des unteren Relais 1 (das an den Output Pin 1 gekoppelt ist) auf die Verbindung der beiden unteren Anschlüsse wechseln. Zugleich wird das erste LED-Icon beim Output Pin 1 rot sowie das zugehörige LED-Icon blau.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pif_rel2.png|thumb|right|250px|Schema der Piface-Relais]]&lt;br /&gt;
d. Rechts ist der Schaltzustand der Relais, die zu Beginn genutzt werden, im Grundzustand dargestellt (jeweils der mittlere und obere Kontakt sind kurzgeschlossen, der jeweils untere Kontakt ist frei):&lt;br /&gt;
&lt;br /&gt;
e. Ein weiterer Klick auf &amp;quot;Output Pin 1&amp;quot; versetzt das Relais in den Ausgangszustand, der vor dem nächsten Schritt wieder eingestellt werden sollte.&lt;br /&gt;
&lt;br /&gt;
f. Das Relais läßt sich auch mittel eines Python-Scripts vom RPi aus ansteuern. Dazu wird folgende Textdatei &amp;quot;wandler.py&amp;quot; im Arbeitsverzeichnis abgespeichert und mit dem Befehl &amp;quot;&amp;lt;tt&amp;gt;python wandler.py&amp;lt;/tt&amp;gt;&amp;quot; gestartet:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler.py&lt;br /&gt;
&lt;br /&gt;
 from time import sleep&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
&lt;br /&gt;
 pfio.init()&lt;br /&gt;
&lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
 print &amp;quot;Strom an&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 sleep(2)&lt;br /&gt;
&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Strom aus&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Nach dem Absetzen des Befehls wechselt nun das blaue Signal an Relais 1 für 2 Sekunden und das Relais klackt entsprechend.&lt;br /&gt;
&lt;br /&gt;
== Einsatz eines Relais&#039; zur Umsetzung von Spannungsänderungen ==&lt;br /&gt;
&lt;br /&gt;
a. Ist das Relais wieder im Ausgangszustand, befestigt man nun einen der vom Breadboard führenden Drähte am unteren und einen am mittleren Relaiseingang (im Moment ist die Polarität noch egal). Zunächst sollte nichts passieren (das Relais hält diesen ja Stromkreis noch offen).&lt;br /&gt;
&lt;br /&gt;
b. Startet man aber das Script wieder (&amp;lt;tt&amp;gt;python wandler.py&amp;lt;/tt&amp;gt;) oder klickt auf &#039;Output Pin 1&#039; wird der Nutzstromkreis geschlossen. Nochmals aufgepasst: unser Nutzer erhält wieder die maximal vorgesehene Spannung - also besser vorher im Script &amp;quot;&amp;lt;tt&amp;gt;sleep(0.3)&amp;lt;/tt&amp;gt;&amp;quot; setzen und speichern.&lt;br /&gt;
&lt;br /&gt;
c. Im Prinzip ist damit die programmgesteuerte Umsetzung eines 0/1 Signals in z.B. eine 0V/15V Spannung erreicht.&lt;br /&gt;
&lt;br /&gt;
d. Da wir bald verschiedene Steuerspannungen schalten wollen, geht es jetzt darum herauszufinden, bei welcher Spannung unser Nutzgerät gerade noch bewegt wird. Dies probiert man aus - mit dem kleinsten Widerstand beginnend: indem einer der Drähte in eine freie Breadboardspalte gesteckt wird und aus dieser Spalte der Widerstand zu dem &#039;alten&#039; Steckplatz des Drahtes geführt wird. Nun startet man jeweils das Script bis der Widerstand so hoch ist, dass die Anlaufspannung beim Nutzgerätes gut ausreicht, eine Reaktion des Nutzgerät (Fahrzeug bewegt sich) zu bewirken (z.B. bei 50 Ohm beträgt der Strom ca. 130 mA während ohne 190 mA fliessen).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Ansteuerung von 3 Schaltstufen =&lt;br /&gt;
&lt;br /&gt;
== Kombination von 2 Relais ==&lt;br /&gt;
&lt;br /&gt;
[[Bild:ZrelMww2.png|thumb|right|250px|Beschaltung der Relais]] a. Die einfachste Stufe der weiteren Verschaltung erreicht man, indem der Widerstand mit einem 2. Relais überbrückt wird. Relais 1 kann dann als &#039;Hauptschalter&#039;, Relais 2 als Spannungsumschalter genutzt werden:&lt;br /&gt;
&lt;br /&gt;
b. Diese Beschaltung kann sogleich mit dem PiFace-Emulator ausprobiert werden. Damit können wir bereits 3 Schaltstufen steuern: keine, verminderte und volle Spannung.&lt;br /&gt;
&lt;br /&gt;
c. Theoretisch liesse sich auch noch eine 4. Spannungsstufe erzeugen, da mit 2 &#039;Bits&#039; (Ein/Aus bei 2 Relais) bereits 4 verschiedene Signale darstellbar sind. Beim jetzigen Aufbau werden aber lediglich die (pin1,pin2)-Signale (0,0), (1,0) und (1,1) &#039;genutzt&#039;, da Relais 1 als Hauptschalter vorgesehen ist und die Kombination (0,1) so nicht ausgewertet wird.&lt;br /&gt;
&lt;br /&gt;
== Programmgesteuerte Schaltung von 2 Relais ==&lt;br /&gt;
&lt;br /&gt;
a. Mit einem veränderten python-Script &amp;quot;wandler2.py&amp;quot; ist auch die programmgesteuerte Schaltung möglich. Dabei werden zusätzlich die Tasten 1 und 2 des PiFace genutzt, um nach dem Start des Scripts (&amp;lt;tt&amp;gt;python wandler2.py&amp;lt;/tt&amp;gt;) den Hauptschalter (Relais 1) zu steuern:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler2.py&lt;br /&gt;
 &lt;br /&gt;
 from time import sleep&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
 pfio.init()&lt;br /&gt;
 &lt;br /&gt;
 taste_1=0&lt;br /&gt;
 taste_2=0&lt;br /&gt;
 intervall_a=0.1&lt;br /&gt;
 intervall_b=0.5&lt;br /&gt;
 # Die Intervalle bestimmen die Schaltzeit für volle/verminderte Spannung&lt;br /&gt;
 &lt;br /&gt;
 print &amp;quot;Zum Start Taste 1 drücken, zum Stoppen Taste 2&amp;quot;&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 while taste_1 == 0:&lt;br /&gt;
   sleep(intervall_a)&lt;br /&gt;
   taste_1=pfio.digital_read(1)&lt;br /&gt;
&lt;br /&gt;
 # Der o.g. &#039;sleep&#039;-Befehl bestimmt die Abfragepausen für Taste 1&lt;br /&gt;
 &lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
 print &amp;quot;Strom an!&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 while taste_2 == 0:&lt;br /&gt;
   pfio.digital_write(2,1)&lt;br /&gt;
   sleep(intervall_a)&lt;br /&gt;
   pfio.digital_write(2,0)&lt;br /&gt;
   sleep(intervall_b)&lt;br /&gt;
   taste_2=pfio.digital_read(2)&lt;br /&gt;
 &lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Strom aus!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
b. Falls beim Ausprobieren von Script-Änderungen mal was schief geht, kann das Script stets auch mit der Tastenkombination (CNTRL-C) gestoppt werden. U.U. muss dann noch zusätzlich Relais 1 und/oder 2 via Emulator zurückgesetzt werden.&lt;br /&gt;
&lt;br /&gt;
c. Beim Verändern des Scripts fällt bald auf, dass die bisherige Programmsteuerung keine direkte Möglichkeit vorsieht, auf Ereignisse zu reagieren. Immerhin wird ein mechanisches Gerät gesteuert, bei dem mit Ausfällen, Fertigungstoleranzen, Umwelteinflüssen etc. zu rechnen ist (im Script wird dies bislang &#039;nur&#039; durch die Abbruchbedingung &#039;Taste 2&#039; berücksichtigt).&lt;br /&gt;
&lt;br /&gt;
== Einfache Sensor-Signale als steuernde Elemente eines Programms ==&lt;br /&gt;
&lt;br /&gt;
a. Eine wichtige Anwendung von D/A-Steuerungen ist die mögliche Reaktion dieser Steuerung auf &#039;äußere&#039; Ereignisse, die z.B. mit Hilfe von Sensoren leistbar ist.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Einf_Sens.jpg|thumb|right|250px|einfacher Sensor]]b. Für unsere Zwecke genügt zunächst ein sehr einfacher Sensor, der ein 0- oder 1-Signal liefert und idealerweise direkt am &#039;Input Pin 1&#039; des PiFace angeschlossen werden kann. So liegt beim Input Pin 1 das Signal &#039;1&#039; an, wenn eine Verbindung zu &#039;Input GND&#039; besteht.&lt;br /&gt;
Z.B. können 2 unisolierte Drähte so plaziert werden, dass ein vorbeifahrendes Fahrzeug einen von ihnen genügend bewegt um den Kontakt kurze Zeit zu öffnen. Genau dann liefert dieser &#039;Sensor&#039; das Signal &#039;0&#039;. Eine - die Schwerkraft nutzende - mögliche Bauform ist rechts abgebildet ;-)&lt;br /&gt;
&lt;br /&gt;
c. Natürlich werden zusätzlich 2 isolierte Drähte benötigt, um jeden der beiden offenen Drähte geschützt mit Input Pin 1 und Input GND zu verbinden.&lt;br /&gt;
&lt;br /&gt;
d. Bei jeder Durchfahrt liefert der Sensor nun ein &#039;0&#039;-Signal, was im Script sowohl für eine Zeitmessung als auch für ein &#039;Schaltintervall-Array&#039; genutzt werden kann. Dort können abwechselnd für beide Spannungen Zeiten (die in etwa zum jeweiligen Streckenabschnitt passen) &#039;programmiert&#039; werden. Statt Taste 1 wird nun der Sensor ausgewertet (wobei Taste 1 als Sensor-Ersatz insoweit genutzt werden kann, dass sie gedrückt bleiben bzw. kurz losgelassen werden muss). Zur genaueren Zeitmessung wird noch das modul &#039;clock&#039; benötigt. &amp;quot;&amp;lt;tt&amp;gt;wandler3.py&amp;lt;/tt&amp;gt;&amp;quot; könnte also so aussehen:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler3.py&lt;br /&gt;
 &lt;br /&gt;
 from time import clock&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
 sensor_1=1&lt;br /&gt;
 sensor_2=0&lt;br /&gt;
 rundenzahl=0&lt;br /&gt;
 v_wechsel=0&lt;br /&gt;
 vorrunde=0&lt;br /&gt;
 index_zaehler=1&lt;br /&gt;
 &lt;br /&gt;
 zeit_array=[0,0.2,0.4,0.2,0.4,0.2,0.4,0.2,5,0.2,6]&lt;br /&gt;
 # dieses array enthält die sek. bis zum Spannungswechsel&lt;br /&gt;
&lt;br /&gt;
 array_laenge=9&lt;br /&gt;
 # legt fest, wie viel Werte des arrays genutzt werden sollen&lt;br /&gt;
 &lt;br /&gt;
 sensor_aus=1.3&lt;br /&gt;
 # bis der Sensor sicher in die Ruhestellung kippt, wird er nicht ausgelesen&lt;br /&gt;
  &lt;br /&gt;
 pfio.init()&lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
&lt;br /&gt;
 # das Fahrzeug wird langsam zum Start (=Sensor) bewegt&lt;br /&gt;
 while sensor_1 == 1 :&lt;br /&gt;
   sensor_1=pfio.digital_read(1)&lt;br /&gt;
  &lt;br /&gt;
 print &amp;quot;fliegender Start... zum Beenden Taste 2 drücken&amp;quot;&lt;br /&gt;
 print &amp;quot;Runde Nr., Ges.Zeit, Rundenzeit, mittlere Rundenzeit&amp;quot;&lt;br /&gt;
 start_zeit=clock()&lt;br /&gt;
 runden_start=start_zeit&lt;br /&gt;
  &lt;br /&gt;
 while sensor_2 == 0 :&lt;br /&gt;
   sensor_2=pfio.digital_read(2)&lt;br /&gt;
   v_wechsel=1-v_wechsel&lt;br /&gt;
   pfio.digital_write(2,v_wechsel)&lt;br /&gt;
   sensor_zeit=clock()&lt;br /&gt;
  &lt;br /&gt;
   while zeit_array[index_zaehler]+sensor_zeit &amp;gt; clock() :&lt;br /&gt;
     if runden_start+sensor_aus &amp;lt; clock() :&lt;br /&gt;
 &lt;br /&gt;
       sensor_1=pfio.digital_read(1) &lt;br /&gt;
       if sensor_1 == 0 :&lt;br /&gt;
         rundenzahl=rundenzahl+1&lt;br /&gt;
         runden_start=clock()&lt;br /&gt;
         zeit=runden_start-start_zeit&lt;br /&gt;
         print rundenzahl, zeit, zeit-vorrunde, zeit/rundenzahl&lt;br /&gt;
         vorrunde=zeit&lt;br /&gt;
         sensor_zeit=0&lt;br /&gt;
         index_zaehler=0&lt;br /&gt;
         v_wechsel=0&lt;br /&gt;
  &lt;br /&gt;
   index_zaehler=index_zaehler+1&lt;br /&gt;
   if index_zaehler &amp;gt; array_laenge :&lt;br /&gt;
     sensor_2=1&lt;br /&gt;
     print &amp;quot;array-Ende erreicht!&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Outp 1 &amp;amp; 2 auf 0!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wird das Array-Ende erreicht, wurden entweder zu wenige Einträge vorgesehen oder es befindet sich kein Fahrzeug (mehr) auf der Strecke, das den Sensor und damit des Zurücksetzen des Arrays auslösen konnte.&lt;br /&gt;
&lt;br /&gt;
e. Das Array ist an die jeweilige Strecke anzupassen, wobei der vorderste Eintrag ungenutzt bleibt und dann mit der Dauer für maximale Spannung begonnen wird. Solange man mit Relais arbeitet, sollten die Schaltzeiten nicht zu kurz sein (&amp;gt;0.1 sek), da diese eine gewisse mechanische Trägheit besitzen.&lt;br /&gt;
&lt;br /&gt;
f. Eben diese mechanische Beschaffenheit der Relais (Verschleiß) ist auch ein guter Grund, auf &#039;volle&#039; digitale Signalumwandlung umzustellen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Optokoppler als Ersatz für Relais =&lt;br /&gt;
&lt;br /&gt;
Ähnlich wie ein Relais dient ein [[Optokoppler]] dazu, eine Signalübertragung zwischen zwei getrennten Stromkreisen zu ermöglichen. Bei diesem Projekt liegt der Einsatz von Optokopplern nahe, da sie schneller schalten und keine beweglichen Teile besitzen. Für unsere Zwecke benötigen wir nun als zusätzliche Elemente: Optokoppler (CNY 17-4), npn-[[Transistor]]en (BC 337-40) zur Signalverstärkung sowie einige Widerstände im Bereich von 2k und 400 Ohm. &lt;br /&gt;
&lt;br /&gt;
== Kaskadierung von Transistoren zur Signalverstärkung ==&lt;br /&gt;
&lt;br /&gt;
a. Entsprechend Schritt 2.4.d. (ein Relais bei 50 Ohm) wird zunächst ein [[Optokoppler]] eingesetzt, dessen Signal durch einen Transistor verstärkt wird, um die &#039;Grundspannung&#039; zu schalten (Pin 3 und 6 beim Optokoppler sollten unbeschaltet bleiben, allein der &#039;Lichtstrom&#039; reicht für eine Ansteuerung aus):&lt;br /&gt;
&lt;br /&gt;
[[Bild:PiF_CNY_BC_1.png|400px|Optokoppler mit Transistor]]&lt;br /&gt;
&lt;br /&gt;
b. Da immer mit einer gewissen Toleranz bei allen Komponenten zu rechnen ist, kann es sein, dass u.U. die Widerstände etwas größer oder kleiner gewählt werden müssen. Beim Ausprobieren sollte man hier in 10% Schritten variieren.&lt;br /&gt;
&lt;br /&gt;
c. Bei Austesten mit Emulator oder Script ist auch zu beachten, dass nun &#039;Output Pin 8&#039; genutzt wird, da dieser nicht mit den Relais verschaltet ist.&lt;br /&gt;
&lt;br /&gt;
== Umsetzung von 3 Schaltstufen mit Optokopplern ==&lt;br /&gt;
&lt;br /&gt;
a. Entsprechend dem Vorgehen beim Relais kann nun auch der kleine Widerstand zusätzlich beschaltet werden um seine gesteuerte Überbrückung zu ermöglichen. Da hier eine relativ geringe Spannung aufgeschaltet wird, kann zu Beginn eine Diode eingesetzt werden, die die Schaltstufe &#039;maximale Spannung&#039; anzeigt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:SmPiFu2ou2T.png|400px|Kombination von 2 Optokopplern]]&lt;br /&gt;
&lt;br /&gt;
b. Vor dem Testen ist wieder zu beachten, dass nun zusätzlich &#039;Output Pin 7&#039; genutzt wird (statt Output Pin 2).&lt;br /&gt;
&lt;br /&gt;
c. Eine mögliche Realisierung sieht so aus:[http://youtu.be/xQ7N-PrIULk].&lt;br /&gt;
&lt;br /&gt;
== Zusätzliche Erhöhung der Schaltstufen bei D/A-Wandlern ==&lt;br /&gt;
&lt;br /&gt;
a. Zwar benötigen wir in unserem speziellen Beispiel eine &#039;Grundspannung&#039;, die sich dahingehend auswirkt, dass - wie unter 3.1.c. erwähnt - eine Signalkombination nicht ausgewertet wird, aber mit jeder weiteren Schaltstufe würde sich dieses Problem (theoretisch) relativieren, da bei geschickter Auswahl der Widerstände (z.B. im Verhältnis 1 zu 2) jeweils eine Verdoppelung der Kombinationsmöglichkeiten erreichbar ist.&lt;br /&gt;
&lt;br /&gt;
b. Wird hier der 50 Ohm Widerstand asymmetrisch geteilt (z.B. 15 + 35 Ohm, s.a. [[Spannungsteiler]]) um dort ein weiteres Signal umsetzen zu können, ergeben sich direkt folgende 5 Schaltstufen (aus, 50, 35, 15 und 0 Ohm) u.s.w.:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Sm3ou3t2.png|400px|Erhöhung der Schaltstufen]]&lt;br /&gt;
&lt;br /&gt;
c. Zur Ansteuerung dieser Schaltstufen wäre das Script so zu ändern, dass nun zwischen mehr als 2 Stufen gewechselt werden kann und im Array entsprechende Zusatzdaten vorgegeben und ausgelesen werden. Mehr als diese Stufen sind im konkreten Fall aber nicht sinnvoll, da die entstehende Verlustleistung in der Schaltung die maximal verfügbare Leistung reduziert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Weiterführende Ideen =&lt;br /&gt;
&lt;br /&gt;
Die Ausbaumöglichkeiten dieses Projektes sind vielfältig:&lt;br /&gt;
&lt;br /&gt;
== Hardwareseitige Ausbauvarianten ==&lt;br /&gt;
&lt;br /&gt;
- beispielhafte Umsetzung einer differenzierten Abstufung mittels mittels einer logarithmischen Einteilung oder eines möglichst oft durch 2 teilbaren Anfangswertes und der Teiler (640 Ohm, 320, 160...);&lt;br /&gt;
&lt;br /&gt;
- Nachbau des Projekts mit einem Microcontroller (ggf. mit LCD-Anzeige);&lt;br /&gt;
&lt;br /&gt;
- Umbau der Steuerung mit dem Ziel, sie direkt an die GPIO-Pins des RPi anzuschließen;&lt;br /&gt;
&lt;br /&gt;
- Ergänzung um eine Sensorik, die in diesem Beispiel eine Rückmeldung liefert, ob ein Verbraucher aktiv ist oder nicht (Fahrzeug noch auf der Strecke?);&lt;br /&gt;
&lt;br /&gt;
- Einsatz anderer Sensortechniken und/oder mehrerer Sensoren zur Optimierung der Schnelligkeit oder parallelen Steuerung eines 2. Fahrzeuges;&lt;br /&gt;
&lt;br /&gt;
== Softwareseitige Ausbauvarianten ==&lt;br /&gt;
&lt;br /&gt;
- Optimierung des Scripts, indem die Sensor-Abfrage über einen &#039;Listener&#039; umgesetzt wird;&lt;br /&gt;
&lt;br /&gt;
- Erweiterung des Scripts um eine GUI mit Hilfe der python-lib Tkinter, um einen Nutzerzugriff auf das Steuerarray und/oder eine &#039;Verwaltung&#039; mehrerer Fahrzeuge;&lt;br /&gt;
&lt;br /&gt;
- Einbindung eines Web-Interface um eine &#039;Fernsteuerung&#039; zu ermöglichen...&lt;br /&gt;
&lt;br /&gt;
...in jedem Fall: viel Spass beim Basteln!&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [http://hackaday.com/2013/01/23/replacement-controllers-for-slot-car-racing/ ähnliches Projekt bei &#039;hackaday&#039;] &lt;br /&gt;
* [https://docs.google.com/folder/d/0B-UAZ9CyJCLGQjJ3RDlqa2pqaDg/edit?pli=1&amp;amp;docId=0B-UAZ9CyJCLGNmpMeVpyYlZJUWc Relaisschaltung mit pädagogischer Erweiterung der Universität Manchester (englischspr.)]&lt;br /&gt;
* [http://elinux.org/RPi_Projects/PiFace_controlling_a_slot-car paralleler englischsp. Bericht des Autors zum RPi mit anderem Schwerpunkt] &lt;br /&gt;
* [http://elinux.org/RPi_Projects englischsp. Projektliste zum RPi]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Raspberry Pi]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Mknot9</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=RPi_als_D/A-Wandler&amp;diff=74136</id>
		<title>RPi als D/A-Wandler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=RPi_als_D/A-Wandler&amp;diff=74136"/>
		<updated>2013-03-07T21:14:14Z</updated>

		<summary type="html">&lt;p&gt;Mknot9: /* Siehe auch */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von mknot9&#039;&#039; (in Arbeit)&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
Oft wird ein Computer &#039;nur&#039; genutzt um darauf Software ablaufen zu lassen. Dessen Möglichkeit zur Steuerung von elektrischen und mechanischen Geräten wird dabei leicht übersehen.&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel richtet sich daher an Einsteiger, die mit dem [[Raspberry Pi]] (&#039;RPi&#039;) Grundlagen der Computersteuerung mit Relais und [[Spannungsteiler]]n nachvollziehen möchten. Es wird schrittweise dargestellt, wie mittels eines D/A-Wandlers (Digital/Analog-Wandler = Umwandlung von digitalen 1/0 Signale) die Steuerung einer stufenweise veränderbaren Ausgangsspannung aufgebaut werden kann.&lt;br /&gt;
&lt;br /&gt;
= Verwendete Hardware =&lt;br /&gt;
&lt;br /&gt;
== RPi in Kombination mit der &#039;PiFace&#039;-Karte als Bastelplattform ==&lt;br /&gt;
&lt;br /&gt;
Dank der einfachen Bauweise bietet sich der RPi mit seinen frei zugänglichen GPIO-Pins als ideale Bastelplattform an. Trotzdem kann es beim anfänglichen Experimentieren mit Schaltungen öfters zu kleinen Fehlern kommen, die schlimmstenfalls die empfindliche Elektronik des RPi dauerhaft beschädigen können.&lt;br /&gt;
&lt;br /&gt;
Daher wird bei diesem Projekt zusätzlich mit der &#039;PiFace[http://elinux.org/RPi_Expansion_Boards#Piface]&#039;-Karte gearbeitet, die man auf die GPIO-Pins stecken kann. Diese Erweiterungskarte verschaltet die GPIO-Pins auf je 8 digitale Ein- und Ausgänge sowie 2 Relais, die eine galvanische Trennung von Stromkreisen ermöglichen. Damit besteht auch für Einsteiger ein gewisser Schutz für die Steuerelektronik des RPi.&lt;br /&gt;
&lt;br /&gt;
Auch im weiteren Verlauf dieser Einführung soll noch auf eine Trennung der Stromkreise Wert gelegt werden, so dass für erste digitale Schaltexperimente ein Optokoppler genutzt wird. Die spätere Nutzung der &#039;Input Pins&#039; des PiFace um eine Steuerung der D/A-Wandlung durch bestimmte Ereignisse zu ermöglichen, erfolgt ebenfalls passiv.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Auch wenn mit vermeindlich &#039;sicheren&#039; Transformatoren gebastelt wird, muss stets bedacht werden, dass diese an einem 230V-Stromnetz betrieben werden und man eher einmal mehr als weniger prüfen sollte, ob man durch eventuelle Fehler mit lebensgefährlicher Spannung in Berührung kommt!&lt;br /&gt;
&lt;br /&gt;
== Auswahl eines Beispielprojektes ==&lt;br /&gt;
&lt;br /&gt;
Günstige Möglichkeiten ein Gerät zu finden, das mit analogen Spannungen arbeitet, bieten sich u.a. im Spielzeugbereich. Im Grunde eignet sich alles, was mit Batterien oder mit Gleichspannungen unter 24 V betrieben wird.&lt;br /&gt;
&lt;br /&gt;
Da jedoch ein Ziel das Steuern von analogen Spannungen ist, bietet sich insbesondere alles an, bei dem [[Potentiometer]] eingesetzt werden. Einen dieser &#039;Handregler&#039; sollte man übrig haben, da er von seinem Anschlusskabel abgetrennt werden muss, um den oft proprietären Steckanschluss nutzen zu können. In diesem Sinne wird hier eine handelsübliche Spielzeug-Autorennbahn mit Potentiometer-Handreglern genutzt.&lt;br /&gt;
&lt;br /&gt;
== Sonstige Bauteile ==&lt;br /&gt;
&lt;br /&gt;
Für die ersten Grundlagen (s. Teile 2 &amp;amp; 3) genügen bereits rund 2 m isolierter Draht, der nicht aus verdrillten feinen Adern (Litze) bestehen sollte, 50 cm nicht-isolierter Draht, einige niederohmige Widerstände (z.B. je 2 mal 100 Ohm, 80, 60, sowie 20) und ein &#039;Experimentierbrett&#039; (engl. [[Breadboard]]).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Grundlagen und Vorbereitung des Projekts =&lt;br /&gt;
&lt;br /&gt;
== Umwandlung von 1/0 zu Ein/Aus mit einem Relais ==&lt;br /&gt;
&lt;br /&gt;
Vom Prinzip her ist jede Umwandlung eines digitalen 0 oder 1 Signals (das über eine bestimmte Spannungsdifferenz festgelegt ist) in eine (nutzbare) Spannung bereits eine D/A-Wandlung. Dies wird schlicht so realisiert, dass mit einer Eingabe am RPi die Nutzspannung des &#039;Verbrauchers&#039; zunächst einfach an- und ausgeschaltet wird.&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung der zu steuernden Hardware ==&lt;br /&gt;
&lt;br /&gt;
a. Um Fehlerquellen auszuschliessen sollte zunächst (und ggf. auch später!) kurz getestet werden, ob der vorhandene Regler wie erwartet funktioniert.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pif_Con9.jpg|thumb|right|400px|Fixierung der Reglerkabel]]&lt;br /&gt;
b. Nach dem Trennen des Reglers von der Einspeisung (und ggf. Ziehen des Netzsteckers) muss das Regler-Kabel abgeschnitten werden (eher nahe beim Regler, da das Kabel bald bis zum Breadboard reichen soll). Die neuen Enden des Einspeiseteils werden abisoliert und auf dem Breadboard diagonal zueinander mit einigen Spalten Abstand fixiert. Auch können bereits die Drähte, die später zum RPi führen, jeweils in den passenden kontaktführenden Spalten eingesteckt werden, z. B. wie rechts zu sehen (die nicht beschrifteten Drähte können vorerst ignoriert werden):&lt;br /&gt;
&lt;br /&gt;
c. Nun bietet sich eine gute Gelegenheit die maximale Spannung am Nutzgerät zu messen. Man verbindet das Regler-Kabel (nun ohne Regler) wieder mit der Einspeisung und die offenen Enden der Drähte mit dem Messgerät, bei dem zunächst ein Messbereich von ca. 10-50 Volt gewählt werden sollte. Dies sollte dann z.B. 14,8 V anzeigen. Natürlich können auch die beiden offenen Enden einen kleinen Moment kurz geschlossen werden, man sollte aber bedenken, dass das zu regelnde Nutzgerät dann die maximal vorgesehene Spannung erhält (hier: maximales Tempo).&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung des RPi ==&lt;br /&gt;
&lt;br /&gt;
Es wird davon ausgegangen, dass entsprechend des zugehörigen &#039;manual&#039; das PiFace bereits auf den RPi gesteckt ist, die nötigen python-Bilbliotheken installiert sind und man sich im Terminal-Arbeitsverzeichnis &#039;pi&#039; befindet.&lt;br /&gt;
&lt;br /&gt;
a. Zunächst wird der PiFace-Emulator (im Terminal direkt aus dem Arbeitsverzeichnis) gestartet: &amp;lt;tt&amp;gt;piface/scripts/piface-emulator&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b. Wenn alles richtig installiert wurde, erscheint ein Fenster (unten links), bei dem die vorerst wichtigen blauen Signale am rechten Rand wie folgt angezeigt werden sollten: &lt;br /&gt;
 &lt;br /&gt;
[[Datei:RPi_PiF_em-scs.jpg|400px|Piface-Emulator im default-Zustand]] [[Datei:RPi_PiF_em_scs1.jpg|400px|Piface-Relais 1 auf &#039;1&#039; geschaltet]]&lt;br /&gt;
&lt;br /&gt;
c. Das rechte Fenster ergibt sich, wenn man nun im Fenster auf &amp;quot;Override Enable&amp;quot; und dann &amp;quot;Output Pin 1&amp;quot; klickt. Es müsste ein &amp;quot;Klack&amp;quot; vom Relais 1 zu hören sein sowie der Schaltzustand des unteren Relais 1 (das an den Output Pin 1 gekoppelt ist) auf die Verbindung der beiden unteren Anschlüsse wechseln. Zugleich wird das erste LED-Icon beim Output Pin 1 rot sowie das zugehörige LED-Icon blau.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pif_rel2.png|thumb|right|250px|Schema der Piface-Relais]]&lt;br /&gt;
d. Rechts ist der Schaltzustand der Relais, die zu Beginn genutzt werden, im Grundzustand dargestellt (jeweils der mittlere und obere Kontakt sind kurzgeschlossen, der jeweils untere Kontakt ist frei):&lt;br /&gt;
&lt;br /&gt;
e. Ein weiterer Klick auf &amp;quot;Output Pin 1&amp;quot; versetzt das Relais in den Ausgangszustand, der vor dem nächsten Schritt wieder eingestellt werden sollte.&lt;br /&gt;
&lt;br /&gt;
f. Das Relais läßt sich auch mittel eines Python-Scripts vom RPi aus ansteuern. Dazu wird folgende Textdatei &amp;quot;wandler.py&amp;quot; im Arbeitsverzeichnis abgespeichert und mit dem Befehl &amp;quot;&amp;lt;tt&amp;gt;python wandler.py&amp;lt;/tt&amp;gt;&amp;quot; gestartet:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler.py&lt;br /&gt;
&lt;br /&gt;
 from time import sleep&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
&lt;br /&gt;
 pfio.init()&lt;br /&gt;
&lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
 print &amp;quot;Strom an&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 sleep(2)&lt;br /&gt;
&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Strom aus&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Nach dem Absetzen des Befehls wechselt nun das blaue Signal an Relais 1 für 2 Sekunden und das Relais klackt entsprechend.&lt;br /&gt;
&lt;br /&gt;
== Einsatz eines Relais&#039; zur Umsetzung von Spannungsänderungen ==&lt;br /&gt;
&lt;br /&gt;
a. Ist das Relais wieder im Ausgangszustand, befestigt man nun einen der vom Breadboard führenden Drähte am unteren und einen am mittleren Relaiseingang (im Moment ist die Polarität noch egal). Zunächst sollte nichts passieren (das Relais hält diesen ja Stromkreis noch offen).&lt;br /&gt;
&lt;br /&gt;
b. Startet man aber das Script wieder (&amp;lt;tt&amp;gt;python wandler.py&amp;lt;/tt&amp;gt;) oder klickt auf &#039;Output Pin 1&#039; wird der Nutzstromkreis geschlossen. Nochmals aufgepasst: unser Nutzer erhält wieder die maximal vorgesehene Spannung - also besser vorher im Script &amp;quot;&amp;lt;tt&amp;gt;sleep(0.3)&amp;lt;/tt&amp;gt;&amp;quot; setzen und speichern.&lt;br /&gt;
&lt;br /&gt;
c. Im Prinzip ist damit die programmgesteuerte Umsetzung eines 0/1 Signals in z.B. eine 0V/15V Spannung erreicht.&lt;br /&gt;
&lt;br /&gt;
d. Da wir bald verschiedene Steuerspannungen schalten wollen, geht es jetzt darum herauszufinden, bei welcher Spannung unser Nutzgerät gerade noch bewegt wird. Dies probiert man aus - mit dem kleinsten Widerstand beginnend: indem einer der Drähte in eine freie Breadboardspalte gesteckt wird und aus dieser Spalte der Widerstand zu dem &#039;alten&#039; Steckplatz des Drahtes geführt wird. Nun startet man jeweils das Script bis der Widerstand so hoch ist, dass die Anlaufspannung beim Nutzgerätes gut ausreicht, eine Reaktion des Nutzgerät (Fahrzeug bewegt sich) zu bewirken (z.B. bei 50 Ohm beträgt der Strom ca. 130 mA während ohne 190 mA fliessen).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Ansteuerung von 3 Schaltstufen =&lt;br /&gt;
&lt;br /&gt;
== Kombination von 2 Relais ==&lt;br /&gt;
&lt;br /&gt;
[[Bild:ZrelMww2.png|thumb|right|250px|Beschaltung der Relais]] a. Die einfachste Stufe der weiteren Verschaltung erreicht man, indem der Widerstand mit einem 2. Relais überbrückt wird. Relais 1 kann dann als &#039;Hauptschalter&#039;, Relais 2 als Spannungsumschalter genutzt werden:&lt;br /&gt;
&lt;br /&gt;
b. Diese Beschaltung kann sogleich mit dem PiFace-Emulator ausprobiert werden. Damit können wir bereits 3 Schaltstufen steuern: keine, verminderte und volle Spannung.&lt;br /&gt;
&lt;br /&gt;
c. Theoretisch liesse sich auch noch eine 4. Spannungsstufe erzeugen, da mit 2 &#039;Bits&#039; (Ein/Aus bei 2 Relais) bereits 4 verschiedene Signale darstellbar sind. Beim jetzigen Aufbau werden aber lediglich die (pin1,pin2)-Signale (0,0), (1,0) und (1,1) &#039;genutzt&#039;, da Relais 1 als Hauptschalter vorgesehen ist und die Kombination (0,1) so nicht ausgewertet wird.&lt;br /&gt;
&lt;br /&gt;
== Programmgesteuerte Schaltung von 2 Relais ==&lt;br /&gt;
&lt;br /&gt;
a. Mit einem veränderten python-Script &amp;quot;wandler2.py&amp;quot; ist auch die programmgesteuerte Schaltung möglich. Dabei werden zusätzlich die Tasten 1 und 2 des PiFace genutzt, um nach dem Start des Scripts (&amp;lt;tt&amp;gt;python wandler2.py&amp;lt;/tt&amp;gt;) den Hauptschalter (Relais 1) zu steuern:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler2.py&lt;br /&gt;
 &lt;br /&gt;
 from time import sleep&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
 pfio.init()&lt;br /&gt;
 &lt;br /&gt;
 taste_1=0&lt;br /&gt;
 taste_2=0&lt;br /&gt;
 intervall_a=0.1&lt;br /&gt;
 intervall_b=0.5&lt;br /&gt;
 # Die Intervalle bestimmen die Schaltzeit für volle/verminderte Spannung&lt;br /&gt;
 &lt;br /&gt;
 print &amp;quot;Zum Start Taste 1 drücken, zum Stoppen Taste 2&amp;quot;&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 while taste_1 == 0:&lt;br /&gt;
   sleep(intervall_a)&lt;br /&gt;
   taste_1=pfio.digital_read(1)&lt;br /&gt;
&lt;br /&gt;
 # Der o.g. &#039;sleep&#039;-Befehl bestimmt die Abfragepausen für Taste 1&lt;br /&gt;
 &lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
 print &amp;quot;Strom an!&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 while taste_2 == 0:&lt;br /&gt;
   pfio.digital_write(2,1)&lt;br /&gt;
   sleep(intervall_a)&lt;br /&gt;
   pfio.digital_write(2,0)&lt;br /&gt;
   sleep(intervall_b)&lt;br /&gt;
   taste_2=pfio.digital_read(2)&lt;br /&gt;
 &lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Strom aus!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
b. Falls beim Ausprobieren von Script-Änderungen mal was schief geht, kann das Script stets auch mit der Tastenkombination (CNTRL-C) gestoppt werden. U.U. muss dann noch zusätzlich Relais 1 und/oder 2 via Emulator zurückgesetzt werden.&lt;br /&gt;
&lt;br /&gt;
c. Beim Verändern des Scripts fällt bald auf, dass die bisherige Programmsteuerung keine direkte Möglichkeit vorsieht, auf Ereignisse zu reagieren. Immerhin wird ein mechanisches Gerät gesteuert, bei dem mit Ausfällen, Fertigungstoleranzen, Umwelteinflüssen etc. zu rechnen ist (im Script wird dies bislang &#039;nur&#039; durch die Abbruchbedingung &#039;Taste 2&#039; berücksichtigt).&lt;br /&gt;
&lt;br /&gt;
== Einfache Sensor-Signale als steuernde Elemente eines Programms ==&lt;br /&gt;
&lt;br /&gt;
a. Eine wichtige Anwendung von D/A-Steuerungen ist die mögliche Reaktion dieser Steuerung auf &#039;äußere&#039; Ereignisse, die z.B. mit Hilfe von Sensoren leistbar ist.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Einf_Sens.jpg|thumb|right|250px|einfacher Sensor]]b. Für unsere Zwecke genügt zunächst ein sehr einfacher Sensor, der ein 0- oder 1-Signal liefert und idealerweise direkt am &#039;Input Pin 1&#039; des PiFace angeschlossen werden kann. So liegt beim Input Pin 1 das Signal &#039;1&#039; an, wenn eine Verbindung zu &#039;Input GND&#039; besteht.&lt;br /&gt;
Z.B. können 2 unisolierte Drähte so plaziert werden, dass ein vorbeifahrendes Fahrzeug einen von ihnen genügend bewegt um den Kontakt kurze Zeit zu öffnen. Genau dann liefert dieser &#039;Sensor&#039; das Signal &#039;0&#039;. Eine - die Schwerkraft nutzende - mögliche Bauform ist rechts abgebildet ;-)&lt;br /&gt;
&lt;br /&gt;
c. Natürlich werden zusätzlich 2 isolierte Drähte benötigt, um jeden der beiden offenen Drähte geschützt mit Input Pin 1 und Input GND zu verbinden.&lt;br /&gt;
&lt;br /&gt;
d. Bei jeder Durchfahrt liefert der Sensor nun ein &#039;0&#039;-Signal, was im Script sowohl für eine Zeitmessung als auch für ein &#039;Schaltintervall-Array&#039; genutzt werden kann. Dort können abwechselnd für beide Spannungen Zeiten (die in etwa zum jeweiligen Streckenabschnitt passen) &#039;programmiert&#039; werden. Statt Taste 1 wird nun der Sensor ausgewertet (wobei Taste 1 als Sensor-Ersatz insoweit genutzt werden kann, dass sie gedrückt bleiben bzw. kurz losgelassen werden muss). Zur genaueren Zeitmessung wird noch das modul &#039;clock&#039; benötigt. &amp;quot;&amp;lt;tt&amp;gt;wandler3.py&amp;lt;/tt&amp;gt;&amp;quot; könnte also so aussehen:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler3.py&lt;br /&gt;
 &lt;br /&gt;
 from time import clock&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
 sensor_1=1&lt;br /&gt;
 sensor_2=0&lt;br /&gt;
 rundenzahl=0&lt;br /&gt;
 v_wechsel=0&lt;br /&gt;
 vorrunde=0&lt;br /&gt;
 index_zaehler=1&lt;br /&gt;
 &lt;br /&gt;
 zeit_array=[0,0.2,0.4,0.2,0.4,0.2,0.4,0.2,5,0.2,6]&lt;br /&gt;
 # dieses array enthält die sek. bis zum Spannungswechsel&lt;br /&gt;
&lt;br /&gt;
 array_laenge=9&lt;br /&gt;
 # legt fest, wie viel Werte des arrays genutzt werden sollen&lt;br /&gt;
 &lt;br /&gt;
 sensor_aus=1.3&lt;br /&gt;
 # bis der Sensor sicher in die Ruhestellung kippt, wird er nicht ausgelesen&lt;br /&gt;
  &lt;br /&gt;
 pfio.init()&lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
&lt;br /&gt;
 # das Fahrzeug wird langsam zum Start (=Sensor) bewegt&lt;br /&gt;
 while sensor_1 == 1 :&lt;br /&gt;
   sensor_1=pfio.digital_read(1)&lt;br /&gt;
  &lt;br /&gt;
 print &amp;quot;fliegender Start... zum Beenden Taste 2 drücken&amp;quot;&lt;br /&gt;
 print &amp;quot;Runde Nr., Ges.Zeit, Rundenzeit, mittlere Rundenzeit&amp;quot;&lt;br /&gt;
 start_zeit=clock()&lt;br /&gt;
 runden_start=start_zeit&lt;br /&gt;
  &lt;br /&gt;
 while sensor_2 == 0 :&lt;br /&gt;
   sensor_2=pfio.digital_read(2)&lt;br /&gt;
   v_wechsel=1-v_wechsel&lt;br /&gt;
   pfio.digital_write(2,v_wechsel)&lt;br /&gt;
   sensor_zeit=clock()&lt;br /&gt;
  &lt;br /&gt;
   while zeit_array[index_zaehler]+sensor_zeit &amp;gt; clock() :&lt;br /&gt;
     if runden_start+sensor_aus &amp;lt; clock() :&lt;br /&gt;
 &lt;br /&gt;
       sensor_1=pfio.digital_read(1) &lt;br /&gt;
       if sensor_1 == 0 :&lt;br /&gt;
         rundenzahl=rundenzahl+1&lt;br /&gt;
         runden_start=clock()&lt;br /&gt;
         zeit=runden_start-start_zeit&lt;br /&gt;
         print rundenzahl, zeit, zeit-vorrunde, zeit/rundenzahl&lt;br /&gt;
         vorrunde=zeit&lt;br /&gt;
         sensor_zeit=0&lt;br /&gt;
         index_zaehler=0&lt;br /&gt;
         v_wechsel=0&lt;br /&gt;
  &lt;br /&gt;
   index_zaehler=index_zaehler+1&lt;br /&gt;
   if index_zaehler &amp;gt; array_laenge :&lt;br /&gt;
     sensor_2=1&lt;br /&gt;
     print &amp;quot;array-Ende erreicht!&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Outp 1 &amp;amp; 2 auf 0!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wird das Array-Ende erreicht, wurden entweder zu wenige Einträge vorgesehen oder es befindet sich kein Fahrzeug (mehr) auf der Strecke, das den Sensor und damit des Zurücksetzen des Arrays auslösen konnte.&lt;br /&gt;
&lt;br /&gt;
e. Das Array ist an die jeweilige Strecke anzupassen, wobei der vorderste Eintrag ungenutzt bleibt und dann mit der Dauer für maximale Spannung begonnen wird. Solange man mit Relais arbeitet, sollten die Schaltzeiten nicht zu kurz sein (&amp;gt;0.1 sek), da diese eine gewisse mechanische Trägheit besitzen.&lt;br /&gt;
&lt;br /&gt;
f. Eben diese mechanische Beschaffenheit der Relais (Verschleiß) ist auch ein guter Grund, auf &#039;volle&#039; digitale Signalumwandlung umzustellen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Optokoppler als Ersatz für Relais =&lt;br /&gt;
&lt;br /&gt;
Ähnlich wie ein Relais dient ein [[Optokoppler]] dazu, eine Signalübertragung zwischen zwei getrennten Stromkreisen zu ermöglichen. Bei diesem Projekt liegt der Einsatz von Optokopplern nahe, da sie schneller schalten und keine beweglichen Teile besitzen. Für unsere Zwecke benötigen wir nun als zusätzliche Elemente: Optokoppler (CNY 17-4), npn-[[Transistor]]en (BC 337-40) zur Signalverstärkung sowie einige Widerstände im Bereich von 2k und 400 Ohm. &lt;br /&gt;
&lt;br /&gt;
== Kaskadierung von Transistoren zur Signalverstärkung ==&lt;br /&gt;
&lt;br /&gt;
a. Entsprechend Schritt 2.4.d. (ein Relais bei 50 Ohm) wird zunächst ein [[Optokoppler]] eingesetzt, dessen Signal durch einen Transistor verstärkt wird, um die &#039;Grundspannung&#039; zu schalten (Pin 3 und 6 beim Optokoppler sollten unbeschaltet bleiben, allein der &#039;Lichtstrom&#039; reicht für eine Ansteuerung aus):&lt;br /&gt;
&lt;br /&gt;
[[Bild:PiF_CNY_BC_1.png|400px|Optokoppler mit Transistor]]&lt;br /&gt;
&lt;br /&gt;
b. Da immer mit einer gewissen Toleranz bei allen Komponenten zu rechnen ist, kann es sein, dass u.U. die Widerstände etwas größer oder kleiner gewählt werden müssen. Beim Ausprobieren sollte man hier in 10% Schritten variieren.&lt;br /&gt;
&lt;br /&gt;
c. Bei Austesten mit Emulator oder Script ist auch zu beachten, dass nun &#039;Output Pin 8&#039; genutzt wird, da dieser nicht mit den Relais verschaltet ist.&lt;br /&gt;
&lt;br /&gt;
== Umsetzung von 3 Schaltstufen mit Optokopplern ==&lt;br /&gt;
&lt;br /&gt;
a. Entsprechend dem Vorgehen beim Relais kann nun auch der kleine Widerstand zusätzlich beschaltet werden um seine gesteuerte Überbrückung zu ermöglichen. Da hier eine relativ geringe Spannung aufgeschaltet wird, kann zu Beginn eine Diode eingesetzt werden, die die Schaltstufe &#039;maximale Spannung&#039; anzeigt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:SmPiFu2ou2T.png|400px|Kombination von 2 Optokopplern]]&lt;br /&gt;
&lt;br /&gt;
b. Vor dem Testen ist wieder zu beachten, dass nun zusätzlich &#039;Output Pin 7&#039; genutzt wird (statt Output Pin 2).&lt;br /&gt;
&lt;br /&gt;
c. Eine mögliche Realisierung sieht so aus:[http://youtu.be/xQ7N-PrIULk].&lt;br /&gt;
&lt;br /&gt;
== Zusätzliche Erhöhung der Schaltstufen bei D/A-Wandlern ==&lt;br /&gt;
&lt;br /&gt;
a. Zwar benötigen wir in unserem speziellen Beispiel eine &#039;Grundspannung&#039;, die sich dahingehend auswirkt, dass - wie unter 3.1.c. erwähnt - eine Signalkombination nicht ausgewertet wird, aber mit jeder weiteren Schaltstufe würde sich dieses Problem (theoretisch) relativieren, da bei geschickter Auswahl der Widerstände (z.B. im Verhältnis 1 zu 2) jeweils eine Verdoppelung der Kombinationsmöglichkeiten erreichbar ist.&lt;br /&gt;
&lt;br /&gt;
b. Wird hier der 50 Ohm Widerstand asymmetrisch geteilt (z.B. 15 + 35 Ohm, s.a. [[Spannungsteiler]]) um dort ein weiteres Signal umsetzen zu können, ergeben sich direkt folgende 5 Schaltstufen (aus, 50, 35, 15 und 0 Ohm) u.s.w.:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Sm3ou3t2.png|400px|Erhöhung der Schaltstufen]]&lt;br /&gt;
&lt;br /&gt;
c. Zur Ansteuerung dieser Schaltstufen wäre das Script so zu ändern, dass nun zwischen mehr als 2 Stufen gewechselt werden kann und im Array entsprechende Zusatzdaten vorgegeben und ausgelesen werden. Mehr als diese Stufen sind im konkreten Fall aber nicht sinnvoll, da die entstehende Verlustleistung in der Schaltung die maximal verfügbare Leistung reduziert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Weiterführende Ideen =&lt;br /&gt;
&lt;br /&gt;
Die Ausbaumöglichkeiten dieses Projektes sind vielfältig:&lt;br /&gt;
&lt;br /&gt;
== Hardwareseitige Ausbauvarianten ==&lt;br /&gt;
&lt;br /&gt;
- beispielhafte Umsetzung einer differenzierten Abstufung mittels mittels einer logarithmischen Einteilung oder eines möglichst oft durch 2 teilbaren Anfangswertes und der Teiler (640 Ohm, 320, 160...);&lt;br /&gt;
&lt;br /&gt;
- Nachbau des Projekts mit einem Microcontroller (ggf. mit LCD-Anzeige);&lt;br /&gt;
&lt;br /&gt;
- Umbau der Steuerung mit dem Ziel, sie direkt an die GPIO-Pins des RPi anzuschließen;&lt;br /&gt;
&lt;br /&gt;
- Ergänzung um eine Sensorik, die in diesem Beispiel eine Rückmeldung liefert, ob ein Verbraucher aktiv ist oder nicht (Fahrzeug noch auf der Strecke?);&lt;br /&gt;
&lt;br /&gt;
- Einsatz anderer Sensortechniken und/oder mehrerer Sensoren zur Optimierung der Schnelligkeit oder parallelen Steuerung eines 2. Fahrzeuges;&lt;br /&gt;
&lt;br /&gt;
== Softwareseitige Ausbauvarianten ==&lt;br /&gt;
&lt;br /&gt;
- Optimierung des Scripts, indem die Sensor-Abfrage über einen &#039;Listener&#039; umgesetzt wird;&lt;br /&gt;
&lt;br /&gt;
- Erweiterung des Scripts um eine GUI mit Hilfe der python-lib Tkinter, um einen Nutzerzugriff auf das Steuerarray und/oder eine &#039;Verwaltung&#039; mehrerer Fahrzeuge;&lt;br /&gt;
&lt;br /&gt;
- Einbindung eines Web-Interface um eine &#039;Fernsteuerung&#039; zu ermöglichen...&lt;br /&gt;
&lt;br /&gt;
...in jedem Fall: viel Spass beim Basteln!&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [http://hackaday.com/2013/01/23/replacement-controllers-for-slot-car-racing/ ähnliches Projekt bei &#039;hackaday&#039;] &lt;br /&gt;
* [https://docs.google.com/folder/d/0B-UAZ9CyJCLGQjJ3RDlqa2pqaDg/edit?pli=1&amp;amp;docId=0B-UAZ9CyJCLGNmpMeVpyYlZJUWc Relaisschaltung mit pädagogischer Erweiterung der Universität Manchester (englischspr.)]&lt;br /&gt;
* [http://elinux.org/RPi_Projects/PiFace_controlling_a_slot-car parallele englischsp. Dokumentation des Autors mit anderem Schwerpunkt] &lt;br /&gt;
* [http://elinux.org/RPi_Projects englischsp. Projektliste zum RPi]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Raspberry Pi]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Mknot9</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=RPi_als_D/A-Wandler&amp;diff=74134</id>
		<title>RPi als D/A-Wandler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=RPi_als_D/A-Wandler&amp;diff=74134"/>
		<updated>2013-03-07T21:11:29Z</updated>

		<summary type="html">&lt;p&gt;Mknot9: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von mknot9&#039;&#039; (in Arbeit)&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
Oft wird ein Computer &#039;nur&#039; genutzt um darauf Software ablaufen zu lassen. Dessen Möglichkeit zur Steuerung von elektrischen und mechanischen Geräten wird dabei leicht übersehen.&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel richtet sich daher an Einsteiger, die mit dem [[Raspberry Pi]] (&#039;RPi&#039;) Grundlagen der Computersteuerung mit Relais und [[Spannungsteiler]]n nachvollziehen möchten. Es wird schrittweise dargestellt, wie mittels eines D/A-Wandlers (Digital/Analog-Wandler = Umwandlung von digitalen 1/0 Signale) die Steuerung einer stufenweise veränderbaren Ausgangsspannung aufgebaut werden kann.&lt;br /&gt;
&lt;br /&gt;
= Verwendete Hardware =&lt;br /&gt;
&lt;br /&gt;
== RPi in Kombination mit der &#039;PiFace&#039;-Karte als Bastelplattform ==&lt;br /&gt;
&lt;br /&gt;
Dank der einfachen Bauweise bietet sich der RPi mit seinen frei zugänglichen GPIO-Pins als ideale Bastelplattform an. Trotzdem kann es beim anfänglichen Experimentieren mit Schaltungen öfters zu kleinen Fehlern kommen, die schlimmstenfalls die empfindliche Elektronik des RPi dauerhaft beschädigen können.&lt;br /&gt;
&lt;br /&gt;
Daher wird bei diesem Projekt zusätzlich mit der &#039;PiFace[http://elinux.org/RPi_Expansion_Boards#Piface]&#039;-Karte gearbeitet, die man auf die GPIO-Pins stecken kann. Diese Erweiterungskarte verschaltet die GPIO-Pins auf je 8 digitale Ein- und Ausgänge sowie 2 Relais, die eine galvanische Trennung von Stromkreisen ermöglichen. Damit besteht auch für Einsteiger ein gewisser Schutz für die Steuerelektronik des RPi.&lt;br /&gt;
&lt;br /&gt;
Auch im weiteren Verlauf dieser Einführung soll noch auf eine Trennung der Stromkreise Wert gelegt werden, so dass für erste digitale Schaltexperimente ein Optokoppler genutzt wird. Die spätere Nutzung der &#039;Input Pins&#039; des PiFace um eine Steuerung der D/A-Wandlung durch bestimmte Ereignisse zu ermöglichen, erfolgt ebenfalls passiv.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Auch wenn mit vermeindlich &#039;sicheren&#039; Transformatoren gebastelt wird, muss stets bedacht werden, dass diese an einem 230V-Stromnetz betrieben werden und man eher einmal mehr als weniger prüfen sollte, ob man durch eventuelle Fehler mit lebensgefährlicher Spannung in Berührung kommt!&lt;br /&gt;
&lt;br /&gt;
== Auswahl eines Beispielprojektes ==&lt;br /&gt;
&lt;br /&gt;
Günstige Möglichkeiten ein Gerät zu finden, das mit analogen Spannungen arbeitet, bieten sich u.a. im Spielzeugbereich. Im Grunde eignet sich alles, was mit Batterien oder mit Gleichspannungen unter 24 V betrieben wird.&lt;br /&gt;
&lt;br /&gt;
Da jedoch ein Ziel das Steuern von analogen Spannungen ist, bietet sich insbesondere alles an, bei dem [[Potentiometer]] eingesetzt werden. Einen dieser &#039;Handregler&#039; sollte man übrig haben, da er von seinem Anschlusskabel abgetrennt werden muss, um den oft proprietären Steckanschluss nutzen zu können. In diesem Sinne wird hier eine handelsübliche Spielzeug-Autorennbahn mit Potentiometer-Handreglern genutzt.&lt;br /&gt;
&lt;br /&gt;
== Sonstige Bauteile ==&lt;br /&gt;
&lt;br /&gt;
Für die ersten Grundlagen (s. Teile 2 &amp;amp; 3) genügen bereits rund 2 m isolierter Draht, der nicht aus verdrillten feinen Adern (Litze) bestehen sollte, 50 cm nicht-isolierter Draht, einige niederohmige Widerstände (z.B. je 2 mal 100 Ohm, 80, 60, sowie 20) und ein &#039;Experimentierbrett&#039; (engl. [[Breadboard]]).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Grundlagen und Vorbereitung des Projekts =&lt;br /&gt;
&lt;br /&gt;
== Umwandlung von 1/0 zu Ein/Aus mit einem Relais ==&lt;br /&gt;
&lt;br /&gt;
Vom Prinzip her ist jede Umwandlung eines digitalen 0 oder 1 Signals (das über eine bestimmte Spannungsdifferenz festgelegt ist) in eine (nutzbare) Spannung bereits eine D/A-Wandlung. Dies wird schlicht so realisiert, dass mit einer Eingabe am RPi die Nutzspannung des &#039;Verbrauchers&#039; zunächst einfach an- und ausgeschaltet wird.&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung der zu steuernden Hardware ==&lt;br /&gt;
&lt;br /&gt;
a. Um Fehlerquellen auszuschliessen sollte zunächst (und ggf. auch später!) kurz getestet werden, ob der vorhandene Regler wie erwartet funktioniert.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pif_Con9.jpg|thumb|right|400px|Fixierung der Reglerkabel]]&lt;br /&gt;
b. Nach dem Trennen des Reglers von der Einspeisung (und ggf. Ziehen des Netzsteckers) muss das Regler-Kabel abgeschnitten werden (eher nahe beim Regler, da das Kabel bald bis zum Breadboard reichen soll). Die neuen Enden des Einspeiseteils werden abisoliert und auf dem Breadboard diagonal zueinander mit einigen Spalten Abstand fixiert. Auch können bereits die Drähte, die später zum RPi führen, jeweils in den passenden kontaktführenden Spalten eingesteckt werden, z. B. wie rechts zu sehen (die nicht beschrifteten Drähte können vorerst ignoriert werden):&lt;br /&gt;
&lt;br /&gt;
c. Nun bietet sich eine gute Gelegenheit die maximale Spannung am Nutzgerät zu messen. Man verbindet das Regler-Kabel (nun ohne Regler) wieder mit der Einspeisung und die offenen Enden der Drähte mit dem Messgerät, bei dem zunächst ein Messbereich von ca. 10-50 Volt gewählt werden sollte. Dies sollte dann z.B. 14,8 V anzeigen. Natürlich können auch die beiden offenen Enden einen kleinen Moment kurz geschlossen werden, man sollte aber bedenken, dass das zu regelnde Nutzgerät dann die maximal vorgesehene Spannung erhält (hier: maximales Tempo).&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung des RPi ==&lt;br /&gt;
&lt;br /&gt;
Es wird davon ausgegangen, dass entsprechend des zugehörigen &#039;manual&#039; das PiFace bereits auf den RPi gesteckt ist, die nötigen python-Bilbliotheken installiert sind und man sich im Terminal-Arbeitsverzeichnis &#039;pi&#039; befindet.&lt;br /&gt;
&lt;br /&gt;
a. Zunächst wird der PiFace-Emulator (im Terminal direkt aus dem Arbeitsverzeichnis) gestartet: &amp;lt;tt&amp;gt;piface/scripts/piface-emulator&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b. Wenn alles richtig installiert wurde, erscheint ein Fenster (unten links), bei dem die vorerst wichtigen blauen Signale am rechten Rand wie folgt angezeigt werden sollten: &lt;br /&gt;
 &lt;br /&gt;
[[Datei:RPi_PiF_em-scs.jpg|400px|Piface-Emulator im default-Zustand]] [[Datei:RPi_PiF_em_scs1.jpg|400px|Piface-Relais 1 auf &#039;1&#039; geschaltet]]&lt;br /&gt;
&lt;br /&gt;
c. Das rechte Fenster ergibt sich, wenn man nun im Fenster auf &amp;quot;Override Enable&amp;quot; und dann &amp;quot;Output Pin 1&amp;quot; klickt. Es müsste ein &amp;quot;Klack&amp;quot; vom Relais 1 zu hören sein sowie der Schaltzustand des unteren Relais 1 (das an den Output Pin 1 gekoppelt ist) auf die Verbindung der beiden unteren Anschlüsse wechseln. Zugleich wird das erste LED-Icon beim Output Pin 1 rot sowie das zugehörige LED-Icon blau.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pif_rel2.png|thumb|right|250px|Schema der Piface-Relais]]&lt;br /&gt;
d. Rechts ist der Schaltzustand der Relais, die zu Beginn genutzt werden, im Grundzustand dargestellt (jeweils der mittlere und obere Kontakt sind kurzgeschlossen, der jeweils untere Kontakt ist frei):&lt;br /&gt;
&lt;br /&gt;
e. Ein weiterer Klick auf &amp;quot;Output Pin 1&amp;quot; versetzt das Relais in den Ausgangszustand, der vor dem nächsten Schritt wieder eingestellt werden sollte.&lt;br /&gt;
&lt;br /&gt;
f. Das Relais läßt sich auch mittel eines Python-Scripts vom RPi aus ansteuern. Dazu wird folgende Textdatei &amp;quot;wandler.py&amp;quot; im Arbeitsverzeichnis abgespeichert und mit dem Befehl &amp;quot;&amp;lt;tt&amp;gt;python wandler.py&amp;lt;/tt&amp;gt;&amp;quot; gestartet:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler.py&lt;br /&gt;
&lt;br /&gt;
 from time import sleep&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
&lt;br /&gt;
 pfio.init()&lt;br /&gt;
&lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
 print &amp;quot;Strom an&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 sleep(2)&lt;br /&gt;
&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Strom aus&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Nach dem Absetzen des Befehls wechselt nun das blaue Signal an Relais 1 für 2 Sekunden und das Relais klackt entsprechend.&lt;br /&gt;
&lt;br /&gt;
== Einsatz eines Relais&#039; zur Umsetzung von Spannungsänderungen ==&lt;br /&gt;
&lt;br /&gt;
a. Ist das Relais wieder im Ausgangszustand, befestigt man nun einen der vom Breadboard führenden Drähte am unteren und einen am mittleren Relaiseingang (im Moment ist die Polarität noch egal). Zunächst sollte nichts passieren (das Relais hält diesen ja Stromkreis noch offen).&lt;br /&gt;
&lt;br /&gt;
b. Startet man aber das Script wieder (&amp;lt;tt&amp;gt;python wandler.py&amp;lt;/tt&amp;gt;) oder klickt auf &#039;Output Pin 1&#039; wird der Nutzstromkreis geschlossen. Nochmals aufgepasst: unser Nutzer erhält wieder die maximal vorgesehene Spannung - also besser vorher im Script &amp;quot;&amp;lt;tt&amp;gt;sleep(0.3)&amp;lt;/tt&amp;gt;&amp;quot; setzen und speichern.&lt;br /&gt;
&lt;br /&gt;
c. Im Prinzip ist damit die programmgesteuerte Umsetzung eines 0/1 Signals in z.B. eine 0V/15V Spannung erreicht.&lt;br /&gt;
&lt;br /&gt;
d. Da wir bald verschiedene Steuerspannungen schalten wollen, geht es jetzt darum herauszufinden, bei welcher Spannung unser Nutzgerät gerade noch bewegt wird. Dies probiert man aus - mit dem kleinsten Widerstand beginnend: indem einer der Drähte in eine freie Breadboardspalte gesteckt wird und aus dieser Spalte der Widerstand zu dem &#039;alten&#039; Steckplatz des Drahtes geführt wird. Nun startet man jeweils das Script bis der Widerstand so hoch ist, dass die Anlaufspannung beim Nutzgerätes gut ausreicht, eine Reaktion des Nutzgerät (Fahrzeug bewegt sich) zu bewirken (z.B. bei 50 Ohm beträgt der Strom ca. 130 mA während ohne 190 mA fliessen).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Ansteuerung von 3 Schaltstufen =&lt;br /&gt;
&lt;br /&gt;
== Kombination von 2 Relais ==&lt;br /&gt;
&lt;br /&gt;
[[Bild:ZrelMww2.png|thumb|right|250px|Beschaltung der Relais]] a. Die einfachste Stufe der weiteren Verschaltung erreicht man, indem der Widerstand mit einem 2. Relais überbrückt wird. Relais 1 kann dann als &#039;Hauptschalter&#039;, Relais 2 als Spannungsumschalter genutzt werden:&lt;br /&gt;
&lt;br /&gt;
b. Diese Beschaltung kann sogleich mit dem PiFace-Emulator ausprobiert werden. Damit können wir bereits 3 Schaltstufen steuern: keine, verminderte und volle Spannung.&lt;br /&gt;
&lt;br /&gt;
c. Theoretisch liesse sich auch noch eine 4. Spannungsstufe erzeugen, da mit 2 &#039;Bits&#039; (Ein/Aus bei 2 Relais) bereits 4 verschiedene Signale darstellbar sind. Beim jetzigen Aufbau werden aber lediglich die (pin1,pin2)-Signale (0,0), (1,0) und (1,1) &#039;genutzt&#039;, da Relais 1 als Hauptschalter vorgesehen ist und die Kombination (0,1) so nicht ausgewertet wird.&lt;br /&gt;
&lt;br /&gt;
== Programmgesteuerte Schaltung von 2 Relais ==&lt;br /&gt;
&lt;br /&gt;
a. Mit einem veränderten python-Script &amp;quot;wandler2.py&amp;quot; ist auch die programmgesteuerte Schaltung möglich. Dabei werden zusätzlich die Tasten 1 und 2 des PiFace genutzt, um nach dem Start des Scripts (&amp;lt;tt&amp;gt;python wandler2.py&amp;lt;/tt&amp;gt;) den Hauptschalter (Relais 1) zu steuern:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler2.py&lt;br /&gt;
 &lt;br /&gt;
 from time import sleep&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
 pfio.init()&lt;br /&gt;
 &lt;br /&gt;
 taste_1=0&lt;br /&gt;
 taste_2=0&lt;br /&gt;
 intervall_a=0.1&lt;br /&gt;
 intervall_b=0.5&lt;br /&gt;
 # Die Intervalle bestimmen die Schaltzeit für volle/verminderte Spannung&lt;br /&gt;
 &lt;br /&gt;
 print &amp;quot;Zum Start Taste 1 drücken, zum Stoppen Taste 2&amp;quot;&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 while taste_1 == 0:&lt;br /&gt;
   sleep(intervall_a)&lt;br /&gt;
   taste_1=pfio.digital_read(1)&lt;br /&gt;
&lt;br /&gt;
 # Der o.g. &#039;sleep&#039;-Befehl bestimmt die Abfragepausen für Taste 1&lt;br /&gt;
 &lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
 print &amp;quot;Strom an!&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 while taste_2 == 0:&lt;br /&gt;
   pfio.digital_write(2,1)&lt;br /&gt;
   sleep(intervall_a)&lt;br /&gt;
   pfio.digital_write(2,0)&lt;br /&gt;
   sleep(intervall_b)&lt;br /&gt;
   taste_2=pfio.digital_read(2)&lt;br /&gt;
 &lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Strom aus!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
b. Falls beim Ausprobieren von Script-Änderungen mal was schief geht, kann das Script stets auch mit der Tastenkombination (CNTRL-C) gestoppt werden. U.U. muss dann noch zusätzlich Relais 1 und/oder 2 via Emulator zurückgesetzt werden.&lt;br /&gt;
&lt;br /&gt;
c. Beim Verändern des Scripts fällt bald auf, dass die bisherige Programmsteuerung keine direkte Möglichkeit vorsieht, auf Ereignisse zu reagieren. Immerhin wird ein mechanisches Gerät gesteuert, bei dem mit Ausfällen, Fertigungstoleranzen, Umwelteinflüssen etc. zu rechnen ist (im Script wird dies bislang &#039;nur&#039; durch die Abbruchbedingung &#039;Taste 2&#039; berücksichtigt).&lt;br /&gt;
&lt;br /&gt;
== Einfache Sensor-Signale als steuernde Elemente eines Programms ==&lt;br /&gt;
&lt;br /&gt;
a. Eine wichtige Anwendung von D/A-Steuerungen ist die mögliche Reaktion dieser Steuerung auf &#039;äußere&#039; Ereignisse, die z.B. mit Hilfe von Sensoren leistbar ist.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Einf_Sens.jpg|thumb|right|250px|einfacher Sensor]]b. Für unsere Zwecke genügt zunächst ein sehr einfacher Sensor, der ein 0- oder 1-Signal liefert und idealerweise direkt am &#039;Input Pin 1&#039; des PiFace angeschlossen werden kann. So liegt beim Input Pin 1 das Signal &#039;1&#039; an, wenn eine Verbindung zu &#039;Input GND&#039; besteht.&lt;br /&gt;
Z.B. können 2 unisolierte Drähte so plaziert werden, dass ein vorbeifahrendes Fahrzeug einen von ihnen genügend bewegt um den Kontakt kurze Zeit zu öffnen. Genau dann liefert dieser &#039;Sensor&#039; das Signal &#039;0&#039;. Eine - die Schwerkraft nutzende - mögliche Bauform ist rechts abgebildet ;-)&lt;br /&gt;
&lt;br /&gt;
c. Natürlich werden zusätzlich 2 isolierte Drähte benötigt, um jeden der beiden offenen Drähte geschützt mit Input Pin 1 und Input GND zu verbinden.&lt;br /&gt;
&lt;br /&gt;
d. Bei jeder Durchfahrt liefert der Sensor nun ein &#039;0&#039;-Signal, was im Script sowohl für eine Zeitmessung als auch für ein &#039;Schaltintervall-Array&#039; genutzt werden kann. Dort können abwechselnd für beide Spannungen Zeiten (die in etwa zum jeweiligen Streckenabschnitt passen) &#039;programmiert&#039; werden. Statt Taste 1 wird nun der Sensor ausgewertet (wobei Taste 1 als Sensor-Ersatz insoweit genutzt werden kann, dass sie gedrückt bleiben bzw. kurz losgelassen werden muss). Zur genaueren Zeitmessung wird noch das modul &#039;clock&#039; benötigt. &amp;quot;&amp;lt;tt&amp;gt;wandler3.py&amp;lt;/tt&amp;gt;&amp;quot; könnte also so aussehen:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler3.py&lt;br /&gt;
 &lt;br /&gt;
 from time import clock&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
 sensor_1=1&lt;br /&gt;
 sensor_2=0&lt;br /&gt;
 rundenzahl=0&lt;br /&gt;
 v_wechsel=0&lt;br /&gt;
 vorrunde=0&lt;br /&gt;
 index_zaehler=1&lt;br /&gt;
 &lt;br /&gt;
 zeit_array=[0,0.2,0.4,0.2,0.4,0.2,0.4,0.2,5,0.2,6]&lt;br /&gt;
 # dieses array enthält die sek. bis zum Spannungswechsel&lt;br /&gt;
&lt;br /&gt;
 array_laenge=9&lt;br /&gt;
 # legt fest, wie viel Werte des arrays genutzt werden sollen&lt;br /&gt;
 &lt;br /&gt;
 sensor_aus=1.3&lt;br /&gt;
 # bis der Sensor sicher in die Ruhestellung kippt, wird er nicht ausgelesen&lt;br /&gt;
  &lt;br /&gt;
 pfio.init()&lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
&lt;br /&gt;
 # das Fahrzeug wird langsam zum Start (=Sensor) bewegt&lt;br /&gt;
 while sensor_1 == 1 :&lt;br /&gt;
   sensor_1=pfio.digital_read(1)&lt;br /&gt;
  &lt;br /&gt;
 print &amp;quot;fliegender Start... zum Beenden Taste 2 drücken&amp;quot;&lt;br /&gt;
 print &amp;quot;Runde Nr., Ges.Zeit, Rundenzeit, mittlere Rundenzeit&amp;quot;&lt;br /&gt;
 start_zeit=clock()&lt;br /&gt;
 runden_start=start_zeit&lt;br /&gt;
  &lt;br /&gt;
 while sensor_2 == 0 :&lt;br /&gt;
   sensor_2=pfio.digital_read(2)&lt;br /&gt;
   v_wechsel=1-v_wechsel&lt;br /&gt;
   pfio.digital_write(2,v_wechsel)&lt;br /&gt;
   sensor_zeit=clock()&lt;br /&gt;
  &lt;br /&gt;
   while zeit_array[index_zaehler]+sensor_zeit &amp;gt; clock() :&lt;br /&gt;
     if runden_start+sensor_aus &amp;lt; clock() :&lt;br /&gt;
 &lt;br /&gt;
       sensor_1=pfio.digital_read(1) &lt;br /&gt;
       if sensor_1 == 0 :&lt;br /&gt;
         rundenzahl=rundenzahl+1&lt;br /&gt;
         runden_start=clock()&lt;br /&gt;
         zeit=runden_start-start_zeit&lt;br /&gt;
         print rundenzahl, zeit, zeit-vorrunde, zeit/rundenzahl&lt;br /&gt;
         vorrunde=zeit&lt;br /&gt;
         sensor_zeit=0&lt;br /&gt;
         index_zaehler=0&lt;br /&gt;
         v_wechsel=0&lt;br /&gt;
  &lt;br /&gt;
   index_zaehler=index_zaehler+1&lt;br /&gt;
   if index_zaehler &amp;gt; array_laenge :&lt;br /&gt;
     sensor_2=1&lt;br /&gt;
     print &amp;quot;array-Ende erreicht!&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Outp 1 &amp;amp; 2 auf 0!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wird das Array-Ende erreicht, wurden entweder zu wenige Einträge vorgesehen oder es befindet sich kein Fahrzeug (mehr) auf der Strecke, das den Sensor und damit des Zurücksetzen des Arrays auslösen konnte.&lt;br /&gt;
&lt;br /&gt;
e. Das Array ist an die jeweilige Strecke anzupassen, wobei der vorderste Eintrag ungenutzt bleibt und dann mit der Dauer für maximale Spannung begonnen wird. Solange man mit Relais arbeitet, sollten die Schaltzeiten nicht zu kurz sein (&amp;gt;0.1 sek), da diese eine gewisse mechanische Trägheit besitzen.&lt;br /&gt;
&lt;br /&gt;
f. Eben diese mechanische Beschaffenheit der Relais (Verschleiß) ist auch ein guter Grund, auf &#039;volle&#039; digitale Signalumwandlung umzustellen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Optokoppler als Ersatz für Relais =&lt;br /&gt;
&lt;br /&gt;
Ähnlich wie ein Relais dient ein [[Optokoppler]] dazu, eine Signalübertragung zwischen zwei getrennten Stromkreisen zu ermöglichen. Bei diesem Projekt liegt der Einsatz von Optokopplern nahe, da sie schneller schalten und keine beweglichen Teile besitzen. Für unsere Zwecke benötigen wir nun als zusätzliche Elemente: Optokoppler (CNY 17-4), npn-[[Transistor]]en (BC 337-40) zur Signalverstärkung sowie einige Widerstände im Bereich von 2k und 400 Ohm. &lt;br /&gt;
&lt;br /&gt;
== Kaskadierung von Transistoren zur Signalverstärkung ==&lt;br /&gt;
&lt;br /&gt;
a. Entsprechend Schritt 2.4.d. (ein Relais bei 50 Ohm) wird zunächst ein [[Optokoppler]] eingesetzt, dessen Signal durch einen Transistor verstärkt wird, um die &#039;Grundspannung&#039; zu schalten (Pin 3 und 6 beim Optokoppler sollten unbeschaltet bleiben, allein der &#039;Lichtstrom&#039; reicht für eine Ansteuerung aus):&lt;br /&gt;
&lt;br /&gt;
[[Bild:PiF_CNY_BC_1.png|400px|Optokoppler mit Transistor]]&lt;br /&gt;
&lt;br /&gt;
b. Da immer mit einer gewissen Toleranz bei allen Komponenten zu rechnen ist, kann es sein, dass u.U. die Widerstände etwas größer oder kleiner gewählt werden müssen. Beim Ausprobieren sollte man hier in 10% Schritten variieren.&lt;br /&gt;
&lt;br /&gt;
c. Bei Austesten mit Emulator oder Script ist auch zu beachten, dass nun &#039;Output Pin 8&#039; genutzt wird, da dieser nicht mit den Relais verschaltet ist.&lt;br /&gt;
&lt;br /&gt;
== Umsetzung von 3 Schaltstufen mit Optokopplern ==&lt;br /&gt;
&lt;br /&gt;
a. Entsprechend dem Vorgehen beim Relais kann nun auch der kleine Widerstand zusätzlich beschaltet werden um seine gesteuerte Überbrückung zu ermöglichen. Da hier eine relativ geringe Spannung aufgeschaltet wird, kann zu Beginn eine Diode eingesetzt werden, die die Schaltstufe &#039;maximale Spannung&#039; anzeigt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:SmPiFu2ou2T.png|400px|Kombination von 2 Optokopplern]]&lt;br /&gt;
&lt;br /&gt;
b. Vor dem Testen ist wieder zu beachten, dass nun zusätzlich &#039;Output Pin 7&#039; genutzt wird (statt Output Pin 2).&lt;br /&gt;
&lt;br /&gt;
c. Eine mögliche Realisierung sieht so aus:[http://youtu.be/xQ7N-PrIULk].&lt;br /&gt;
&lt;br /&gt;
== Zusätzliche Erhöhung der Schaltstufen bei D/A-Wandlern ==&lt;br /&gt;
&lt;br /&gt;
a. Zwar benötigen wir in unserem speziellen Beispiel eine &#039;Grundspannung&#039;, die sich dahingehend auswirkt, dass - wie unter 3.1.c. erwähnt - eine Signalkombination nicht ausgewertet wird, aber mit jeder weiteren Schaltstufe würde sich dieses Problem (theoretisch) relativieren, da bei geschickter Auswahl der Widerstände (z.B. im Verhältnis 1 zu 2) jeweils eine Verdoppelung der Kombinationsmöglichkeiten erreichbar ist.&lt;br /&gt;
&lt;br /&gt;
b. Wird hier der 50 Ohm Widerstand asymmetrisch geteilt (z.B. 15 + 35 Ohm, s.a. [[Spannungsteiler]]) um dort ein weiteres Signal umsetzen zu können, ergeben sich direkt folgende 5 Schaltstufen (aus, 50, 35, 15 und 0 Ohm) u.s.w.:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Sm3ou3t2.png|400px|Erhöhung der Schaltstufen]]&lt;br /&gt;
&lt;br /&gt;
c. Zur Ansteuerung dieser Schaltstufen wäre das Script so zu ändern, dass nun zwischen mehr als 2 Stufen gewechselt werden kann und im Array entsprechende Zusatzdaten vorgegeben und ausgelesen werden. Mehr als diese Stufen sind im konkreten Fall aber nicht sinnvoll, da die entstehende Verlustleistung in der Schaltung die maximal verfügbare Leistung reduziert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Weiterführende Ideen =&lt;br /&gt;
&lt;br /&gt;
Die Ausbaumöglichkeiten dieses Projektes sind vielfältig:&lt;br /&gt;
&lt;br /&gt;
== Hardwareseitige Ausbauvarianten ==&lt;br /&gt;
&lt;br /&gt;
- beispielhafte Umsetzung einer differenzierten Abstufung mittels mittels einer logarithmischen Einteilung oder eines möglichst oft durch 2 teilbaren Anfangswertes und der Teiler (640 Ohm, 320, 160...);&lt;br /&gt;
&lt;br /&gt;
- Nachbau des Projekts mit einem Microcontroller (ggf. mit LCD-Anzeige);&lt;br /&gt;
&lt;br /&gt;
- Umbau der Steuerung mit dem Ziel, sie direkt an die GPIO-Pins des RPi anzuschließen;&lt;br /&gt;
&lt;br /&gt;
- Ergänzung um eine Sensorik, die in diesem Beispiel eine Rückmeldung liefert, ob ein Verbraucher aktiv ist oder nicht (Fahrzeug noch auf der Strecke?);&lt;br /&gt;
&lt;br /&gt;
- Einsatz anderer Sensortechniken und/oder mehrerer Sensoren zur Optimierung der Schnelligkeit oder parallelen Steuerung eines 2. Fahrzeuges;&lt;br /&gt;
&lt;br /&gt;
== Softwareseitige Ausbauvarianten ==&lt;br /&gt;
&lt;br /&gt;
- Optimierung des Scripts, indem die Sensor-Abfrage über einen &#039;Listener&#039; umgesetzt wird;&lt;br /&gt;
&lt;br /&gt;
- Erweiterung des Scripts um eine GUI mit Hilfe der python-lib Tkinter, um einen Nutzerzugriff auf das Steuerarray und/oder eine &#039;Verwaltung&#039; mehrerer Fahrzeuge;&lt;br /&gt;
&lt;br /&gt;
- Einbindung eines Web-Interface um eine &#039;Fernsteuerung&#039; zu ermöglichen...&lt;br /&gt;
&lt;br /&gt;
...in jedem Fall: viel Spass beim Basteln!&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [http://hackaday.com/2013/01/23/replacement-controllers-for-slot-car-racing/ ähnliches Projekt bei &#039;hackaday&#039;] &lt;br /&gt;
* [https://docs.google.com/folder/d/0B-UAZ9CyJCLGQjJ3RDlqa2pqaDg/edit?pli=1&amp;amp;docId=0B-UAZ9CyJCLGNmpMeVpyYlZJUWc Relaisschaltung mit pädagogischer Erweiterung d. Universität Manchester]&lt;br /&gt;
* [http://elinux.org/RPi_Projects/PiFace_controlling_a_slot-car parallele englischsp. Dokumentation dieses Projekts mit anderem Schwerpunkt] &lt;br /&gt;
* [http://elinux.org/RPi_Projects englischsp. Projektliste zum RPi]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Raspberry Pi]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Mknot9</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=RPi_als_D/A-Wandler&amp;diff=74127</id>
		<title>RPi als D/A-Wandler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=RPi_als_D/A-Wandler&amp;diff=74127"/>
		<updated>2013-03-07T20:41:20Z</updated>

		<summary type="html">&lt;p&gt;Mknot9: /* Softwareseitige Ausbauvarianten */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von mknot9&#039;&#039; (in Arbeit)&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
Oft wird ein Computer &#039;nur&#039; genutzt um darauf Software ablaufen zu lassen. Dessen Möglichkeit zur Steuerung von elektrischen und mechanischen Geräten wird dabei leicht übersehen.&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel richtet sich daher an Einsteiger, die mit dem [[Raspberry Pi]] (&#039;RPi&#039;) Grundlagen der Computersteuerung mit Relais und [[Spannungsteiler]]n nachvollziehen möchten. Es wird schrittweise dargestellt, wie mittels eines D/A-Wandlers (Digital/Analog-Wandler = Umwandlung von digitalen 1/0 Signale) die Steuerung einer stufenweise veränderbaren Ausgangsspannung aufgebaut werden kann.&lt;br /&gt;
&lt;br /&gt;
= Verwendete Hardware =&lt;br /&gt;
&lt;br /&gt;
== RPi in Kombination mit der &#039;PiFace&#039;-Karte als Bastelplattform ==&lt;br /&gt;
&lt;br /&gt;
Dank der einfachen Bauweise bietet sich der RPi mit seinen frei zugänglichen GPIO-Pins als ideale Bastelplattform an. Trotzdem kann es beim anfänglichen Experimentieren mit Schaltungen öfters zu kleinen Fehlern kommen, die schlimmstenfalls die empfindliche Elektronik des RPi dauerhaft beschädigen können.&lt;br /&gt;
&lt;br /&gt;
Daher wird bei diesem Projekt zusätzlich mit der &#039;PiFace[http://elinux.org/RPi_Expansion_Boards#Piface]&#039;-Karte gearbeitet, die man auf die GPIO-Pins stecken kann. Diese Erweiterungskarte verschaltet die GPIO-Pins auf je 8 digitale Ein- und Ausgänge sowie 2 Relais, die eine galvanische Trennung von Stromkreisen ermöglichen. Damit besteht auch für Einsteiger ein gewisser Schutz für die Steuerelektronik des RPi.&lt;br /&gt;
&lt;br /&gt;
Auch im weiteren Verlauf dieser Einführung soll noch auf eine Trennung der Stromkreise Wert gelegt werden, so dass für erste digitale Schaltexperimente ein Optokoppler genutzt wird. Die spätere Nutzung der &#039;Input Pins&#039; des PiFace um eine Steuerung der D/A-Wandlung durch bestimmte Ereignisse zu ermöglichen, erfolgt ebenfalls passiv.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Auch wenn mit vermeindlich &#039;sicheren&#039; Transformatoren gebastelt wird, muss stets bedacht werden, dass diese an einem 230V-Stromnetz betrieben werden und man eher einmal mehr als weniger prüfen sollte, ob man durch eventuelle Fehler mit lebensgefährlicher Spannung in Berührung kommt!&lt;br /&gt;
&lt;br /&gt;
== Auswahl eines Beispielprojektes ==&lt;br /&gt;
&lt;br /&gt;
Günstige Möglichkeiten ein Gerät zu finden, das mit analogen Spannungen arbeitet, bieten sich u.a. im Spielzeugbereich. Im Grunde eignet sich alles, was mit Batterien oder mit Gleichspannungen unter 24 V betrieben wird.&lt;br /&gt;
&lt;br /&gt;
Da jedoch ein Ziel das Steuern von analogen Spannungen ist, bietet sich insbesondere alles an, bei dem [[Potentiometer]] eingesetzt werden. Einen dieser &#039;Handregler&#039; sollte man übrig haben, da er von seinem Anschlusskabel abgetrennt werden muss, um den oft proprietären Steckanschluss nutzen zu können. In diesem Sinne wird hier eine handelsübliche Spielzeug-Autorennbahn mit Potentiometer-Handreglern genutzt.&lt;br /&gt;
&lt;br /&gt;
== Sonstige Bauteile ==&lt;br /&gt;
&lt;br /&gt;
Für die ersten Grundlagen (s. Teile 2 &amp;amp; 3) genügen bereits rund 2 m isolierter Draht, der nicht aus verdrillten feinen Adern (Litze) bestehen sollte, 50 cm nicht-isolierter Draht, einige niederohmige Widerstände (z.B. je 2 mal 100 Ohm, 80, 60, sowie 20) und ein &#039;Experimentierbrett&#039; (engl. [[Breadboard]]).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Grundlagen und Vorbereitung des Projekts =&lt;br /&gt;
&lt;br /&gt;
== Umwandlung von 1/0 zu Ein/Aus mit einem Relais ==&lt;br /&gt;
&lt;br /&gt;
Vom Prinzip her ist jede Umwandlung eines digitalen 0 oder 1 Signals (das über eine bestimmte Spannungsdifferenz festgelegt ist) in eine (nutzbare) Spannung bereits eine D/A-Wandlung. Dies wird schlicht so realisiert, dass mit einer Eingabe am RPi die Nutzspannung des &#039;Verbrauchers&#039; zunächst einfach an- und ausgeschaltet wird.&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung der zu steuernden Hardware ==&lt;br /&gt;
&lt;br /&gt;
a. Um Fehlerquellen auszuschliessen sollte zunächst (und ggf. auch später!) kurz getestet werden, ob der vorhandene Regler wie erwartet funktioniert.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pif_Con9.jpg|thumb|right|400px|Fixierung der Reglerkabel]]&lt;br /&gt;
b. Nach dem Trennen des Reglers von der Einspeisung (und ggf. Ziehen des Netzsteckers) muss das Regler-Kabel abgeschnitten werden (eher nahe beim Regler, da das Kabel bald bis zum Breadboard reichen soll). Die neuen Enden des Einspeiseteils werden abisoliert und auf dem Breadboard diagonal zueinander mit einigen Spalten Abstand fixiert. Auch können bereits die Drähte, die später zum RPi führen, jeweils in den passenden kontaktführenden Spalten eingesteckt werden, z. B. wie rechts zu sehen (die nicht beschrifteten Drähte können vorerst ignoriert werden):&lt;br /&gt;
&lt;br /&gt;
c. Nun bietet sich eine gute Gelegenheit die maximale Spannung am Nutzgerät zu messen. Man verbindet das Regler-Kabel (nun ohne Regler) wieder mit der Einspeisung und die offenen Enden der Drähte mit dem Messgerät, bei dem zunächst ein Messbereich von ca. 10-50 Volt gewählt werden sollte. Dies sollte dann z.B. 14,8 V anzeigen. Natürlich können auch die beiden offenen Enden einen kleinen Moment kurz geschlossen werden, man sollte aber bedenken, dass das zu regelnde Nutzgerät dann die maximal vorgesehene Spannung erhält (hier: maximales Tempo).&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung des RPi ==&lt;br /&gt;
&lt;br /&gt;
Es wird davon ausgegangen, dass entsprechend des zugehörigen &#039;manual&#039; das PiFace bereits auf den RPi gesteckt ist, die nötigen python-Bilbliotheken installiert sind und man sich im Terminal-Arbeitsverzeichnis &#039;pi&#039; befindet.&lt;br /&gt;
&lt;br /&gt;
a. Zunächst wird der PiFace-Emulator (im Terminal direkt aus dem Arbeitsverzeichnis) gestartet: &amp;lt;tt&amp;gt;piface/scripts/piface-emulator&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b. Wenn alles richtig installiert wurde, erscheint ein Fenster (unten links), bei dem die vorerst wichtigen blauen Signale am rechten Rand wie folgt angezeigt werden sollten: &lt;br /&gt;
 &lt;br /&gt;
[[Datei:RPi_PiF_em-scs.jpg|400px|Piface-Emulator im default-Zustand]] [[Datei:RPi_PiF_em_scs1.jpg|400px|Piface-Relais 1 auf &#039;1&#039; geschaltet]]&lt;br /&gt;
&lt;br /&gt;
c. Das rechte Fenster ergibt sich, wenn man nun im Fenster auf &amp;quot;Override Enable&amp;quot; und dann &amp;quot;Output Pin 1&amp;quot; klickt. Es müsste ein &amp;quot;Klack&amp;quot; vom Relais 1 zu hören sein sowie der Schaltzustand des unteren Relais 1 (das an den Output Pin 1 gekoppelt ist) auf die Verbindung der beiden unteren Anschlüsse wechseln. Zugleich wird das erste LED-Icon beim Output Pin 1 rot sowie das zugehörige LED-Icon blau.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pif_rel2.png|thumb|right|250px|Schema der Piface-Relais]]&lt;br /&gt;
d. Rechts ist der Schaltzustand der Relais, die zu Beginn genutzt werden, im Grundzustand dargestellt (jeweils der mittlere und obere Kontakt sind kurzgeschlossen, der jeweils untere Kontakt ist frei):&lt;br /&gt;
&lt;br /&gt;
e. Ein weiterer Klick auf &amp;quot;Output Pin 1&amp;quot; versetzt das Relais in den Ausgangszustand, der vor dem nächsten Schritt wieder eingestellt werden sollte.&lt;br /&gt;
&lt;br /&gt;
f. Das Relais läßt sich auch mittel eines Python-Scripts vom RPi aus ansteuern. Dazu wird folgende Textdatei &amp;quot;wandler.py&amp;quot; im Arbeitsverzeichnis abgespeichert und mit dem Befehl &amp;quot;&amp;lt;tt&amp;gt;python wandler.py&amp;lt;/tt&amp;gt;&amp;quot; gestartet:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler.py&lt;br /&gt;
&lt;br /&gt;
 from time import sleep&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
&lt;br /&gt;
 pfio.init()&lt;br /&gt;
&lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
 print &amp;quot;Strom an&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 sleep(2)&lt;br /&gt;
&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Strom aus&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Nach dem Absetzen des Befehls wechselt nun das blaue Signal an Relais 1 für 2 Sekunden und das Relais klackt entsprechend.&lt;br /&gt;
&lt;br /&gt;
== Einsatz eines Relais&#039; zur Umsetzung von Spannungsänderungen ==&lt;br /&gt;
&lt;br /&gt;
a. Ist das Relais wieder im Ausgangszustand, befestigt man nun einen der vom Breadboard führenden Drähte am unteren und einen am mittleren Relaiseingang (im Moment ist die Polarität noch egal). Zunächst sollte nichts passieren (das Relais hält diesen ja Stromkreis noch offen).&lt;br /&gt;
&lt;br /&gt;
b. Startet man aber das Script wieder (&amp;lt;tt&amp;gt;python wandler.py&amp;lt;/tt&amp;gt;) oder klickt auf &#039;Output Pin 1&#039; wird der Nutzstromkreis geschlossen. Nochmals aufgepasst: unser Nutzer erhält wieder die maximal vorgesehene Spannung - also besser vorher im Script &amp;quot;&amp;lt;tt&amp;gt;sleep(0.3)&amp;lt;/tt&amp;gt;&amp;quot; setzen und speichern.&lt;br /&gt;
&lt;br /&gt;
c. Im Prinzip ist damit die programmgesteuerte Umsetzung eines 0/1 Signals in z.B. eine 0V/15V Spannung erreicht.&lt;br /&gt;
&lt;br /&gt;
d. Da wir bald verschiedene Steuerspannungen schalten wollen, geht es jetzt darum herauszufinden, bei welcher Spannung unser Nutzgerät gerade noch bewegt wird. Dies probiert man aus - mit dem kleinsten Widerstand beginnend: indem einer der Drähte in eine freie Breadboardspalte gesteckt wird und aus dieser Spalte der Widerstand zu dem &#039;alten&#039; Steckplatz des Drahtes geführt wird. Nun startet man jeweils das Script bis der Widerstand so hoch ist, dass die Anlaufspannung beim Nutzgerätes gut ausreicht, eine Reaktion des Nutzgerät (Fahrzeug bewegt sich) zu bewirken (z.B. bei 50 Ohm beträgt der Strom ca. 130 mA während ohne 190 mA fliessen).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Ansteuerung von 3 Schaltstufen =&lt;br /&gt;
&lt;br /&gt;
== Kombination von 2 Relais ==&lt;br /&gt;
&lt;br /&gt;
[[Bild:ZrelMww2.png|thumb|right|250px|Beschaltung der Relais]] a. Die einfachste Stufe der weiteren Verschaltung erreicht man, indem der Widerstand mit einem 2. Relais überbrückt wird. Relais 1 kann dann als &#039;Hauptschalter&#039;, Relais 2 als Spannungsumschalter genutzt werden:&lt;br /&gt;
&lt;br /&gt;
b. Diese Beschaltung kann sogleich mit dem PiFace-Emulator ausprobiert werden. Damit können wir bereits 3 Schaltstufen steuern: keine, verminderte und volle Spannung.&lt;br /&gt;
&lt;br /&gt;
c. Theoretisch liesse sich auch noch eine 4. Spannungsstufe erzeugen, da mit 2 &#039;Bits&#039; (Ein/Aus bei 2 Relais) bereits 4 verschiedene Signale darstellbar sind. Beim jetzigen Aufbau werden aber lediglich die (pin1,pin2)-Signale (0,0), (1,0) und (1,1) &#039;genutzt&#039;, da Relais 1 als Hauptschalter vorgesehen ist und die Kombination (0,1) so nicht ausgewertet wird.&lt;br /&gt;
&lt;br /&gt;
== Programmgesteuerte Schaltung von 2 Relais ==&lt;br /&gt;
&lt;br /&gt;
a. Mit einem veränderten python-Script &amp;quot;wandler2.py&amp;quot; ist auch die programmgesteuerte Schaltung möglich. Dabei werden zusätzlich die Tasten 1 und 2 des PiFace genutzt, um nach dem Start des Scripts (&amp;lt;tt&amp;gt;python wandler2.py&amp;lt;/tt&amp;gt;) den Hauptschalter (Relais 1) zu steuern:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler2.py&lt;br /&gt;
 &lt;br /&gt;
 from time import sleep&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
 pfio.init()&lt;br /&gt;
 &lt;br /&gt;
 taste_1=0&lt;br /&gt;
 taste_2=0&lt;br /&gt;
 intervall_a=0.1&lt;br /&gt;
 intervall_b=0.5&lt;br /&gt;
 # Die Intervalle bestimmen die Schaltzeit für volle/verminderte Spannung&lt;br /&gt;
 &lt;br /&gt;
 print &amp;quot;Zum Start Taste 1 drücken, zum Stoppen Taste 2&amp;quot;&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 while taste_1 == 0:&lt;br /&gt;
   sleep(intervall_a)&lt;br /&gt;
   taste_1=pfio.digital_read(1)&lt;br /&gt;
&lt;br /&gt;
 # Der o.g. &#039;sleep&#039;-Befehl bestimmt die Abfragepausen für Taste 1&lt;br /&gt;
 &lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
 print &amp;quot;Strom an!&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 while taste_2 == 0:&lt;br /&gt;
   pfio.digital_write(2,1)&lt;br /&gt;
   sleep(intervall_a)&lt;br /&gt;
   pfio.digital_write(2,0)&lt;br /&gt;
   sleep(intervall_b)&lt;br /&gt;
   taste_2=pfio.digital_read(2)&lt;br /&gt;
 &lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Strom aus!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
b. Falls beim Ausprobieren von Script-Änderungen mal was schief geht, kann das Script stets auch mit der Tastenkombination (CNTRL-C) gestoppt werden. U.U. muss dann noch zusätzlich Relais 1 und/oder 2 via Emulator zurückgesetzt werden.&lt;br /&gt;
&lt;br /&gt;
c. Beim Verändern des Scripts fällt bald auf, dass die bisherige Programmsteuerung keine direkte Möglichkeit vorsieht, auf Ereignisse zu reagieren. Immerhin wird ein mechanisches Gerät gesteuert, bei dem mit Ausfällen, Fertigungstoleranzen, Umwelteinflüssen etc. zu rechnen ist (im Script wird dies bislang &#039;nur&#039; durch die Abbruchbedingung &#039;Taste 2&#039; berücksichtigt).&lt;br /&gt;
&lt;br /&gt;
== Einfache Sensor-Signale als steuernde Elemente eines Programms ==&lt;br /&gt;
&lt;br /&gt;
a. Eine wichtige Anwendung von D/A-Steuerungen ist die mögliche Reaktion dieser Steuerung auf &#039;äußere&#039; Ereignisse, die z.B. mit Hilfe von Sensoren leistbar ist.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Einf_Sens.jpg|thumb|right|250px|einfacher Sensor]]b. Für unsere Zwecke genügt zunächst ein sehr einfacher Sensor, der ein 0- oder 1-Signal liefert und idealerweise direkt am &#039;Input Pin 1&#039; des PiFace angeschlossen werden kann. So liegt beim Input Pin 1 das Signal &#039;1&#039; an, wenn eine Verbindung zu &#039;Input GND&#039; besteht.&lt;br /&gt;
Z.B. können 2 unisolierte Drähte so plaziert werden, dass ein vorbeifahrendes Fahrzeug einen von ihnen genügend bewegt um den Kontakt kurze Zeit zu öffnen. Genau dann liefert dieser &#039;Sensor&#039; das Signal &#039;0&#039;. Eine - die Schwerkraft nutzende - mögliche Bauform ist rechts abgebildet ;-)&lt;br /&gt;
&lt;br /&gt;
c. Natürlich werden zusätzlich 2 isolierte Drähte benötigt, um jeden der beiden offenen Drähte geschützt mit Input Pin 1 und Input GND zu verbinden.&lt;br /&gt;
&lt;br /&gt;
d. Bei jeder Durchfahrt liefert der Sensor nun ein &#039;0&#039;-Signal, was im Script sowohl für eine Zeitmessung als auch für ein &#039;Schaltintervall-Array&#039; genutzt werden kann. Dort können abwechselnd für beide Spannungen Zeiten (die in etwa zum jeweiligen Streckenabschnitt passen) &#039;programmiert&#039; werden. Statt Taste 1 wird nun der Sensor ausgewertet (wobei Taste 1 als Sensor-Ersatz insoweit genutzt werden kann, dass sie gedrückt bleiben bzw. kurz losgelassen werden muss). Zur genaueren Zeitmessung wird noch das modul &#039;clock&#039; benötigt. &amp;quot;&amp;lt;tt&amp;gt;wandler3.py&amp;lt;/tt&amp;gt;&amp;quot; könnte also so aussehen:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler3.py&lt;br /&gt;
 &lt;br /&gt;
 from time import clock&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
 sensor_1=1&lt;br /&gt;
 sensor_2=0&lt;br /&gt;
 rundenzahl=0&lt;br /&gt;
 v_wechsel=0&lt;br /&gt;
 vorrunde=0&lt;br /&gt;
 index_zaehler=1&lt;br /&gt;
 &lt;br /&gt;
 zeit_array=[0,0.2,0.4,0.2,0.4,0.2,0.4,0.2,5,0.2,6]&lt;br /&gt;
 # dieses array enthält die sek. bis zum Spannungswechsel&lt;br /&gt;
&lt;br /&gt;
 array_laenge=9&lt;br /&gt;
 # legt fest, wie viel Werte des arrays genutzt werden sollen&lt;br /&gt;
 &lt;br /&gt;
 sensor_aus=1.3&lt;br /&gt;
 # bis der Sensor sicher in die Ruhestellung kippt, wird er nicht ausgelesen&lt;br /&gt;
  &lt;br /&gt;
 pfio.init()&lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
&lt;br /&gt;
 # das Fahrzeug wird langsam zum Start (=Sensor) bewegt&lt;br /&gt;
 while sensor_1 == 1 :&lt;br /&gt;
   sensor_1=pfio.digital_read(1)&lt;br /&gt;
  &lt;br /&gt;
 print &amp;quot;fliegender Start... zum Beenden Taste 2 drücken&amp;quot;&lt;br /&gt;
 print &amp;quot;Runde Nr., Ges.Zeit, Rundenzeit, mittlere Rundenzeit&amp;quot;&lt;br /&gt;
 start_zeit=clock()&lt;br /&gt;
 runden_start=start_zeit&lt;br /&gt;
  &lt;br /&gt;
 while sensor_2 == 0 :&lt;br /&gt;
   sensor_2=pfio.digital_read(2)&lt;br /&gt;
   v_wechsel=1-v_wechsel&lt;br /&gt;
   pfio.digital_write(2,v_wechsel)&lt;br /&gt;
   sensor_zeit=clock()&lt;br /&gt;
  &lt;br /&gt;
   while zeit_array[index_zaehler]+sensor_zeit &amp;gt; clock() :&lt;br /&gt;
     if runden_start+sensor_aus &amp;lt; clock() :&lt;br /&gt;
 &lt;br /&gt;
       sensor_1=pfio.digital_read(1) &lt;br /&gt;
       if sensor_1 == 0 :&lt;br /&gt;
         rundenzahl=rundenzahl+1&lt;br /&gt;
         runden_start=clock()&lt;br /&gt;
         zeit=runden_start-start_zeit&lt;br /&gt;
         print rundenzahl, zeit, zeit-vorrunde, zeit/rundenzahl&lt;br /&gt;
         vorrunde=zeit&lt;br /&gt;
         sensor_zeit=0&lt;br /&gt;
         index_zaehler=0&lt;br /&gt;
         v_wechsel=0&lt;br /&gt;
  &lt;br /&gt;
   index_zaehler=index_zaehler+1&lt;br /&gt;
   if index_zaehler &amp;gt; array_laenge :&lt;br /&gt;
     sensor_2=1&lt;br /&gt;
     print &amp;quot;array-Ende erreicht!&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Outp 1 &amp;amp; 2 auf 0!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wird das Array-Ende erreicht, wurden entweder zu wenige Einträge vorgesehen oder es befindet sich kein Fahrzeug (mehr) auf der Strecke, das den Sensor und damit des Zurücksetzen des Arrays auslösen konnte.&lt;br /&gt;
&lt;br /&gt;
e. Das Array ist an die jeweilige Strecke anzupassen, wobei der vorderste Eintrag ungenutzt bleibt und dann mit der Dauer für maximale Spannung begonnen wird. Solange man mit Relais arbeitet, sollten die Schaltzeiten nicht zu kurz sein (&amp;gt;0.1 sek), da diese eine gewisse mechanische Trägheit besitzen.&lt;br /&gt;
&lt;br /&gt;
f. Eben diese mechanische Beschaffenheit der Relais (Verschleiß) ist auch ein guter Grund, auf &#039;volle&#039; digitale Signalumwandlung umzustellen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Optokoppler als Ersatz für Relais =&lt;br /&gt;
&lt;br /&gt;
Ähnlich wie ein Relais dient ein [[Optokoppler]] dazu, eine Signalübertragung zwischen zwei getrennten Stromkreisen zu ermöglichen. Bei diesem Projekt liegt der Einsatz von Optokopplern nahe, da sie schneller schalten und keine beweglichen Teile besitzen. Für unsere Zwecke benötigen wir nun als zusätzliche Elemente: Optokoppler (CNY 17-4), npn-[[Transistor]]en (BC 337-40) zur Signalverstärkung sowie einige Widerstände im Bereich von 2k und 400 Ohm. &lt;br /&gt;
&lt;br /&gt;
== Kaskadierung von Transistoren zur Signalverstärkung ==&lt;br /&gt;
&lt;br /&gt;
a. Entsprechend Schritt 2.4.d. (ein Relais bei 50 Ohm) wird zunächst ein [[Optokoppler]] eingesetzt, dessen Signal durch einen Transistor verstärkt wird, um die &#039;Grundspannung&#039; zu schalten (Pin 3 und 6 beim Optokoppler sollten unbeschaltet bleiben, allein der &#039;Lichtstrom&#039; reicht für eine Ansteuerung aus):&lt;br /&gt;
&lt;br /&gt;
[[Bild:PiF_CNY_BC_1.png|400px|Optokoppler mit Transistor]]&lt;br /&gt;
&lt;br /&gt;
b. Da immer mit einer gewissen Toleranz bei allen Komponenten zu rechnen ist, kann es sein, dass u.U. die Widerstände etwas größer oder kleiner gewählt werden müssen. Beim Ausprobieren sollte man hier in 10% Schritten variieren.&lt;br /&gt;
&lt;br /&gt;
c. Bei Austesten mit Emulator oder Script ist auch zu beachten, dass nun &#039;Output Pin 8&#039; genutzt wird, da dieser nicht mit den Relais verschaltet ist.&lt;br /&gt;
&lt;br /&gt;
== Umsetzung von 3 Schaltstufen mit Optokopplern ==&lt;br /&gt;
&lt;br /&gt;
a. Entsprechend dem Vorgehen beim Relais kann nun auch der kleine Widerstand zusätzlich beschaltet werden um seine gesteuerte Überbrückung zu ermöglichen. Da hier eine relativ geringe Spannung aufgeschaltet wird, kann zu Beginn eine Diode eingesetzt werden, die die Schaltstufe &#039;maximale Spannung&#039; anzeigt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:SmPiFu2ou2T.png|400px|Kombination von 2 Optokopplern]]&lt;br /&gt;
&lt;br /&gt;
b. Vor dem Testen ist wieder zu beachten, dass nun zusätzlich &#039;Output Pin 7&#039; genutzt wird (statt Output Pin 2).&lt;br /&gt;
&lt;br /&gt;
c. Eine mögliche Realisierung sieht so aus:[http://youtu.be/xQ7N-PrIULk].&lt;br /&gt;
&lt;br /&gt;
== Zusätzliche Erhöhung der Schaltstufen bei D/A-Wandlern ==&lt;br /&gt;
&lt;br /&gt;
a. Zwar benötigen wir in unserem speziellen Beispiel eine &#039;Grundspannung&#039;, die sich dahingehend auswirkt, dass - wie unter 3.1.c. erwähnt - eine Signalkombination nicht ausgewertet wird, aber mit jeder weiteren Schaltstufe würde sich dieses Problem (theoretisch) relativieren, da bei geschickter Auswahl der Widerstände (z.B. im Verhältnis 1 zu 2) jeweils eine Verdoppelung der Kombinationsmöglichkeiten erreichbar ist.&lt;br /&gt;
&lt;br /&gt;
b. Wird hier der 50 Ohm Widerstand asymmetrisch geteilt (z.B. 15 + 35 Ohm, s.a. [[Spannungsteiler]]) um dort ein weiteres Signal umsetzen zu können, ergeben sich direkt folgende 5 Schaltstufen (aus, 50, 35, 15 und 0 Ohm) u.s.w.:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Sm3ou3t2.png|400px|Erhöhung der Schaltstufen]]&lt;br /&gt;
&lt;br /&gt;
c. Zur Ansteuerung dieser Schaltstufen wäre das Script so zu ändern, dass nun zwischen mehr als 2 Stufen gewechselt werden kann und im Array entsprechende Zusatzdaten vorgegeben und ausgelesen werden. Mehr als diese Stufen sind im konkreten Fall aber nicht sinnvoll, da die entstehende Verlustleistung in der Schaltung die maximal verfügbare Leistung reduziert.&lt;br /&gt;
&lt;br /&gt;
= Weiterführende Ideen =&lt;br /&gt;
&lt;br /&gt;
== Hardwareseitige Ausbauvarianten ==&lt;br /&gt;
&lt;br /&gt;
Die Ausbaumöglichkeiten dieses Projektes sind vielfältig:&lt;br /&gt;
&lt;br /&gt;
- beispielhafte Umsetzung einer differenzierten Abstufung mittels mittels einer logarithmischen Einteilung oder eines möglichst oft durch 2 teilbaren Anfangswertes und der Teiler (640 Ohm, 320, 160...);&lt;br /&gt;
&lt;br /&gt;
- Nachbau des Projekts mit einem Microcontroller (ggf. mit LCD-Anzeige);&lt;br /&gt;
&lt;br /&gt;
- Umbau der Steuerung mit dem Ziel, sie direkt an die GPIO-Pins des RPi anzuschließen;&lt;br /&gt;
&lt;br /&gt;
- Ergänzung um eine Sensorik, die in diesem Beispiel eine Rückmeldung liefert, ob ein Verbraucher aktiv ist oder nicht (Fahrzeug noch auf der Strecke?);&lt;br /&gt;
&lt;br /&gt;
- Einsatz anderer Sensortechniken und/oder mehrerer Sensoren zur Optimierung der Schnelligkeit oder parallelen Steuerung eines 2. Fahrzeuges;&lt;br /&gt;
&lt;br /&gt;
== Softwareseitige Ausbauvarianten ==&lt;br /&gt;
&lt;br /&gt;
- Optimierung des Scripts, indem die Sensor-Abfrage über einen &#039;Listener&#039; umgesetzt wird;&lt;br /&gt;
&lt;br /&gt;
- Erweiterung des Scripts um eine GUI mit Hilfe der python-lib Tkinter, um einen Nutzerzugriff auf das Steuerarray und/oder eine &#039;Verwaltung&#039; mehrerer Fahrzeuge;&lt;br /&gt;
&lt;br /&gt;
- Einbindung eines Web-Interface um eine &#039;Fernsteuerung&#039; zu ermöglichen...&lt;br /&gt;
&lt;br /&gt;
...in jedem Fall: viel Spass beim Basteln!&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [http://hackaday.com/2013/01/23/replacement-controllers-for-slot-car-racing/ ähnliches Projekt bei &#039;hackaday&#039;] &lt;br /&gt;
* [https://docs.google.com/folder/d/0B-UAZ9CyJCLGQjJ3RDlqa2pqaDg/edit?pli=1&amp;amp;docId=0B-UAZ9CyJCLGNmpMeVpyYlZJUWc Relaisschaltung mit pädagogischer Erweiterung d. Universität Manchester]&lt;br /&gt;
* [http://elinux.org/RPi_Projects/PiFace_controlling_a_slot-car parallele englischsp. Dokumentation dieses Projekts mit anderem Schwerpunkt] &lt;br /&gt;
* [http://elinux.org/RPi_Projects englischsp. Projektliste zum RPi]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Raspberry Pi]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Mknot9</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=RPi_als_D/A-Wandler&amp;diff=74126</id>
		<title>RPi als D/A-Wandler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=RPi_als_D/A-Wandler&amp;diff=74126"/>
		<updated>2013-03-07T20:40:04Z</updated>

		<summary type="html">&lt;p&gt;Mknot9: /* Optokoppler als Ersatz für Relais */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von mknot9&#039;&#039; (in Arbeit)&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
Oft wird ein Computer &#039;nur&#039; genutzt um darauf Software ablaufen zu lassen. Dessen Möglichkeit zur Steuerung von elektrischen und mechanischen Geräten wird dabei leicht übersehen.&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel richtet sich daher an Einsteiger, die mit dem [[Raspberry Pi]] (&#039;RPi&#039;) Grundlagen der Computersteuerung mit Relais und [[Spannungsteiler]]n nachvollziehen möchten. Es wird schrittweise dargestellt, wie mittels eines D/A-Wandlers (Digital/Analog-Wandler = Umwandlung von digitalen 1/0 Signale) die Steuerung einer stufenweise veränderbaren Ausgangsspannung aufgebaut werden kann.&lt;br /&gt;
&lt;br /&gt;
= Verwendete Hardware =&lt;br /&gt;
&lt;br /&gt;
== RPi in Kombination mit der &#039;PiFace&#039;-Karte als Bastelplattform ==&lt;br /&gt;
&lt;br /&gt;
Dank der einfachen Bauweise bietet sich der RPi mit seinen frei zugänglichen GPIO-Pins als ideale Bastelplattform an. Trotzdem kann es beim anfänglichen Experimentieren mit Schaltungen öfters zu kleinen Fehlern kommen, die schlimmstenfalls die empfindliche Elektronik des RPi dauerhaft beschädigen können.&lt;br /&gt;
&lt;br /&gt;
Daher wird bei diesem Projekt zusätzlich mit der &#039;PiFace[http://elinux.org/RPi_Expansion_Boards#Piface]&#039;-Karte gearbeitet, die man auf die GPIO-Pins stecken kann. Diese Erweiterungskarte verschaltet die GPIO-Pins auf je 8 digitale Ein- und Ausgänge sowie 2 Relais, die eine galvanische Trennung von Stromkreisen ermöglichen. Damit besteht auch für Einsteiger ein gewisser Schutz für die Steuerelektronik des RPi.&lt;br /&gt;
&lt;br /&gt;
Auch im weiteren Verlauf dieser Einführung soll noch auf eine Trennung der Stromkreise Wert gelegt werden, so dass für erste digitale Schaltexperimente ein Optokoppler genutzt wird. Die spätere Nutzung der &#039;Input Pins&#039; des PiFace um eine Steuerung der D/A-Wandlung durch bestimmte Ereignisse zu ermöglichen, erfolgt ebenfalls passiv.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Auch wenn mit vermeindlich &#039;sicheren&#039; Transformatoren gebastelt wird, muss stets bedacht werden, dass diese an einem 230V-Stromnetz betrieben werden und man eher einmal mehr als weniger prüfen sollte, ob man durch eventuelle Fehler mit lebensgefährlicher Spannung in Berührung kommt!&lt;br /&gt;
&lt;br /&gt;
== Auswahl eines Beispielprojektes ==&lt;br /&gt;
&lt;br /&gt;
Günstige Möglichkeiten ein Gerät zu finden, das mit analogen Spannungen arbeitet, bieten sich u.a. im Spielzeugbereich. Im Grunde eignet sich alles, was mit Batterien oder mit Gleichspannungen unter 24 V betrieben wird.&lt;br /&gt;
&lt;br /&gt;
Da jedoch ein Ziel das Steuern von analogen Spannungen ist, bietet sich insbesondere alles an, bei dem [[Potentiometer]] eingesetzt werden. Einen dieser &#039;Handregler&#039; sollte man übrig haben, da er von seinem Anschlusskabel abgetrennt werden muss, um den oft proprietären Steckanschluss nutzen zu können. In diesem Sinne wird hier eine handelsübliche Spielzeug-Autorennbahn mit Potentiometer-Handreglern genutzt.&lt;br /&gt;
&lt;br /&gt;
== Sonstige Bauteile ==&lt;br /&gt;
&lt;br /&gt;
Für die ersten Grundlagen (s. Teile 2 &amp;amp; 3) genügen bereits rund 2 m isolierter Draht, der nicht aus verdrillten feinen Adern (Litze) bestehen sollte, 50 cm nicht-isolierter Draht, einige niederohmige Widerstände (z.B. je 2 mal 100 Ohm, 80, 60, sowie 20) und ein &#039;Experimentierbrett&#039; (engl. [[Breadboard]]).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Grundlagen und Vorbereitung des Projekts =&lt;br /&gt;
&lt;br /&gt;
== Umwandlung von 1/0 zu Ein/Aus mit einem Relais ==&lt;br /&gt;
&lt;br /&gt;
Vom Prinzip her ist jede Umwandlung eines digitalen 0 oder 1 Signals (das über eine bestimmte Spannungsdifferenz festgelegt ist) in eine (nutzbare) Spannung bereits eine D/A-Wandlung. Dies wird schlicht so realisiert, dass mit einer Eingabe am RPi die Nutzspannung des &#039;Verbrauchers&#039; zunächst einfach an- und ausgeschaltet wird.&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung der zu steuernden Hardware ==&lt;br /&gt;
&lt;br /&gt;
a. Um Fehlerquellen auszuschliessen sollte zunächst (und ggf. auch später!) kurz getestet werden, ob der vorhandene Regler wie erwartet funktioniert.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pif_Con9.jpg|thumb|right|400px|Fixierung der Reglerkabel]]&lt;br /&gt;
b. Nach dem Trennen des Reglers von der Einspeisung (und ggf. Ziehen des Netzsteckers) muss das Regler-Kabel abgeschnitten werden (eher nahe beim Regler, da das Kabel bald bis zum Breadboard reichen soll). Die neuen Enden des Einspeiseteils werden abisoliert und auf dem Breadboard diagonal zueinander mit einigen Spalten Abstand fixiert. Auch können bereits die Drähte, die später zum RPi führen, jeweils in den passenden kontaktführenden Spalten eingesteckt werden, z. B. wie rechts zu sehen (die nicht beschrifteten Drähte können vorerst ignoriert werden):&lt;br /&gt;
&lt;br /&gt;
c. Nun bietet sich eine gute Gelegenheit die maximale Spannung am Nutzgerät zu messen. Man verbindet das Regler-Kabel (nun ohne Regler) wieder mit der Einspeisung und die offenen Enden der Drähte mit dem Messgerät, bei dem zunächst ein Messbereich von ca. 10-50 Volt gewählt werden sollte. Dies sollte dann z.B. 14,8 V anzeigen. Natürlich können auch die beiden offenen Enden einen kleinen Moment kurz geschlossen werden, man sollte aber bedenken, dass das zu regelnde Nutzgerät dann die maximal vorgesehene Spannung erhält (hier: maximales Tempo).&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung des RPi ==&lt;br /&gt;
&lt;br /&gt;
Es wird davon ausgegangen, dass entsprechend des zugehörigen &#039;manual&#039; das PiFace bereits auf den RPi gesteckt ist, die nötigen python-Bilbliotheken installiert sind und man sich im Terminal-Arbeitsverzeichnis &#039;pi&#039; befindet.&lt;br /&gt;
&lt;br /&gt;
a. Zunächst wird der PiFace-Emulator (im Terminal direkt aus dem Arbeitsverzeichnis) gestartet: &amp;lt;tt&amp;gt;piface/scripts/piface-emulator&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b. Wenn alles richtig installiert wurde, erscheint ein Fenster (unten links), bei dem die vorerst wichtigen blauen Signale am rechten Rand wie folgt angezeigt werden sollten: &lt;br /&gt;
 &lt;br /&gt;
[[Datei:RPi_PiF_em-scs.jpg|400px|Piface-Emulator im default-Zustand]] [[Datei:RPi_PiF_em_scs1.jpg|400px|Piface-Relais 1 auf &#039;1&#039; geschaltet]]&lt;br /&gt;
&lt;br /&gt;
c. Das rechte Fenster ergibt sich, wenn man nun im Fenster auf &amp;quot;Override Enable&amp;quot; und dann &amp;quot;Output Pin 1&amp;quot; klickt. Es müsste ein &amp;quot;Klack&amp;quot; vom Relais 1 zu hören sein sowie der Schaltzustand des unteren Relais 1 (das an den Output Pin 1 gekoppelt ist) auf die Verbindung der beiden unteren Anschlüsse wechseln. Zugleich wird das erste LED-Icon beim Output Pin 1 rot sowie das zugehörige LED-Icon blau.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pif_rel2.png|thumb|right|250px|Schema der Piface-Relais]]&lt;br /&gt;
d. Rechts ist der Schaltzustand der Relais, die zu Beginn genutzt werden, im Grundzustand dargestellt (jeweils der mittlere und obere Kontakt sind kurzgeschlossen, der jeweils untere Kontakt ist frei):&lt;br /&gt;
&lt;br /&gt;
e. Ein weiterer Klick auf &amp;quot;Output Pin 1&amp;quot; versetzt das Relais in den Ausgangszustand, der vor dem nächsten Schritt wieder eingestellt werden sollte.&lt;br /&gt;
&lt;br /&gt;
f. Das Relais läßt sich auch mittel eines Python-Scripts vom RPi aus ansteuern. Dazu wird folgende Textdatei &amp;quot;wandler.py&amp;quot; im Arbeitsverzeichnis abgespeichert und mit dem Befehl &amp;quot;&amp;lt;tt&amp;gt;python wandler.py&amp;lt;/tt&amp;gt;&amp;quot; gestartet:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler.py&lt;br /&gt;
&lt;br /&gt;
 from time import sleep&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
&lt;br /&gt;
 pfio.init()&lt;br /&gt;
&lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
 print &amp;quot;Strom an&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 sleep(2)&lt;br /&gt;
&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Strom aus&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Nach dem Absetzen des Befehls wechselt nun das blaue Signal an Relais 1 für 2 Sekunden und das Relais klackt entsprechend.&lt;br /&gt;
&lt;br /&gt;
== Einsatz eines Relais&#039; zur Umsetzung von Spannungsänderungen ==&lt;br /&gt;
&lt;br /&gt;
a. Ist das Relais wieder im Ausgangszustand, befestigt man nun einen der vom Breadboard führenden Drähte am unteren und einen am mittleren Relaiseingang (im Moment ist die Polarität noch egal). Zunächst sollte nichts passieren (das Relais hält diesen ja Stromkreis noch offen).&lt;br /&gt;
&lt;br /&gt;
b. Startet man aber das Script wieder (&amp;lt;tt&amp;gt;python wandler.py&amp;lt;/tt&amp;gt;) oder klickt auf &#039;Output Pin 1&#039; wird der Nutzstromkreis geschlossen. Nochmals aufgepasst: unser Nutzer erhält wieder die maximal vorgesehene Spannung - also besser vorher im Script &amp;quot;&amp;lt;tt&amp;gt;sleep(0.3)&amp;lt;/tt&amp;gt;&amp;quot; setzen und speichern.&lt;br /&gt;
&lt;br /&gt;
c. Im Prinzip ist damit die programmgesteuerte Umsetzung eines 0/1 Signals in z.B. eine 0V/15V Spannung erreicht.&lt;br /&gt;
&lt;br /&gt;
d. Da wir bald verschiedene Steuerspannungen schalten wollen, geht es jetzt darum herauszufinden, bei welcher Spannung unser Nutzgerät gerade noch bewegt wird. Dies probiert man aus - mit dem kleinsten Widerstand beginnend: indem einer der Drähte in eine freie Breadboardspalte gesteckt wird und aus dieser Spalte der Widerstand zu dem &#039;alten&#039; Steckplatz des Drahtes geführt wird. Nun startet man jeweils das Script bis der Widerstand so hoch ist, dass die Anlaufspannung beim Nutzgerätes gut ausreicht, eine Reaktion des Nutzgerät (Fahrzeug bewegt sich) zu bewirken (z.B. bei 50 Ohm beträgt der Strom ca. 130 mA während ohne 190 mA fliessen).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Ansteuerung von 3 Schaltstufen =&lt;br /&gt;
&lt;br /&gt;
== Kombination von 2 Relais ==&lt;br /&gt;
&lt;br /&gt;
[[Bild:ZrelMww2.png|thumb|right|250px|Beschaltung der Relais]] a. Die einfachste Stufe der weiteren Verschaltung erreicht man, indem der Widerstand mit einem 2. Relais überbrückt wird. Relais 1 kann dann als &#039;Hauptschalter&#039;, Relais 2 als Spannungsumschalter genutzt werden:&lt;br /&gt;
&lt;br /&gt;
b. Diese Beschaltung kann sogleich mit dem PiFace-Emulator ausprobiert werden. Damit können wir bereits 3 Schaltstufen steuern: keine, verminderte und volle Spannung.&lt;br /&gt;
&lt;br /&gt;
c. Theoretisch liesse sich auch noch eine 4. Spannungsstufe erzeugen, da mit 2 &#039;Bits&#039; (Ein/Aus bei 2 Relais) bereits 4 verschiedene Signale darstellbar sind. Beim jetzigen Aufbau werden aber lediglich die (pin1,pin2)-Signale (0,0), (1,0) und (1,1) &#039;genutzt&#039;, da Relais 1 als Hauptschalter vorgesehen ist und die Kombination (0,1) so nicht ausgewertet wird.&lt;br /&gt;
&lt;br /&gt;
== Programmgesteuerte Schaltung von 2 Relais ==&lt;br /&gt;
&lt;br /&gt;
a. Mit einem veränderten python-Script &amp;quot;wandler2.py&amp;quot; ist auch die programmgesteuerte Schaltung möglich. Dabei werden zusätzlich die Tasten 1 und 2 des PiFace genutzt, um nach dem Start des Scripts (&amp;lt;tt&amp;gt;python wandler2.py&amp;lt;/tt&amp;gt;) den Hauptschalter (Relais 1) zu steuern:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler2.py&lt;br /&gt;
 &lt;br /&gt;
 from time import sleep&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
 pfio.init()&lt;br /&gt;
 &lt;br /&gt;
 taste_1=0&lt;br /&gt;
 taste_2=0&lt;br /&gt;
 intervall_a=0.1&lt;br /&gt;
 intervall_b=0.5&lt;br /&gt;
 # Die Intervalle bestimmen die Schaltzeit für volle/verminderte Spannung&lt;br /&gt;
 &lt;br /&gt;
 print &amp;quot;Zum Start Taste 1 drücken, zum Stoppen Taste 2&amp;quot;&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 while taste_1 == 0:&lt;br /&gt;
   sleep(intervall_a)&lt;br /&gt;
   taste_1=pfio.digital_read(1)&lt;br /&gt;
&lt;br /&gt;
 # Der o.g. &#039;sleep&#039;-Befehl bestimmt die Abfragepausen für Taste 1&lt;br /&gt;
 &lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
 print &amp;quot;Strom an!&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 while taste_2 == 0:&lt;br /&gt;
   pfio.digital_write(2,1)&lt;br /&gt;
   sleep(intervall_a)&lt;br /&gt;
   pfio.digital_write(2,0)&lt;br /&gt;
   sleep(intervall_b)&lt;br /&gt;
   taste_2=pfio.digital_read(2)&lt;br /&gt;
 &lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Strom aus!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
b. Falls beim Ausprobieren von Script-Änderungen mal was schief geht, kann das Script stets auch mit der Tastenkombination (CNTRL-C) gestoppt werden. U.U. muss dann noch zusätzlich Relais 1 und/oder 2 via Emulator zurückgesetzt werden.&lt;br /&gt;
&lt;br /&gt;
c. Beim Verändern des Scripts fällt bald auf, dass die bisherige Programmsteuerung keine direkte Möglichkeit vorsieht, auf Ereignisse zu reagieren. Immerhin wird ein mechanisches Gerät gesteuert, bei dem mit Ausfällen, Fertigungstoleranzen, Umwelteinflüssen etc. zu rechnen ist (im Script wird dies bislang &#039;nur&#039; durch die Abbruchbedingung &#039;Taste 2&#039; berücksichtigt).&lt;br /&gt;
&lt;br /&gt;
== Einfache Sensor-Signale als steuernde Elemente eines Programms ==&lt;br /&gt;
&lt;br /&gt;
a. Eine wichtige Anwendung von D/A-Steuerungen ist die mögliche Reaktion dieser Steuerung auf &#039;äußere&#039; Ereignisse, die z.B. mit Hilfe von Sensoren leistbar ist.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Einf_Sens.jpg|thumb|right|250px|einfacher Sensor]]b. Für unsere Zwecke genügt zunächst ein sehr einfacher Sensor, der ein 0- oder 1-Signal liefert und idealerweise direkt am &#039;Input Pin 1&#039; des PiFace angeschlossen werden kann. So liegt beim Input Pin 1 das Signal &#039;1&#039; an, wenn eine Verbindung zu &#039;Input GND&#039; besteht.&lt;br /&gt;
Z.B. können 2 unisolierte Drähte so plaziert werden, dass ein vorbeifahrendes Fahrzeug einen von ihnen genügend bewegt um den Kontakt kurze Zeit zu öffnen. Genau dann liefert dieser &#039;Sensor&#039; das Signal &#039;0&#039;. Eine - die Schwerkraft nutzende - mögliche Bauform ist rechts abgebildet ;-)&lt;br /&gt;
&lt;br /&gt;
c. Natürlich werden zusätzlich 2 isolierte Drähte benötigt, um jeden der beiden offenen Drähte geschützt mit Input Pin 1 und Input GND zu verbinden.&lt;br /&gt;
&lt;br /&gt;
d. Bei jeder Durchfahrt liefert der Sensor nun ein &#039;0&#039;-Signal, was im Script sowohl für eine Zeitmessung als auch für ein &#039;Schaltintervall-Array&#039; genutzt werden kann. Dort können abwechselnd für beide Spannungen Zeiten (die in etwa zum jeweiligen Streckenabschnitt passen) &#039;programmiert&#039; werden. Statt Taste 1 wird nun der Sensor ausgewertet (wobei Taste 1 als Sensor-Ersatz insoweit genutzt werden kann, dass sie gedrückt bleiben bzw. kurz losgelassen werden muss). Zur genaueren Zeitmessung wird noch das modul &#039;clock&#039; benötigt. &amp;quot;&amp;lt;tt&amp;gt;wandler3.py&amp;lt;/tt&amp;gt;&amp;quot; könnte also so aussehen:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler3.py&lt;br /&gt;
 &lt;br /&gt;
 from time import clock&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
 sensor_1=1&lt;br /&gt;
 sensor_2=0&lt;br /&gt;
 rundenzahl=0&lt;br /&gt;
 v_wechsel=0&lt;br /&gt;
 vorrunde=0&lt;br /&gt;
 index_zaehler=1&lt;br /&gt;
 &lt;br /&gt;
 zeit_array=[0,0.2,0.4,0.2,0.4,0.2,0.4,0.2,5,0.2,6]&lt;br /&gt;
 # dieses array enthält die sek. bis zum Spannungswechsel&lt;br /&gt;
&lt;br /&gt;
 array_laenge=9&lt;br /&gt;
 # legt fest, wie viel Werte des arrays genutzt werden sollen&lt;br /&gt;
 &lt;br /&gt;
 sensor_aus=1.3&lt;br /&gt;
 # bis der Sensor sicher in die Ruhestellung kippt, wird er nicht ausgelesen&lt;br /&gt;
  &lt;br /&gt;
 pfio.init()&lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
&lt;br /&gt;
 # das Fahrzeug wird langsam zum Start (=Sensor) bewegt&lt;br /&gt;
 while sensor_1 == 1 :&lt;br /&gt;
   sensor_1=pfio.digital_read(1)&lt;br /&gt;
  &lt;br /&gt;
 print &amp;quot;fliegender Start... zum Beenden Taste 2 drücken&amp;quot;&lt;br /&gt;
 print &amp;quot;Runde Nr., Ges.Zeit, Rundenzeit, mittlere Rundenzeit&amp;quot;&lt;br /&gt;
 start_zeit=clock()&lt;br /&gt;
 runden_start=start_zeit&lt;br /&gt;
  &lt;br /&gt;
 while sensor_2 == 0 :&lt;br /&gt;
   sensor_2=pfio.digital_read(2)&lt;br /&gt;
   v_wechsel=1-v_wechsel&lt;br /&gt;
   pfio.digital_write(2,v_wechsel)&lt;br /&gt;
   sensor_zeit=clock()&lt;br /&gt;
  &lt;br /&gt;
   while zeit_array[index_zaehler]+sensor_zeit &amp;gt; clock() :&lt;br /&gt;
     if runden_start+sensor_aus &amp;lt; clock() :&lt;br /&gt;
 &lt;br /&gt;
       sensor_1=pfio.digital_read(1) &lt;br /&gt;
       if sensor_1 == 0 :&lt;br /&gt;
         rundenzahl=rundenzahl+1&lt;br /&gt;
         runden_start=clock()&lt;br /&gt;
         zeit=runden_start-start_zeit&lt;br /&gt;
         print rundenzahl, zeit, zeit-vorrunde, zeit/rundenzahl&lt;br /&gt;
         vorrunde=zeit&lt;br /&gt;
         sensor_zeit=0&lt;br /&gt;
         index_zaehler=0&lt;br /&gt;
         v_wechsel=0&lt;br /&gt;
  &lt;br /&gt;
   index_zaehler=index_zaehler+1&lt;br /&gt;
   if index_zaehler &amp;gt; array_laenge :&lt;br /&gt;
     sensor_2=1&lt;br /&gt;
     print &amp;quot;array-Ende erreicht!&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Outp 1 &amp;amp; 2 auf 0!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wird das Array-Ende erreicht, wurden entweder zu wenige Einträge vorgesehen oder es befindet sich kein Fahrzeug (mehr) auf der Strecke, das den Sensor und damit des Zurücksetzen des Arrays auslösen konnte.&lt;br /&gt;
&lt;br /&gt;
e. Das Array ist an die jeweilige Strecke anzupassen, wobei der vorderste Eintrag ungenutzt bleibt und dann mit der Dauer für maximale Spannung begonnen wird. Solange man mit Relais arbeitet, sollten die Schaltzeiten nicht zu kurz sein (&amp;gt;0.1 sek), da diese eine gewisse mechanische Trägheit besitzen.&lt;br /&gt;
&lt;br /&gt;
f. Eben diese mechanische Beschaffenheit der Relais (Verschleiß) ist auch ein guter Grund, auf &#039;volle&#039; digitale Signalumwandlung umzustellen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Optokoppler als Ersatz für Relais =&lt;br /&gt;
&lt;br /&gt;
Ähnlich wie ein Relais dient ein [[Optokoppler]] dazu, eine Signalübertragung zwischen zwei getrennten Stromkreisen zu ermöglichen. Bei diesem Projekt liegt der Einsatz von Optokopplern nahe, da sie schneller schalten und keine beweglichen Teile besitzen. Für unsere Zwecke benötigen wir nun als zusätzliche Elemente: Optokoppler (CNY 17-4), npn-[[Transistor]]en (BC 337-40) zur Signalverstärkung sowie einige Widerstände im Bereich von 2k und 400 Ohm. &lt;br /&gt;
&lt;br /&gt;
== Kaskadierung von Transistoren zur Signalverstärkung ==&lt;br /&gt;
&lt;br /&gt;
a. Entsprechend Schritt 2.4.d. (ein Relais bei 50 Ohm) wird zunächst ein [[Optokoppler]] eingesetzt, dessen Signal durch einen Transistor verstärkt wird, um die &#039;Grundspannung&#039; zu schalten (Pin 3 und 6 beim Optokoppler sollten unbeschaltet bleiben, allein der &#039;Lichtstrom&#039; reicht für eine Ansteuerung aus):&lt;br /&gt;
&lt;br /&gt;
[[Bild:PiF_CNY_BC_1.png|400px|Optokoppler mit Transistor]]&lt;br /&gt;
&lt;br /&gt;
b. Da immer mit einer gewissen Toleranz bei allen Komponenten zu rechnen ist, kann es sein, dass u.U. die Widerstände etwas größer oder kleiner gewählt werden müssen. Beim Ausprobieren sollte man hier in 10% Schritten variieren.&lt;br /&gt;
&lt;br /&gt;
c. Bei Austesten mit Emulator oder Script ist auch zu beachten, dass nun &#039;Output Pin 8&#039; genutzt wird, da dieser nicht mit den Relais verschaltet ist.&lt;br /&gt;
&lt;br /&gt;
== Umsetzung von 3 Schaltstufen mit Optokopplern ==&lt;br /&gt;
&lt;br /&gt;
a. Entsprechend dem Vorgehen beim Relais kann nun auch der kleine Widerstand zusätzlich beschaltet werden um seine gesteuerte Überbrückung zu ermöglichen. Da hier eine relativ geringe Spannung aufgeschaltet wird, kann zu Beginn eine Diode eingesetzt werden, die die Schaltstufe &#039;maximale Spannung&#039; anzeigt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:SmPiFu2ou2T.png|400px|Kombination von 2 Optokopplern]]&lt;br /&gt;
&lt;br /&gt;
b. Vor dem Testen ist wieder zu beachten, dass nun zusätzlich &#039;Output Pin 7&#039; genutzt wird (statt Output Pin 2).&lt;br /&gt;
&lt;br /&gt;
c. Eine mögliche Realisierung sieht so aus:[http://youtu.be/xQ7N-PrIULk].&lt;br /&gt;
&lt;br /&gt;
== Zusätzliche Erhöhung der Schaltstufen bei D/A-Wandlern ==&lt;br /&gt;
&lt;br /&gt;
a. Zwar benötigen wir in unserem speziellen Beispiel eine &#039;Grundspannung&#039;, die sich dahingehend auswirkt, dass - wie unter 3.1.c. erwähnt - eine Signalkombination nicht ausgewertet wird, aber mit jeder weiteren Schaltstufe würde sich dieses Problem (theoretisch) relativieren, da bei geschickter Auswahl der Widerstände (z.B. im Verhältnis 1 zu 2) jeweils eine Verdoppelung der Kombinationsmöglichkeiten erreichbar ist.&lt;br /&gt;
&lt;br /&gt;
b. Wird hier der 50 Ohm Widerstand asymmetrisch geteilt (z.B. 15 + 35 Ohm, s.a. [[Spannungsteiler]]) um dort ein weiteres Signal umsetzen zu können, ergeben sich direkt folgende 5 Schaltstufen (aus, 50, 35, 15 und 0 Ohm) u.s.w.:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Sm3ou3t2.png|400px|Erhöhung der Schaltstufen]]&lt;br /&gt;
&lt;br /&gt;
c. Zur Ansteuerung dieser Schaltstufen wäre das Script so zu ändern, dass nun zwischen mehr als 2 Stufen gewechselt werden kann und im Array entsprechende Zusatzdaten vorgegeben und ausgelesen werden. Mehr als diese Stufen sind im konkreten Fall aber nicht sinnvoll, da die entstehende Verlustleistung in der Schaltung die maximal verfügbare Leistung reduziert.&lt;br /&gt;
&lt;br /&gt;
= Weiterführende Ideen =&lt;br /&gt;
&lt;br /&gt;
== Hardwareseitige Ausbauvarianten ==&lt;br /&gt;
&lt;br /&gt;
Die Ausbaumöglichkeiten dieses Projektes sind vielfältig:&lt;br /&gt;
&lt;br /&gt;
- beispielhafte Umsetzung einer differenzierten Abstufung mittels mittels einer logarithmischen Einteilung oder eines möglichst oft durch 2 teilbaren Anfangswertes und der Teiler (640 Ohm, 320, 160...);&lt;br /&gt;
&lt;br /&gt;
- Nachbau des Projekts mit einem Microcontroller (ggf. mit LCD-Anzeige);&lt;br /&gt;
&lt;br /&gt;
- Umbau der Steuerung mit dem Ziel, sie direkt an die GPIO-Pins des RPi anzuschließen;&lt;br /&gt;
&lt;br /&gt;
- Ergänzung um eine Sensorik, die in diesem Beispiel eine Rückmeldung liefert, ob ein Verbraucher aktiv ist oder nicht (Fahrzeug noch auf der Strecke?);&lt;br /&gt;
&lt;br /&gt;
- Einsatz anderer Sensortechniken und/oder mehrerer Sensoren zur Optimierung der Schnelligkeit oder parallelen Steuerung eines 2. Fahrzeuges;&lt;br /&gt;
&lt;br /&gt;
== Softwareseitige Ausbauvarianten ==&lt;br /&gt;
&lt;br /&gt;
- Optimierung des Scripts, indem die Sensor-Abfrage über einen &#039;Listener&#039; umgesetzt wird;&lt;br /&gt;
&lt;br /&gt;
- Erweiterung des Scripts um eine GUI mit Hilfe der python-lib Tkinter, um einen Nutzerzugriff auf das Steuerarray und/oder eine &#039;Verwaltung&#039; mehrerer Fahrzeuge;&lt;br /&gt;
&lt;br /&gt;
- Einbindung eines Web-Interface um eine &#039;Fernsteuerung&#039; zu ermöglichen...&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [http://hackaday.com/2013/01/23/replacement-controllers-for-slot-car-racing/ ähnliches Projekt bei &#039;hackaday&#039;] &lt;br /&gt;
* [https://docs.google.com/folder/d/0B-UAZ9CyJCLGQjJ3RDlqa2pqaDg/edit?pli=1&amp;amp;docId=0B-UAZ9CyJCLGNmpMeVpyYlZJUWc Relaisschaltung mit pädagogischer Erweiterung d. Universität Manchester]&lt;br /&gt;
* [http://elinux.org/RPi_Projects/PiFace_controlling_a_slot-car parallele englischsp. Dokumentation dieses Projekts mit anderem Schwerpunkt] &lt;br /&gt;
* [http://elinux.org/RPi_Projects englischsp. Projektliste zum RPi]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Raspberry Pi]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Mknot9</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=RPi_als_D/A-Wandler&amp;diff=74124</id>
		<title>RPi als D/A-Wandler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=RPi_als_D/A-Wandler&amp;diff=74124"/>
		<updated>2013-03-07T20:36:15Z</updated>

		<summary type="html">&lt;p&gt;Mknot9: /* Kaskadierung von Transistoren zur Signalverstärkung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von mknot9&#039;&#039; (in Arbeit)&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
Oft wird ein Computer &#039;nur&#039; genutzt um darauf Software ablaufen zu lassen. Dessen Möglichkeit zur Steuerung von elektrischen und mechanischen Geräten wird dabei leicht übersehen.&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel richtet sich daher an Einsteiger, die mit dem [[Raspberry Pi]] (&#039;RPi&#039;) Grundlagen der Computersteuerung mit Relais und [[Spannungsteiler]]n nachvollziehen möchten. Es wird schrittweise dargestellt, wie mittels eines D/A-Wandlers (Digital/Analog-Wandler = Umwandlung von digitalen 1/0 Signale) die Steuerung einer stufenweise veränderbaren Ausgangsspannung aufgebaut werden kann.&lt;br /&gt;
&lt;br /&gt;
= Verwendete Hardware =&lt;br /&gt;
&lt;br /&gt;
== RPi in Kombination mit der &#039;PiFace&#039;-Karte als Bastelplattform ==&lt;br /&gt;
&lt;br /&gt;
Dank der einfachen Bauweise bietet sich der RPi mit seinen frei zugänglichen GPIO-Pins als ideale Bastelplattform an. Trotzdem kann es beim anfänglichen Experimentieren mit Schaltungen öfters zu kleinen Fehlern kommen, die schlimmstenfalls die empfindliche Elektronik des RPi dauerhaft beschädigen können.&lt;br /&gt;
&lt;br /&gt;
Daher wird bei diesem Projekt zusätzlich mit der &#039;PiFace[http://elinux.org/RPi_Expansion_Boards#Piface]&#039;-Karte gearbeitet, die man auf die GPIO-Pins stecken kann. Diese Erweiterungskarte verschaltet die GPIO-Pins auf je 8 digitale Ein- und Ausgänge sowie 2 Relais, die eine galvanische Trennung von Stromkreisen ermöglichen. Damit besteht auch für Einsteiger ein gewisser Schutz für die Steuerelektronik des RPi.&lt;br /&gt;
&lt;br /&gt;
Auch im weiteren Verlauf dieser Einführung soll noch auf eine Trennung der Stromkreise Wert gelegt werden, so dass für erste digitale Schaltexperimente ein Optokoppler genutzt wird. Die spätere Nutzung der &#039;Input Pins&#039; des PiFace um eine Steuerung der D/A-Wandlung durch bestimmte Ereignisse zu ermöglichen, erfolgt ebenfalls passiv.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Auch wenn mit vermeindlich &#039;sicheren&#039; Transformatoren gebastelt wird, muss stets bedacht werden, dass diese an einem 230V-Stromnetz betrieben werden und man eher einmal mehr als weniger prüfen sollte, ob man durch eventuelle Fehler mit lebensgefährlicher Spannung in Berührung kommt!&lt;br /&gt;
&lt;br /&gt;
== Auswahl eines Beispielprojektes ==&lt;br /&gt;
&lt;br /&gt;
Günstige Möglichkeiten ein Gerät zu finden, das mit analogen Spannungen arbeitet, bieten sich u.a. im Spielzeugbereich. Im Grunde eignet sich alles, was mit Batterien oder mit Gleichspannungen unter 24 V betrieben wird.&lt;br /&gt;
&lt;br /&gt;
Da jedoch ein Ziel das Steuern von analogen Spannungen ist, bietet sich insbesondere alles an, bei dem [[Potentiometer]] eingesetzt werden. Einen dieser &#039;Handregler&#039; sollte man übrig haben, da er von seinem Anschlusskabel abgetrennt werden muss, um den oft proprietären Steckanschluss nutzen zu können. In diesem Sinne wird hier eine handelsübliche Spielzeug-Autorennbahn mit Potentiometer-Handreglern genutzt.&lt;br /&gt;
&lt;br /&gt;
== Sonstige Bauteile ==&lt;br /&gt;
&lt;br /&gt;
Für die ersten Grundlagen (s. Teile 2 &amp;amp; 3) genügen bereits rund 2 m isolierter Draht, der nicht aus verdrillten feinen Adern (Litze) bestehen sollte, 50 cm nicht-isolierter Draht, einige niederohmige Widerstände (z.B. je 2 mal 100 Ohm, 80, 60, sowie 20) und ein &#039;Experimentierbrett&#039; (engl. [[Breadboard]]).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Grundlagen und Vorbereitung des Projekts =&lt;br /&gt;
&lt;br /&gt;
== Umwandlung von 1/0 zu Ein/Aus mit einem Relais ==&lt;br /&gt;
&lt;br /&gt;
Vom Prinzip her ist jede Umwandlung eines digitalen 0 oder 1 Signals (das über eine bestimmte Spannungsdifferenz festgelegt ist) in eine (nutzbare) Spannung bereits eine D/A-Wandlung. Dies wird schlicht so realisiert, dass mit einer Eingabe am RPi die Nutzspannung des &#039;Verbrauchers&#039; zunächst einfach an- und ausgeschaltet wird.&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung der zu steuernden Hardware ==&lt;br /&gt;
&lt;br /&gt;
a. Um Fehlerquellen auszuschliessen sollte zunächst (und ggf. auch später!) kurz getestet werden, ob der vorhandene Regler wie erwartet funktioniert.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pif_Con9.jpg|thumb|right|400px|Fixierung der Reglerkabel]]&lt;br /&gt;
b. Nach dem Trennen des Reglers von der Einspeisung (und ggf. Ziehen des Netzsteckers) muss das Regler-Kabel abgeschnitten werden (eher nahe beim Regler, da das Kabel bald bis zum Breadboard reichen soll). Die neuen Enden des Einspeiseteils werden abisoliert und auf dem Breadboard diagonal zueinander mit einigen Spalten Abstand fixiert. Auch können bereits die Drähte, die später zum RPi führen, jeweils in den passenden kontaktführenden Spalten eingesteckt werden, z. B. wie rechts zu sehen (die nicht beschrifteten Drähte können vorerst ignoriert werden):&lt;br /&gt;
&lt;br /&gt;
c. Nun bietet sich eine gute Gelegenheit die maximale Spannung am Nutzgerät zu messen. Man verbindet das Regler-Kabel (nun ohne Regler) wieder mit der Einspeisung und die offenen Enden der Drähte mit dem Messgerät, bei dem zunächst ein Messbereich von ca. 10-50 Volt gewählt werden sollte. Dies sollte dann z.B. 14,8 V anzeigen. Natürlich können auch die beiden offenen Enden einen kleinen Moment kurz geschlossen werden, man sollte aber bedenken, dass das zu regelnde Nutzgerät dann die maximal vorgesehene Spannung erhält (hier: maximales Tempo).&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung des RPi ==&lt;br /&gt;
&lt;br /&gt;
Es wird davon ausgegangen, dass entsprechend des zugehörigen &#039;manual&#039; das PiFace bereits auf den RPi gesteckt ist, die nötigen python-Bilbliotheken installiert sind und man sich im Terminal-Arbeitsverzeichnis &#039;pi&#039; befindet.&lt;br /&gt;
&lt;br /&gt;
a. Zunächst wird der PiFace-Emulator (im Terminal direkt aus dem Arbeitsverzeichnis) gestartet: &amp;lt;tt&amp;gt;piface/scripts/piface-emulator&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b. Wenn alles richtig installiert wurde, erscheint ein Fenster (unten links), bei dem die vorerst wichtigen blauen Signale am rechten Rand wie folgt angezeigt werden sollten: &lt;br /&gt;
 &lt;br /&gt;
[[Datei:RPi_PiF_em-scs.jpg|400px|Piface-Emulator im default-Zustand]] [[Datei:RPi_PiF_em_scs1.jpg|400px|Piface-Relais 1 auf &#039;1&#039; geschaltet]]&lt;br /&gt;
&lt;br /&gt;
c. Das rechte Fenster ergibt sich, wenn man nun im Fenster auf &amp;quot;Override Enable&amp;quot; und dann &amp;quot;Output Pin 1&amp;quot; klickt. Es müsste ein &amp;quot;Klack&amp;quot; vom Relais 1 zu hören sein sowie der Schaltzustand des unteren Relais 1 (das an den Output Pin 1 gekoppelt ist) auf die Verbindung der beiden unteren Anschlüsse wechseln. Zugleich wird das erste LED-Icon beim Output Pin 1 rot sowie das zugehörige LED-Icon blau.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pif_rel2.png|thumb|right|250px|Schema der Piface-Relais]]&lt;br /&gt;
d. Rechts ist der Schaltzustand der Relais, die zu Beginn genutzt werden, im Grundzustand dargestellt (jeweils der mittlere und obere Kontakt sind kurzgeschlossen, der jeweils untere Kontakt ist frei):&lt;br /&gt;
&lt;br /&gt;
e. Ein weiterer Klick auf &amp;quot;Output Pin 1&amp;quot; versetzt das Relais in den Ausgangszustand, der vor dem nächsten Schritt wieder eingestellt werden sollte.&lt;br /&gt;
&lt;br /&gt;
f. Das Relais läßt sich auch mittel eines Python-Scripts vom RPi aus ansteuern. Dazu wird folgende Textdatei &amp;quot;wandler.py&amp;quot; im Arbeitsverzeichnis abgespeichert und mit dem Befehl &amp;quot;&amp;lt;tt&amp;gt;python wandler.py&amp;lt;/tt&amp;gt;&amp;quot; gestartet:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler.py&lt;br /&gt;
&lt;br /&gt;
 from time import sleep&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
&lt;br /&gt;
 pfio.init()&lt;br /&gt;
&lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
 print &amp;quot;Strom an&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 sleep(2)&lt;br /&gt;
&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Strom aus&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Nach dem Absetzen des Befehls wechselt nun das blaue Signal an Relais 1 für 2 Sekunden und das Relais klackt entsprechend.&lt;br /&gt;
&lt;br /&gt;
== Einsatz eines Relais&#039; zur Umsetzung von Spannungsänderungen ==&lt;br /&gt;
&lt;br /&gt;
a. Ist das Relais wieder im Ausgangszustand, befestigt man nun einen der vom Breadboard führenden Drähte am unteren und einen am mittleren Relaiseingang (im Moment ist die Polarität noch egal). Zunächst sollte nichts passieren (das Relais hält diesen ja Stromkreis noch offen).&lt;br /&gt;
&lt;br /&gt;
b. Startet man aber das Script wieder (&amp;lt;tt&amp;gt;python wandler.py&amp;lt;/tt&amp;gt;) oder klickt auf &#039;Output Pin 1&#039; wird der Nutzstromkreis geschlossen. Nochmals aufgepasst: unser Nutzer erhält wieder die maximal vorgesehene Spannung - also besser vorher im Script &amp;quot;&amp;lt;tt&amp;gt;sleep(0.3)&amp;lt;/tt&amp;gt;&amp;quot; setzen und speichern.&lt;br /&gt;
&lt;br /&gt;
c. Im Prinzip ist damit die programmgesteuerte Umsetzung eines 0/1 Signals in z.B. eine 0V/15V Spannung erreicht.&lt;br /&gt;
&lt;br /&gt;
d. Da wir bald verschiedene Steuerspannungen schalten wollen, geht es jetzt darum herauszufinden, bei welcher Spannung unser Nutzgerät gerade noch bewegt wird. Dies probiert man aus - mit dem kleinsten Widerstand beginnend: indem einer der Drähte in eine freie Breadboardspalte gesteckt wird und aus dieser Spalte der Widerstand zu dem &#039;alten&#039; Steckplatz des Drahtes geführt wird. Nun startet man jeweils das Script bis der Widerstand so hoch ist, dass die Anlaufspannung beim Nutzgerätes gut ausreicht, eine Reaktion des Nutzgerät (Fahrzeug bewegt sich) zu bewirken (z.B. bei 50 Ohm beträgt der Strom ca. 130 mA während ohne 190 mA fliessen).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Ansteuerung von 3 Schaltstufen =&lt;br /&gt;
&lt;br /&gt;
== Kombination von 2 Relais ==&lt;br /&gt;
&lt;br /&gt;
[[Bild:ZrelMww2.png|thumb|right|250px|Beschaltung der Relais]] a. Die einfachste Stufe der weiteren Verschaltung erreicht man, indem der Widerstand mit einem 2. Relais überbrückt wird. Relais 1 kann dann als &#039;Hauptschalter&#039;, Relais 2 als Spannungsumschalter genutzt werden:&lt;br /&gt;
&lt;br /&gt;
b. Diese Beschaltung kann sogleich mit dem PiFace-Emulator ausprobiert werden. Damit können wir bereits 3 Schaltstufen steuern: keine, verminderte und volle Spannung.&lt;br /&gt;
&lt;br /&gt;
c. Theoretisch liesse sich auch noch eine 4. Spannungsstufe erzeugen, da mit 2 &#039;Bits&#039; (Ein/Aus bei 2 Relais) bereits 4 verschiedene Signale darstellbar sind. Beim jetzigen Aufbau werden aber lediglich die (pin1,pin2)-Signale (0,0), (1,0) und (1,1) &#039;genutzt&#039;, da Relais 1 als Hauptschalter vorgesehen ist und die Kombination (0,1) so nicht ausgewertet wird.&lt;br /&gt;
&lt;br /&gt;
== Programmgesteuerte Schaltung von 2 Relais ==&lt;br /&gt;
&lt;br /&gt;
a. Mit einem veränderten python-Script &amp;quot;wandler2.py&amp;quot; ist auch die programmgesteuerte Schaltung möglich. Dabei werden zusätzlich die Tasten 1 und 2 des PiFace genutzt, um nach dem Start des Scripts (&amp;lt;tt&amp;gt;python wandler2.py&amp;lt;/tt&amp;gt;) den Hauptschalter (Relais 1) zu steuern:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler2.py&lt;br /&gt;
 &lt;br /&gt;
 from time import sleep&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
 pfio.init()&lt;br /&gt;
 &lt;br /&gt;
 taste_1=0&lt;br /&gt;
 taste_2=0&lt;br /&gt;
 intervall_a=0.1&lt;br /&gt;
 intervall_b=0.5&lt;br /&gt;
 # Die Intervalle bestimmen die Schaltzeit für volle/verminderte Spannung&lt;br /&gt;
 &lt;br /&gt;
 print &amp;quot;Zum Start Taste 1 drücken, zum Stoppen Taste 2&amp;quot;&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 while taste_1 == 0:&lt;br /&gt;
   sleep(intervall_a)&lt;br /&gt;
   taste_1=pfio.digital_read(1)&lt;br /&gt;
&lt;br /&gt;
 # Der o.g. &#039;sleep&#039;-Befehl bestimmt die Abfragepausen für Taste 1&lt;br /&gt;
 &lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
 print &amp;quot;Strom an!&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 while taste_2 == 0:&lt;br /&gt;
   pfio.digital_write(2,1)&lt;br /&gt;
   sleep(intervall_a)&lt;br /&gt;
   pfio.digital_write(2,0)&lt;br /&gt;
   sleep(intervall_b)&lt;br /&gt;
   taste_2=pfio.digital_read(2)&lt;br /&gt;
 &lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Strom aus!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
b. Falls beim Ausprobieren von Script-Änderungen mal was schief geht, kann das Script stets auch mit der Tastenkombination (CNTRL-C) gestoppt werden. U.U. muss dann noch zusätzlich Relais 1 und/oder 2 via Emulator zurückgesetzt werden.&lt;br /&gt;
&lt;br /&gt;
c. Beim Verändern des Scripts fällt bald auf, dass die bisherige Programmsteuerung keine direkte Möglichkeit vorsieht, auf Ereignisse zu reagieren. Immerhin wird ein mechanisches Gerät gesteuert, bei dem mit Ausfällen, Fertigungstoleranzen, Umwelteinflüssen etc. zu rechnen ist (im Script wird dies bislang &#039;nur&#039; durch die Abbruchbedingung &#039;Taste 2&#039; berücksichtigt).&lt;br /&gt;
&lt;br /&gt;
== Einfache Sensor-Signale als steuernde Elemente eines Programms ==&lt;br /&gt;
&lt;br /&gt;
a. Eine wichtige Anwendung von D/A-Steuerungen ist die mögliche Reaktion dieser Steuerung auf &#039;äußere&#039; Ereignisse, die z.B. mit Hilfe von Sensoren leistbar ist.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Einf_Sens.jpg|thumb|right|250px|einfacher Sensor]]b. Für unsere Zwecke genügt zunächst ein sehr einfacher Sensor, der ein 0- oder 1-Signal liefert und idealerweise direkt am &#039;Input Pin 1&#039; des PiFace angeschlossen werden kann. So liegt beim Input Pin 1 das Signal &#039;1&#039; an, wenn eine Verbindung zu &#039;Input GND&#039; besteht.&lt;br /&gt;
Z.B. können 2 unisolierte Drähte so plaziert werden, dass ein vorbeifahrendes Fahrzeug einen von ihnen genügend bewegt um den Kontakt kurze Zeit zu öffnen. Genau dann liefert dieser &#039;Sensor&#039; das Signal &#039;0&#039;. Eine - die Schwerkraft nutzende - mögliche Bauform ist rechts abgebildet ;-)&lt;br /&gt;
&lt;br /&gt;
c. Natürlich werden zusätzlich 2 isolierte Drähte benötigt, um jeden der beiden offenen Drähte geschützt mit Input Pin 1 und Input GND zu verbinden.&lt;br /&gt;
&lt;br /&gt;
d. Bei jeder Durchfahrt liefert der Sensor nun ein &#039;0&#039;-Signal, was im Script sowohl für eine Zeitmessung als auch für ein &#039;Schaltintervall-Array&#039; genutzt werden kann. Dort können abwechselnd für beide Spannungen Zeiten (die in etwa zum jeweiligen Streckenabschnitt passen) &#039;programmiert&#039; werden. Statt Taste 1 wird nun der Sensor ausgewertet (wobei Taste 1 als Sensor-Ersatz insoweit genutzt werden kann, dass sie gedrückt bleiben bzw. kurz losgelassen werden muss). Zur genaueren Zeitmessung wird noch das modul &#039;clock&#039; benötigt. &amp;quot;&amp;lt;tt&amp;gt;wandler3.py&amp;lt;/tt&amp;gt;&amp;quot; könnte also so aussehen:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler3.py&lt;br /&gt;
 &lt;br /&gt;
 from time import clock&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
 sensor_1=1&lt;br /&gt;
 sensor_2=0&lt;br /&gt;
 rundenzahl=0&lt;br /&gt;
 v_wechsel=0&lt;br /&gt;
 vorrunde=0&lt;br /&gt;
 index_zaehler=1&lt;br /&gt;
 &lt;br /&gt;
 zeit_array=[0,0.2,0.4,0.2,0.4,0.2,0.4,0.2,5,0.2,6]&lt;br /&gt;
 # dieses array enthält die sek. bis zum Spannungswechsel&lt;br /&gt;
&lt;br /&gt;
 array_laenge=9&lt;br /&gt;
 # legt fest, wie viel Werte des arrays genutzt werden sollen&lt;br /&gt;
 &lt;br /&gt;
 sensor_aus=1.3&lt;br /&gt;
 # bis der Sensor sicher in die Ruhestellung kippt, wird er nicht ausgelesen&lt;br /&gt;
  &lt;br /&gt;
 pfio.init()&lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
&lt;br /&gt;
 # das Fahrzeug wird langsam zum Start (=Sensor) bewegt&lt;br /&gt;
 while sensor_1 == 1 :&lt;br /&gt;
   sensor_1=pfio.digital_read(1)&lt;br /&gt;
  &lt;br /&gt;
 print &amp;quot;fliegender Start... zum Beenden Taste 2 drücken&amp;quot;&lt;br /&gt;
 print &amp;quot;Runde Nr., Ges.Zeit, Rundenzeit, mittlere Rundenzeit&amp;quot;&lt;br /&gt;
 start_zeit=clock()&lt;br /&gt;
 runden_start=start_zeit&lt;br /&gt;
  &lt;br /&gt;
 while sensor_2 == 0 :&lt;br /&gt;
   sensor_2=pfio.digital_read(2)&lt;br /&gt;
   v_wechsel=1-v_wechsel&lt;br /&gt;
   pfio.digital_write(2,v_wechsel)&lt;br /&gt;
   sensor_zeit=clock()&lt;br /&gt;
  &lt;br /&gt;
   while zeit_array[index_zaehler]+sensor_zeit &amp;gt; clock() :&lt;br /&gt;
     if runden_start+sensor_aus &amp;lt; clock() :&lt;br /&gt;
 &lt;br /&gt;
       sensor_1=pfio.digital_read(1) &lt;br /&gt;
       if sensor_1 == 0 :&lt;br /&gt;
         rundenzahl=rundenzahl+1&lt;br /&gt;
         runden_start=clock()&lt;br /&gt;
         zeit=runden_start-start_zeit&lt;br /&gt;
         print rundenzahl, zeit, zeit-vorrunde, zeit/rundenzahl&lt;br /&gt;
         vorrunde=zeit&lt;br /&gt;
         sensor_zeit=0&lt;br /&gt;
         index_zaehler=0&lt;br /&gt;
         v_wechsel=0&lt;br /&gt;
  &lt;br /&gt;
   index_zaehler=index_zaehler+1&lt;br /&gt;
   if index_zaehler &amp;gt; array_laenge :&lt;br /&gt;
     sensor_2=1&lt;br /&gt;
     print &amp;quot;array-Ende erreicht!&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Outp 1 &amp;amp; 2 auf 0!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wird das Array-Ende erreicht, wurden entweder zu wenige Einträge vorgesehen oder es befindet sich kein Fahrzeug (mehr) auf der Strecke, das den Sensor und damit des Zurücksetzen des Arrays auslösen konnte.&lt;br /&gt;
&lt;br /&gt;
e. Das Array ist an die jeweilige Strecke anzupassen, wobei der vorderste Eintrag ungenutzt bleibt und dann mit der Dauer für maximale Spannung begonnen wird. Solange man mit Relais arbeitet, sollten die Schaltzeiten nicht zu kurz sein (&amp;gt;0.1 sek), da diese eine gewisse mechanische Trägheit besitzen.&lt;br /&gt;
&lt;br /&gt;
f. Eben diese mechanische Beschaffenheit der Relais (Verschleiß) ist auch ein guter Grund, auf &#039;volle&#039; digitale Signalumwandlung umzustellen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Optokoppler als Ersatz für Relais =&lt;br /&gt;
&lt;br /&gt;
Ähnlich wie ein Relais dient ein [[Optokoppler]] dazu, eine Signalübertragung zwischen zwei getrennten Stromkreisen zu ermöglichen. Hier liegt der Einsatz von Optokopplern nahe, da sie schneller schalten und keine beweglichen Teile besitzen. Für unsere Zwecke benötigen wir nun als zusätzliche Elemente: Optokoppler (CNY 17-4), npn-[[Transistor]]en (BC 337-40) zur Signalverstärkung sowie einige Widerstände im Bereich von 2k und 400 Ohm. &lt;br /&gt;
&lt;br /&gt;
== Kaskadierung von Transistoren zur Signalverstärkung ==&lt;br /&gt;
&lt;br /&gt;
a. Entsprechend Schritt 2.4.d. (ein Relais bei 50 Ohm) wird zunächst ein [[Optokoppler]] eingesetzt, dessen Signal durch einen Transistor verstärkt wird, um die &#039;Grundspannung&#039; zu schalten (Pin 3 und 6 beim Optokoppler sollten unbeschaltet bleiben, allein der &#039;Lichtstrom&#039; reicht für eine Ansteuerung aus):&lt;br /&gt;
&lt;br /&gt;
[[Bild:PiF_CNY_BC_1.png|400px|Optokoppler mit Transistor]]&lt;br /&gt;
&lt;br /&gt;
b. Da immer mit einer gewissen Toleranz bei allen Komponenten zu rechnen ist, kann es sein, dass u.U. die Widerstände etwas größer oder kleiner gewählt werden müssen. Beim Ausprobieren sollte man hier in 10% Schritten variieren.&lt;br /&gt;
&lt;br /&gt;
c. Bei Austesten mit Emulator oder Script ist auch zu beachten, dass nun &#039;Output Pin 8&#039; genutzt wird, da dieser nicht mit den Relais verschaltet ist.&lt;br /&gt;
&lt;br /&gt;
== Umsetzung von 3 Schaltstufen mit Optokopplern ==&lt;br /&gt;
&lt;br /&gt;
a. Entsprechend dem Vorgehen beim Relais kann nun auch der kleine Widerstand zusätzlich beschaltet werden um seine gesteuerte Überbrückung zu ermöglichen. Da hier eine relativ geringe Spannung aufgeschaltet wird, kann zu Beginn eine Diode eingesetzt werden, die die Schaltstufe &#039;maximale Spannung&#039; anzeigt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:SmPiFu2ou2T.png|400px|Kombination von 2 Optokopplern]]&lt;br /&gt;
&lt;br /&gt;
b. Vor dem Testen ist wieder zu beachten, dass nun zusätzlich &#039;Output Pin 7&#039; genutzt wird (statt Output Pin 2).&lt;br /&gt;
&lt;br /&gt;
c. Eine mögliche Realisierung sieht so aus:[http://youtu.be/xQ7N-PrIULk].&lt;br /&gt;
&lt;br /&gt;
== Zusätzliche Erhöhung der Schaltstufen bei D/A-Wandlern ==&lt;br /&gt;
&lt;br /&gt;
a. Zwar benötigen wir in unserem speziellen Beispiel eine &#039;Grundspannung&#039;, die sich dahingehend auswirkt, dass - wie unter 3.1.c. erwähnt - eine Signalkombination nicht ausgewertet wird, aber mit jeder weiteren Schaltstufe würde sich dieses Problem (theoretisch) relativieren, da bei geschickter Auswahl der Widerstände (z.B. im Verhältnis 1 zu 2) jeweils eine Verdoppelung der Kombinationsmöglichkeiten erreichbar ist.&lt;br /&gt;
&lt;br /&gt;
b. Wird hier der 50 Ohm Widerstand asymmetrisch geteilt (z.B. 15 + 35 Ohm, s.a. [[Spannungsteiler]]) um dort ein weiteres Signal umsetzen zu können, ergeben sich direkt folgende 5 Schaltstufen (aus, 50, 35, 15 und 0 Ohm) u.s.w.:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Sm3ou3t2.png|400px|Erhöhung der Schaltstufen]]&lt;br /&gt;
&lt;br /&gt;
c. Zur Ansteuerung dieser Schaltstufen wäre das Script so zu ändern, dass nun zwischen mehr als 2 Stufen gewechselt werden kann und im Array entsprechende Zusatzdaten vorgegeben und ausgelesen werden. Mehr als diese Stufen sind im konkreten Fall aber nicht sinnvoll, da die entstehende Verlustleistung in der Schaltung die maximal verfügbare Leistung reduziert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Weiterführende Ideen =&lt;br /&gt;
&lt;br /&gt;
== Hardwareseitige Ausbauvarianten ==&lt;br /&gt;
&lt;br /&gt;
Die Ausbaumöglichkeiten dieses Projektes sind vielfältig:&lt;br /&gt;
&lt;br /&gt;
- beispielhafte Umsetzung einer differenzierten Abstufung mittels mittels einer logarithmischen Einteilung oder eines möglichst oft durch 2 teilbaren Anfangswertes und der Teiler (640 Ohm, 320, 160...);&lt;br /&gt;
&lt;br /&gt;
- Nachbau des Projekts mit einem Microcontroller (ggf. mit LCD-Anzeige);&lt;br /&gt;
&lt;br /&gt;
- Umbau der Steuerung mit dem Ziel, sie direkt an die GPIO-Pins des RPi anzuschließen;&lt;br /&gt;
&lt;br /&gt;
- Ergänzung um eine Sensorik, die in diesem Beispiel eine Rückmeldung liefert, ob ein Verbraucher aktiv ist oder nicht (Fahrzeug noch auf der Strecke?);&lt;br /&gt;
&lt;br /&gt;
- Einsatz anderer Sensortechniken und/oder mehrerer Sensoren zur Optimierung der Schnelligkeit oder parallelen Steuerung eines 2. Fahrzeuges;&lt;br /&gt;
&lt;br /&gt;
== Softwareseitige Ausbauvarianten ==&lt;br /&gt;
&lt;br /&gt;
- Optimierung des Scripts, indem die Sensor-Abfrage über einen &#039;Listener&#039; umgesetzt wird;&lt;br /&gt;
&lt;br /&gt;
- Erweiterung des Scripts um eine GUI mit Hilfe der python-lib Tkinter, um einen Nutzerzugriff auf das Steuerarray und/oder eine &#039;Verwaltung&#039; mehrerer Fahrzeuge;&lt;br /&gt;
&lt;br /&gt;
- Einbindung eines Web-Interface um eine &#039;Fernsteuerung&#039; zu ermöglichen...&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [http://hackaday.com/2013/01/23/replacement-controllers-for-slot-car-racing/ ähnliches Projekt bei &#039;hackaday&#039;] &lt;br /&gt;
* [https://docs.google.com/folder/d/0B-UAZ9CyJCLGQjJ3RDlqa2pqaDg/edit?pli=1&amp;amp;docId=0B-UAZ9CyJCLGNmpMeVpyYlZJUWc Relaisschaltung mit pädagogischer Erweiterung d. Universität Manchester]&lt;br /&gt;
* [http://elinux.org/RPi_Projects/PiFace_controlling_a_slot-car parallele englischsp. Dokumentation dieses Projekts mit anderem Schwerpunkt] &lt;br /&gt;
* [http://elinux.org/RPi_Projects englischsp. Projektliste zum RPi]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Raspberry Pi]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Mknot9</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=RPi_als_D/A-Wandler&amp;diff=74123</id>
		<title>RPi als D/A-Wandler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=RPi_als_D/A-Wandler&amp;diff=74123"/>
		<updated>2013-03-07T20:34:08Z</updated>

		<summary type="html">&lt;p&gt;Mknot9: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von mknot9&#039;&#039; (in Arbeit)&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
Oft wird ein Computer &#039;nur&#039; genutzt um darauf Software ablaufen zu lassen. Dessen Möglichkeit zur Steuerung von elektrischen und mechanischen Geräten wird dabei leicht übersehen.&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel richtet sich daher an Einsteiger, die mit dem [[Raspberry Pi]] (&#039;RPi&#039;) Grundlagen der Computersteuerung mit Relais und [[Spannungsteiler]]n nachvollziehen möchten. Es wird schrittweise dargestellt, wie mittels eines D/A-Wandlers (Digital/Analog-Wandler = Umwandlung von digitalen 1/0 Signale) die Steuerung einer stufenweise veränderbaren Ausgangsspannung aufgebaut werden kann.&lt;br /&gt;
&lt;br /&gt;
= Verwendete Hardware =&lt;br /&gt;
&lt;br /&gt;
== RPi in Kombination mit der &#039;PiFace&#039;-Karte als Bastelplattform ==&lt;br /&gt;
&lt;br /&gt;
Dank der einfachen Bauweise bietet sich der RPi mit seinen frei zugänglichen GPIO-Pins als ideale Bastelplattform an. Trotzdem kann es beim anfänglichen Experimentieren mit Schaltungen öfters zu kleinen Fehlern kommen, die schlimmstenfalls die empfindliche Elektronik des RPi dauerhaft beschädigen können.&lt;br /&gt;
&lt;br /&gt;
Daher wird bei diesem Projekt zusätzlich mit der &#039;PiFace[http://elinux.org/RPi_Expansion_Boards#Piface]&#039;-Karte gearbeitet, die man auf die GPIO-Pins stecken kann. Diese Erweiterungskarte verschaltet die GPIO-Pins auf je 8 digitale Ein- und Ausgänge sowie 2 Relais, die eine galvanische Trennung von Stromkreisen ermöglichen. Damit besteht auch für Einsteiger ein gewisser Schutz für die Steuerelektronik des RPi.&lt;br /&gt;
&lt;br /&gt;
Auch im weiteren Verlauf dieser Einführung soll noch auf eine Trennung der Stromkreise Wert gelegt werden, so dass für erste digitale Schaltexperimente ein Optokoppler genutzt wird. Die spätere Nutzung der &#039;Input Pins&#039; des PiFace um eine Steuerung der D/A-Wandlung durch bestimmte Ereignisse zu ermöglichen, erfolgt ebenfalls passiv.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Auch wenn mit vermeindlich &#039;sicheren&#039; Transformatoren gebastelt wird, muss stets bedacht werden, dass diese an einem 230V-Stromnetz betrieben werden und man eher einmal mehr als weniger prüfen sollte, ob man durch eventuelle Fehler mit lebensgefährlicher Spannung in Berührung kommt!&lt;br /&gt;
&lt;br /&gt;
== Auswahl eines Beispielprojektes ==&lt;br /&gt;
&lt;br /&gt;
Günstige Möglichkeiten ein Gerät zu finden, das mit analogen Spannungen arbeitet, bieten sich u.a. im Spielzeugbereich. Im Grunde eignet sich alles, was mit Batterien oder mit Gleichspannungen unter 24 V betrieben wird.&lt;br /&gt;
&lt;br /&gt;
Da jedoch ein Ziel das Steuern von analogen Spannungen ist, bietet sich insbesondere alles an, bei dem [[Potentiometer]] eingesetzt werden. Einen dieser &#039;Handregler&#039; sollte man übrig haben, da er von seinem Anschlusskabel abgetrennt werden muss, um den oft proprietären Steckanschluss nutzen zu können. In diesem Sinne wird hier eine handelsübliche Spielzeug-Autorennbahn mit Potentiometer-Handreglern genutzt.&lt;br /&gt;
&lt;br /&gt;
== Sonstige Bauteile ==&lt;br /&gt;
&lt;br /&gt;
Für die ersten Grundlagen (s. Teile 2 &amp;amp; 3) genügen bereits rund 2 m isolierter Draht, der nicht aus verdrillten feinen Adern (Litze) bestehen sollte, 50 cm nicht-isolierter Draht, einige niederohmige Widerstände (z.B. je 2 mal 100 Ohm, 80, 60, sowie 20) und ein &#039;Experimentierbrett&#039; (engl. [[Breadboard]]).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Grundlagen und Vorbereitung des Projekts =&lt;br /&gt;
&lt;br /&gt;
== Umwandlung von 1/0 zu Ein/Aus mit einem Relais ==&lt;br /&gt;
&lt;br /&gt;
Vom Prinzip her ist jede Umwandlung eines digitalen 0 oder 1 Signals (das über eine bestimmte Spannungsdifferenz festgelegt ist) in eine (nutzbare) Spannung bereits eine D/A-Wandlung. Dies wird schlicht so realisiert, dass mit einer Eingabe am RPi die Nutzspannung des &#039;Verbrauchers&#039; zunächst einfach an- und ausgeschaltet wird.&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung der zu steuernden Hardware ==&lt;br /&gt;
&lt;br /&gt;
a. Um Fehlerquellen auszuschliessen sollte zunächst (und ggf. auch später!) kurz getestet werden, ob der vorhandene Regler wie erwartet funktioniert.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pif_Con9.jpg|thumb|right|400px|Fixierung der Reglerkabel]]&lt;br /&gt;
b. Nach dem Trennen des Reglers von der Einspeisung (und ggf. Ziehen des Netzsteckers) muss das Regler-Kabel abgeschnitten werden (eher nahe beim Regler, da das Kabel bald bis zum Breadboard reichen soll). Die neuen Enden des Einspeiseteils werden abisoliert und auf dem Breadboard diagonal zueinander mit einigen Spalten Abstand fixiert. Auch können bereits die Drähte, die später zum RPi führen, jeweils in den passenden kontaktführenden Spalten eingesteckt werden, z. B. wie rechts zu sehen (die nicht beschrifteten Drähte können vorerst ignoriert werden):&lt;br /&gt;
&lt;br /&gt;
c. Nun bietet sich eine gute Gelegenheit die maximale Spannung am Nutzgerät zu messen. Man verbindet das Regler-Kabel (nun ohne Regler) wieder mit der Einspeisung und die offenen Enden der Drähte mit dem Messgerät, bei dem zunächst ein Messbereich von ca. 10-50 Volt gewählt werden sollte. Dies sollte dann z.B. 14,8 V anzeigen. Natürlich können auch die beiden offenen Enden einen kleinen Moment kurz geschlossen werden, man sollte aber bedenken, dass das zu regelnde Nutzgerät dann die maximal vorgesehene Spannung erhält (hier: maximales Tempo).&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung des RPi ==&lt;br /&gt;
&lt;br /&gt;
Es wird davon ausgegangen, dass entsprechend des zugehörigen &#039;manual&#039; das PiFace bereits auf den RPi gesteckt ist, die nötigen python-Bilbliotheken installiert sind und man sich im Terminal-Arbeitsverzeichnis &#039;pi&#039; befindet.&lt;br /&gt;
&lt;br /&gt;
a. Zunächst wird der PiFace-Emulator (im Terminal direkt aus dem Arbeitsverzeichnis) gestartet: &amp;lt;tt&amp;gt;piface/scripts/piface-emulator&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b. Wenn alles richtig installiert wurde, erscheint ein Fenster (unten links), bei dem die vorerst wichtigen blauen Signale am rechten Rand wie folgt angezeigt werden sollten: &lt;br /&gt;
 &lt;br /&gt;
[[Datei:RPi_PiF_em-scs.jpg|400px|Piface-Emulator im default-Zustand]] [[Datei:RPi_PiF_em_scs1.jpg|400px|Piface-Relais 1 auf &#039;1&#039; geschaltet]]&lt;br /&gt;
&lt;br /&gt;
c. Das rechte Fenster ergibt sich, wenn man nun im Fenster auf &amp;quot;Override Enable&amp;quot; und dann &amp;quot;Output Pin 1&amp;quot; klickt. Es müsste ein &amp;quot;Klack&amp;quot; vom Relais 1 zu hören sein sowie der Schaltzustand des unteren Relais 1 (das an den Output Pin 1 gekoppelt ist) auf die Verbindung der beiden unteren Anschlüsse wechseln. Zugleich wird das erste LED-Icon beim Output Pin 1 rot sowie das zugehörige LED-Icon blau.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pif_rel2.png|thumb|right|250px|Schema der Piface-Relais]]&lt;br /&gt;
d. Rechts ist der Schaltzustand der Relais, die zu Beginn genutzt werden, im Grundzustand dargestellt (jeweils der mittlere und obere Kontakt sind kurzgeschlossen, der jeweils untere Kontakt ist frei):&lt;br /&gt;
&lt;br /&gt;
e. Ein weiterer Klick auf &amp;quot;Output Pin 1&amp;quot; versetzt das Relais in den Ausgangszustand, der vor dem nächsten Schritt wieder eingestellt werden sollte.&lt;br /&gt;
&lt;br /&gt;
f. Das Relais läßt sich auch mittel eines Python-Scripts vom RPi aus ansteuern. Dazu wird folgende Textdatei &amp;quot;wandler.py&amp;quot; im Arbeitsverzeichnis abgespeichert und mit dem Befehl &amp;quot;&amp;lt;tt&amp;gt;python wandler.py&amp;lt;/tt&amp;gt;&amp;quot; gestartet:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler.py&lt;br /&gt;
&lt;br /&gt;
 from time import sleep&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
&lt;br /&gt;
 pfio.init()&lt;br /&gt;
&lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
 print &amp;quot;Strom an&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 sleep(2)&lt;br /&gt;
&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Strom aus&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Nach dem Absetzen des Befehls wechselt nun das blaue Signal an Relais 1 für 2 Sekunden und das Relais klackt entsprechend.&lt;br /&gt;
&lt;br /&gt;
== Einsatz eines Relais&#039; zur Umsetzung von Spannungsänderungen ==&lt;br /&gt;
&lt;br /&gt;
a. Ist das Relais wieder im Ausgangszustand, befestigt man nun einen der vom Breadboard führenden Drähte am unteren und einen am mittleren Relaiseingang (im Moment ist die Polarität noch egal). Zunächst sollte nichts passieren (das Relais hält diesen ja Stromkreis noch offen).&lt;br /&gt;
&lt;br /&gt;
b. Startet man aber das Script wieder (&amp;lt;tt&amp;gt;python wandler.py&amp;lt;/tt&amp;gt;) oder klickt auf &#039;Output Pin 1&#039; wird der Nutzstromkreis geschlossen. Nochmals aufgepasst: unser Nutzer erhält wieder die maximal vorgesehene Spannung - also besser vorher im Script &amp;quot;&amp;lt;tt&amp;gt;sleep(0.3)&amp;lt;/tt&amp;gt;&amp;quot; setzen und speichern.&lt;br /&gt;
&lt;br /&gt;
c. Im Prinzip ist damit die programmgesteuerte Umsetzung eines 0/1 Signals in z.B. eine 0V/15V Spannung erreicht.&lt;br /&gt;
&lt;br /&gt;
d. Da wir bald verschiedene Steuerspannungen schalten wollen, geht es jetzt darum herauszufinden, bei welcher Spannung unser Nutzgerät gerade noch bewegt wird. Dies probiert man aus - mit dem kleinsten Widerstand beginnend: indem einer der Drähte in eine freie Breadboardspalte gesteckt wird und aus dieser Spalte der Widerstand zu dem &#039;alten&#039; Steckplatz des Drahtes geführt wird. Nun startet man jeweils das Script bis der Widerstand so hoch ist, dass die Anlaufspannung beim Nutzgerätes gut ausreicht, eine Reaktion des Nutzgerät (Fahrzeug bewegt sich) zu bewirken (z.B. bei 50 Ohm beträgt der Strom ca. 130 mA während ohne 190 mA fliessen).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Ansteuerung von 3 Schaltstufen =&lt;br /&gt;
&lt;br /&gt;
== Kombination von 2 Relais ==&lt;br /&gt;
&lt;br /&gt;
[[Bild:ZrelMww2.png|thumb|right|250px|Beschaltung der Relais]] a. Die einfachste Stufe der weiteren Verschaltung erreicht man, indem der Widerstand mit einem 2. Relais überbrückt wird. Relais 1 kann dann als &#039;Hauptschalter&#039;, Relais 2 als Spannungsumschalter genutzt werden:&lt;br /&gt;
&lt;br /&gt;
b. Diese Beschaltung kann sogleich mit dem PiFace-Emulator ausprobiert werden. Damit können wir bereits 3 Schaltstufen steuern: keine, verminderte und volle Spannung.&lt;br /&gt;
&lt;br /&gt;
c. Theoretisch liesse sich auch noch eine 4. Spannungsstufe erzeugen, da mit 2 &#039;Bits&#039; (Ein/Aus bei 2 Relais) bereits 4 verschiedene Signale darstellbar sind. Beim jetzigen Aufbau werden aber lediglich die (pin1,pin2)-Signale (0,0), (1,0) und (1,1) &#039;genutzt&#039;, da Relais 1 als Hauptschalter vorgesehen ist und die Kombination (0,1) so nicht ausgewertet wird.&lt;br /&gt;
&lt;br /&gt;
== Programmgesteuerte Schaltung von 2 Relais ==&lt;br /&gt;
&lt;br /&gt;
a. Mit einem veränderten python-Script &amp;quot;wandler2.py&amp;quot; ist auch die programmgesteuerte Schaltung möglich. Dabei werden zusätzlich die Tasten 1 und 2 des PiFace genutzt, um nach dem Start des Scripts (&amp;lt;tt&amp;gt;python wandler2.py&amp;lt;/tt&amp;gt;) den Hauptschalter (Relais 1) zu steuern:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler2.py&lt;br /&gt;
 &lt;br /&gt;
 from time import sleep&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
 pfio.init()&lt;br /&gt;
 &lt;br /&gt;
 taste_1=0&lt;br /&gt;
 taste_2=0&lt;br /&gt;
 intervall_a=0.1&lt;br /&gt;
 intervall_b=0.5&lt;br /&gt;
 # Die Intervalle bestimmen die Schaltzeit für volle/verminderte Spannung&lt;br /&gt;
 &lt;br /&gt;
 print &amp;quot;Zum Start Taste 1 drücken, zum Stoppen Taste 2&amp;quot;&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 while taste_1 == 0:&lt;br /&gt;
   sleep(intervall_a)&lt;br /&gt;
   taste_1=pfio.digital_read(1)&lt;br /&gt;
&lt;br /&gt;
 # Der o.g. &#039;sleep&#039;-Befehl bestimmt die Abfragepausen für Taste 1&lt;br /&gt;
 &lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
 print &amp;quot;Strom an!&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 while taste_2 == 0:&lt;br /&gt;
   pfio.digital_write(2,1)&lt;br /&gt;
   sleep(intervall_a)&lt;br /&gt;
   pfio.digital_write(2,0)&lt;br /&gt;
   sleep(intervall_b)&lt;br /&gt;
   taste_2=pfio.digital_read(2)&lt;br /&gt;
 &lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Strom aus!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
b. Falls beim Ausprobieren von Script-Änderungen mal was schief geht, kann das Script stets auch mit der Tastenkombination (CNTRL-C) gestoppt werden. U.U. muss dann noch zusätzlich Relais 1 und/oder 2 via Emulator zurückgesetzt werden.&lt;br /&gt;
&lt;br /&gt;
c. Beim Verändern des Scripts fällt bald auf, dass die bisherige Programmsteuerung keine direkte Möglichkeit vorsieht, auf Ereignisse zu reagieren. Immerhin wird ein mechanisches Gerät gesteuert, bei dem mit Ausfällen, Fertigungstoleranzen, Umwelteinflüssen etc. zu rechnen ist (im Script wird dies bislang &#039;nur&#039; durch die Abbruchbedingung &#039;Taste 2&#039; berücksichtigt).&lt;br /&gt;
&lt;br /&gt;
== Einfache Sensor-Signale als steuernde Elemente eines Programms ==&lt;br /&gt;
&lt;br /&gt;
a. Eine wichtige Anwendung von D/A-Steuerungen ist die mögliche Reaktion dieser Steuerung auf &#039;äußere&#039; Ereignisse, die z.B. mit Hilfe von Sensoren leistbar ist.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Einf_Sens.jpg|thumb|right|250px|einfacher Sensor]]b. Für unsere Zwecke genügt zunächst ein sehr einfacher Sensor, der ein 0- oder 1-Signal liefert und idealerweise direkt am &#039;Input Pin 1&#039; des PiFace angeschlossen werden kann. So liegt beim Input Pin 1 das Signal &#039;1&#039; an, wenn eine Verbindung zu &#039;Input GND&#039; besteht.&lt;br /&gt;
Z.B. können 2 unisolierte Drähte so plaziert werden, dass ein vorbeifahrendes Fahrzeug einen von ihnen genügend bewegt um den Kontakt kurze Zeit zu öffnen. Genau dann liefert dieser &#039;Sensor&#039; das Signal &#039;0&#039;. Eine - die Schwerkraft nutzende - mögliche Bauform ist rechts abgebildet ;-)&lt;br /&gt;
&lt;br /&gt;
c. Natürlich werden zusätzlich 2 isolierte Drähte benötigt, um jeden der beiden offenen Drähte geschützt mit Input Pin 1 und Input GND zu verbinden.&lt;br /&gt;
&lt;br /&gt;
d. Bei jeder Durchfahrt liefert der Sensor nun ein &#039;0&#039;-Signal, was im Script sowohl für eine Zeitmessung als auch für ein &#039;Schaltintervall-Array&#039; genutzt werden kann. Dort können abwechselnd für beide Spannungen Zeiten (die in etwa zum jeweiligen Streckenabschnitt passen) &#039;programmiert&#039; werden. Statt Taste 1 wird nun der Sensor ausgewertet (wobei Taste 1 als Sensor-Ersatz insoweit genutzt werden kann, dass sie gedrückt bleiben bzw. kurz losgelassen werden muss). Zur genaueren Zeitmessung wird noch das modul &#039;clock&#039; benötigt. &amp;quot;&amp;lt;tt&amp;gt;wandler3.py&amp;lt;/tt&amp;gt;&amp;quot; könnte also so aussehen:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler3.py&lt;br /&gt;
 &lt;br /&gt;
 from time import clock&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
 sensor_1=1&lt;br /&gt;
 sensor_2=0&lt;br /&gt;
 rundenzahl=0&lt;br /&gt;
 v_wechsel=0&lt;br /&gt;
 vorrunde=0&lt;br /&gt;
 index_zaehler=1&lt;br /&gt;
 &lt;br /&gt;
 zeit_array=[0,0.2,0.4,0.2,0.4,0.2,0.4,0.2,5,0.2,6]&lt;br /&gt;
 # dieses array enthält die sek. bis zum Spannungswechsel&lt;br /&gt;
&lt;br /&gt;
 array_laenge=9&lt;br /&gt;
 # legt fest, wie viel Werte des arrays genutzt werden sollen&lt;br /&gt;
 &lt;br /&gt;
 sensor_aus=1.3&lt;br /&gt;
 # bis der Sensor sicher in die Ruhestellung kippt, wird er nicht ausgelesen&lt;br /&gt;
  &lt;br /&gt;
 pfio.init()&lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
&lt;br /&gt;
 # das Fahrzeug wird langsam zum Start (=Sensor) bewegt&lt;br /&gt;
 while sensor_1 == 1 :&lt;br /&gt;
   sensor_1=pfio.digital_read(1)&lt;br /&gt;
  &lt;br /&gt;
 print &amp;quot;fliegender Start... zum Beenden Taste 2 drücken&amp;quot;&lt;br /&gt;
 print &amp;quot;Runde Nr., Ges.Zeit, Rundenzeit, mittlere Rundenzeit&amp;quot;&lt;br /&gt;
 start_zeit=clock()&lt;br /&gt;
 runden_start=start_zeit&lt;br /&gt;
  &lt;br /&gt;
 while sensor_2 == 0 :&lt;br /&gt;
   sensor_2=pfio.digital_read(2)&lt;br /&gt;
   v_wechsel=1-v_wechsel&lt;br /&gt;
   pfio.digital_write(2,v_wechsel)&lt;br /&gt;
   sensor_zeit=clock()&lt;br /&gt;
  &lt;br /&gt;
   while zeit_array[index_zaehler]+sensor_zeit &amp;gt; clock() :&lt;br /&gt;
     if runden_start+sensor_aus &amp;lt; clock() :&lt;br /&gt;
 &lt;br /&gt;
       sensor_1=pfio.digital_read(1) &lt;br /&gt;
       if sensor_1 == 0 :&lt;br /&gt;
         rundenzahl=rundenzahl+1&lt;br /&gt;
         runden_start=clock()&lt;br /&gt;
         zeit=runden_start-start_zeit&lt;br /&gt;
         print rundenzahl, zeit, zeit-vorrunde, zeit/rundenzahl&lt;br /&gt;
         vorrunde=zeit&lt;br /&gt;
         sensor_zeit=0&lt;br /&gt;
         index_zaehler=0&lt;br /&gt;
         v_wechsel=0&lt;br /&gt;
  &lt;br /&gt;
   index_zaehler=index_zaehler+1&lt;br /&gt;
   if index_zaehler &amp;gt; array_laenge :&lt;br /&gt;
     sensor_2=1&lt;br /&gt;
     print &amp;quot;array-Ende erreicht!&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Outp 1 &amp;amp; 2 auf 0!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wird das Array-Ende erreicht, wurden entweder zu wenige Einträge vorgesehen oder es befindet sich kein Fahrzeug (mehr) auf der Strecke, das den Sensor und damit des Zurücksetzen des Arrays auslösen konnte.&lt;br /&gt;
&lt;br /&gt;
e. Das Array ist an die jeweilige Strecke anzupassen, wobei der vorderste Eintrag ungenutzt bleibt und dann mit der Dauer für maximale Spannung begonnen wird. Solange man mit Relais arbeitet, sollten die Schaltzeiten nicht zu kurz sein (&amp;gt;0.1 sek), da diese eine gewisse mechanische Trägheit besitzen.&lt;br /&gt;
&lt;br /&gt;
f. Eben diese mechanische Beschaffenheit der Relais (Verschleiß) ist auch ein guter Grund, auf &#039;volle&#039; digitale Signalumwandlung umzustellen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Optokoppler als Ersatz für Relais =&lt;br /&gt;
&lt;br /&gt;
Ähnlich wie ein Relais dient ein [[Optokoppler]] dazu, eine Signalübertragung zwischen zwei getrennten Stromkreisen zu ermöglichen. Hier liegt der Einsatz von Optokopplern nahe, da sie schneller schalten und keine beweglichen Teile besitzen. Für unsere Zwecke benötigen wir nun als zusätzliche Elemente: Optokoppler (CNY 17-4), npn-[[Transistor]]en (BC 337-40) zur Signalverstärkung sowie einige Widerstände im Bereich von 2k und 400 Ohm. &lt;br /&gt;
&lt;br /&gt;
== Kaskadierung von Transistoren zur Signalverstärkung ==&lt;br /&gt;
&lt;br /&gt;
a. Entsprechend Schritt 2.4.d. (ein Relais bei 50 Ohm) wird zunächst ein Optokoppler eingesetzt, dessen Signal durch einen Transistor verstärkt wird, um die &#039;Grundspannung&#039; zu schalten (Pin 3 und 6 beim Optokoppler sollten unbeschaltet bleiben, allein der &#039;Lichtstrom&#039; reicht für eine Durchschaltung aus):&lt;br /&gt;
&lt;br /&gt;
[[Bild:PiF_CNY_BC_1.png|400px|Optokoppler mit Transistor]]&lt;br /&gt;
&lt;br /&gt;
b. Da immer mit einer gewissen Toleranz bei allen Komponenten zu rechnen ist, kann es sein, dass u.U. die Widerstände etwas größer oder kleiner gewählt werden müssen. Beim Ausprobieren sollte man hier in 10% Schritten variieren.&lt;br /&gt;
&lt;br /&gt;
c. Bei Austesten mit Emulator oder Script ist auch zu beachten, dass nun &#039;Output Pin 8&#039; genutzt wird, da dieser nicht mit den Relais verschaltet ist.&lt;br /&gt;
&lt;br /&gt;
== Umsetzung von 3 Schaltstufen mit Optokopplern ==&lt;br /&gt;
&lt;br /&gt;
a. Entsprechend dem Vorgehen beim Relais kann nun auch der kleine Widerstand zusätzlich beschaltet werden um seine gesteuerte Überbrückung zu ermöglichen. Da hier eine relativ geringe Spannung aufgeschaltet wird, kann zu Beginn eine Diode eingesetzt werden, die die Schaltstufe &#039;maximale Spannung&#039; anzeigt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:SmPiFu2ou2T.png|400px|Kombination von 2 Optokopplern]]&lt;br /&gt;
&lt;br /&gt;
b. Vor dem Testen ist wieder zu beachten, dass nun zusätzlich &#039;Output Pin 7&#039; genutzt wird (statt Output Pin 2).&lt;br /&gt;
&lt;br /&gt;
c. Eine mögliche Realisierung sieht so aus:[http://youtu.be/xQ7N-PrIULk].&lt;br /&gt;
&lt;br /&gt;
== Zusätzliche Erhöhung der Schaltstufen bei D/A-Wandlern ==&lt;br /&gt;
&lt;br /&gt;
a. Zwar benötigen wir in unserem speziellen Beispiel eine &#039;Grundspannung&#039;, die sich dahingehend auswirkt, dass - wie unter 3.1.c. erwähnt - eine Signalkombination nicht ausgewertet wird, aber mit jeder weiteren Schaltstufe würde sich dieses Problem (theoretisch) relativieren, da bei geschickter Auswahl der Widerstände (z.B. im Verhältnis 1 zu 2) jeweils eine Verdoppelung der Kombinationsmöglichkeiten erreichbar ist.&lt;br /&gt;
&lt;br /&gt;
b. Wird hier der 50 Ohm Widerstand asymmetrisch geteilt (z.B. 15 + 35 Ohm, s.a. [[Spannungsteiler]]) um dort ein weiteres Signal umsetzen zu können, ergeben sich direkt folgende 5 Schaltstufen (aus, 50, 35, 15 und 0 Ohm) u.s.w.:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Sm3ou3t2.png|400px|Erhöhung der Schaltstufen]]&lt;br /&gt;
&lt;br /&gt;
c. Zur Ansteuerung dieser Schaltstufen wäre das Script so zu ändern, dass nun zwischen mehr als 2 Stufen gewechselt werden kann und im Array entsprechende Zusatzdaten vorgegeben und ausgelesen werden. Mehr als diese Stufen sind im konkreten Fall aber nicht sinnvoll, da die entstehende Verlustleistung in der Schaltung die maximal verfügbare Leistung reduziert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Weiterführende Ideen =&lt;br /&gt;
&lt;br /&gt;
== Hardwareseitige Ausbauvarianten ==&lt;br /&gt;
&lt;br /&gt;
Die Ausbaumöglichkeiten dieses Projektes sind vielfältig:&lt;br /&gt;
&lt;br /&gt;
- beispielhafte Umsetzung einer differenzierten Abstufung mittels mittels einer logarithmischen Einteilung oder eines möglichst oft durch 2 teilbaren Anfangswertes und der Teiler (640 Ohm, 320, 160...);&lt;br /&gt;
&lt;br /&gt;
- Nachbau des Projekts mit einem Microcontroller (ggf. mit LCD-Anzeige);&lt;br /&gt;
&lt;br /&gt;
- Umbau der Steuerung mit dem Ziel, sie direkt an die GPIO-Pins des RPi anzuschließen;&lt;br /&gt;
&lt;br /&gt;
- Ergänzung um eine Sensorik, die in diesem Beispiel eine Rückmeldung liefert, ob ein Verbraucher aktiv ist oder nicht (Fahrzeug noch auf der Strecke?);&lt;br /&gt;
&lt;br /&gt;
- Einsatz anderer Sensortechniken und/oder mehrerer Sensoren zur Optimierung der Schnelligkeit oder parallelen Steuerung eines 2. Fahrzeuges;&lt;br /&gt;
&lt;br /&gt;
== Softwareseitige Ausbauvarianten ==&lt;br /&gt;
&lt;br /&gt;
- Optimierung des Scripts, indem die Sensor-Abfrage über einen &#039;Listener&#039; umgesetzt wird;&lt;br /&gt;
&lt;br /&gt;
- Erweiterung des Scripts um eine GUI mit Hilfe der python-lib Tkinter, um einen Nutzerzugriff auf das Steuerarray und/oder eine &#039;Verwaltung&#039; mehrerer Fahrzeuge;&lt;br /&gt;
&lt;br /&gt;
- Einbindung eines Web-Interface um eine &#039;Fernsteuerung&#039; zu ermöglichen...&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [http://hackaday.com/2013/01/23/replacement-controllers-for-slot-car-racing/ ähnliches Projekt bei &#039;hackaday&#039;] &lt;br /&gt;
* [https://docs.google.com/folder/d/0B-UAZ9CyJCLGQjJ3RDlqa2pqaDg/edit?pli=1&amp;amp;docId=0B-UAZ9CyJCLGNmpMeVpyYlZJUWc Relaisschaltung mit pädagogischer Erweiterung d. Universität Manchester]&lt;br /&gt;
* [http://elinux.org/RPi_Projects/PiFace_controlling_a_slot-car parallele englischsp. Dokumentation dieses Projekts mit anderem Schwerpunkt] &lt;br /&gt;
* [http://elinux.org/RPi_Projects englischsp. Projektliste zum RPi]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Raspberry Pi]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Mknot9</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=RPi_als_D/A-Wandler&amp;diff=74113</id>
		<title>RPi als D/A-Wandler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=RPi_als_D/A-Wandler&amp;diff=74113"/>
		<updated>2013-03-07T19:17:30Z</updated>

		<summary type="html">&lt;p&gt;Mknot9: /* Hardwareseitige Ausbauvarianten */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von mknot9&#039;&#039; (in Arbeit)&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
Oft wird ein Computer &#039;nur&#039; genutzt um darauf Software ablaufen zu lassen. Dessen Möglichkeit zur Steuerung von elektrischen und mechanischen Geräten wird dabei leicht übersehen.&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel richtet sich daher an Einsteiger, die mit dem [[Raspberry Pi]] (&#039;RPi&#039;) Grundlagen der Computersteuerung mit Relais und [[Spannungsteiler]]n nachvollziehen möchten. Es wird schrittweise dargestellt, wie mittels eines D/A-Wandlers (Digital/Analog-Wandler = Umwandlung von digitalen 1/0 Signale) die Steuerung einer stufenweise veränderbaren Ausgangsspannung nachgebaut werden kann.&lt;br /&gt;
&lt;br /&gt;
= Verwendete Hardware =&lt;br /&gt;
&lt;br /&gt;
== RPi in Kombination mit der &#039;PiFace&#039;-Karte als Bastelplattform ==&lt;br /&gt;
&lt;br /&gt;
Dank der einfachen Bauweise bietet sich der RPi mit seinen frei zugänglichen GPIO-Pins als ideale Bastelplattform an. Trotzdem kann es beim Experimentieren mit Schaltungen öfters zu kleinen Fehlern kommen, die schlimmstenfalls die empfindliche Elektronik des RPi dauerhaft beschädigen können.&lt;br /&gt;
&lt;br /&gt;
Daher wird bei diesem Projekt zusätzlich mit der &#039;PiFace[http://elinux.org/RPi_Expansion_Boards#Piface]&#039;-Karte gearbeitet, die man auf die GPIO-Pins stecken kann. Diese Erweiterungskarte verschaltet die GPIO-Pins auf je 8 digitale Ein- und Ausgänge, sowie 2 Relais, die eine galvanische Trennung von Stromkreisen ermöglichen. Damit besteht auch für Einsteiger ein gewisser Schutz für die Steuerelektronik des RPi.&lt;br /&gt;
&lt;br /&gt;
Auch im weiteren Verlauf dieser Einführung soll noch auf eine Trennung der Stromkreise Wert gelegt werden, so dass für erste digitale Schaltexperimente ein Optokoppler genutzt wird. Die spätere Nutzung der &#039;Input Pins&#039; des PiFace um eine Steuerung der D/A-Wandlung durch bestimmte Ereignisse zu ermöglichen, erfolgt ebenfalls passiv.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Auch wenn mit vermeindlich &#039;sicheren&#039; Transformatoren gebastelt wird, muss stets bedacht werden, dass diese an einem 230V-Stromnetz betrieben werden und man eher einmal mehr als weniger prüfen sollte, ob man durch eventuelle Fehler mit lebensgefährlicher Spannung in Berührung kommt!&lt;br /&gt;
&lt;br /&gt;
== Auswahl eines Beispielprojektes ==&lt;br /&gt;
&lt;br /&gt;
Günstige Möglichkeiten ein Gerät zu finden, das mit analogen Spannungen arbeitet, bieten sich u.a. im Spielzeugbereich. Im Grunde eignet sich alles, was mit Batterien oder mit Gleichspannungen unter 24 V betrieben wird.&lt;br /&gt;
&lt;br /&gt;
Da jedoch ein Ziel das Steuern von analogen Spannungen ist, bietet sich insbesondere alles an, bei dem [[Potentiometer]] eingesetzt werden. Einen dieser &#039;Handregler&#039; sollte man übrig haben, da er von seinem Anschlusskabel abgetrennt werden muss, um den oft proprietären Steckanschluss nutzen zu können. In diesem Sinne wird hier eine handelsübliche Spielzeug-Autorennbahn mit Potentiometer-Handreglern genutzt.&lt;br /&gt;
&lt;br /&gt;
== Sonstige Bauteile ==&lt;br /&gt;
&lt;br /&gt;
Für die ersten Grundlagen (s. Teile 2 &amp;amp; 3) genügen bereits rund 2 m isolierter Draht, der nicht aus verdrillten feinen Adern (Litze) bestehen sollte, 50 cm nicht-isolierter Draht, einige niederohmige Widerstände (z.B. je 2 mal 100 Ohm, 80, 60, sowie 20) und ein &#039;Experimentierbrett&#039; (engl. [[Breadboard]]).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Grundlagen und Vorbereitung des Projekts =&lt;br /&gt;
&lt;br /&gt;
== Umwandlung von 1/0 zu Ein/Aus mit einem Relais ==&lt;br /&gt;
&lt;br /&gt;
Vom Prinzip her ist jede Umwandlung eines digitalen 0 oder 1 Signals (das über eine bestimmte Spannungsdifferenz festgelegt ist) in eine (nutzbare) Spannung bereits eine D/A-Wandlung. Dies wird schlicht so realisiert, dass mit einer Eingabe am RPi die Nutzspannung des &#039;Verbrauchers&#039; zunächst einfach an- und ausgeschaltet wird.&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung der zu steuernden Hardware ==&lt;br /&gt;
&lt;br /&gt;
a. Um Fehlerquellen auszuschliessen sollte zunächst (und ggf. auch später!) kurz getestet werden, ob der vorhandene Regler wie erwartet funktioniert.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pif_Con9.jpg|thumb|right|400px|Fixierung der Reglerkabel]]&lt;br /&gt;
b. Nach dem Trennen des Reglers von der Einspeisung (und ggf. Ziehen des Netzsteckers) muss das Regler-Kabel abgeschnitten werden (eher nahe beim Regler, da das Kabel bald bis zum Breadboard reichen soll). Die neuen Enden des Einspeiseteils werden abisoliert und auf dem Breadboard diagonal zueinander mit einigen Spalten Abstand fixiert. Auch können bereits die Drähte, die später zum RPi führen, jeweils in den passenden kontaktführenden Spalten eingesteckt werden, z. B. wie rechts zu sehen (die nicht beschrifteten Drähte können vorerst ignoriert werden):&lt;br /&gt;
&lt;br /&gt;
c. Nun bietet sich eine gute Gelegenheit die maximale Spannung am Nutzgerät zu messen. Man verbindet das Regler-Kabel (nun ohne Regler) wieder mit der Einspeisung und die offenen Enden der Drähte mit dem Messgerät, bei dem zunächst ein Messbereich von ca. 10-50 Volt gewählt werden sollte. Dies sollte dann z.B. 14,8 V anzeigen. Natürlich können auch die beiden offenen Enden einen kleinen Moment kurz geschlossen werden, man sollte aber bedenken, dass das zu regelnde Nutzgerät dann die maximal vorgesehene Spannung erhält (hier: maximales Tempo).&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung des RPi ==&lt;br /&gt;
&lt;br /&gt;
Es wird davon ausgegangen, dass entsprechend des zugehörigen &#039;manual&#039; das PiFace bereits auf den RPi gesteckt ist, die nötigen python-Bilbliotheken installiert sind und man sich im Terminal-Arbeitsverzeichnis &#039;pi&#039; befindet.&lt;br /&gt;
&lt;br /&gt;
a. Zunächst wird der PiFace-Emulator (im Terminal direkt aus dem Arbeitsverzeichnis) gestartet: &amp;lt;tt&amp;gt;piface/scripts/piface-emulator&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b. Wenn alles richtig installiert wurde, erscheint ein Fenster (unten links), bei dem die vorerst wichtigen blauen Signale am rechten Rand wie folgt angezeigt werden sollten: &lt;br /&gt;
 &lt;br /&gt;
[[Datei:RPi_PiF_em-scs.jpg|400px|Piface-Emulator im default-Zustand]] [[Datei:RPi_PiF_em_scs1.jpg|400px|Piface-Relais 1 auf &#039;1&#039; geschaltet]]&lt;br /&gt;
&lt;br /&gt;
c. Das rechte Fenster ergibt sich, wenn man nun im Fenster auf &amp;quot;Override Enable&amp;quot; und dann &amp;quot;Output Pin 1&amp;quot; klickt. Es müsste ein &amp;quot;Klack&amp;quot; vom Relais 1 zu hören sein sowie der Schaltzustand des unteren Relais 1 (das an den Output Pin 1 gekoppelt ist) auf die Verbindung der beiden unteren Anschlüsse wechseln. Zugleich wird das erste LED-Icon beim Output Pin 1 rot sowie das zugehörige LED-Icon blau.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pif_rel2.png|thumb|right|250px|Schema der Piface-Relais]]&lt;br /&gt;
d. Rechts ist der Schaltzustand der Relais, die zu Beginn genutzt werden, im Grundzustand dargestellt (jeweils der mittlere und obere Kontakt sind kurzgeschlossen, der jeweils untere Kontakt ist frei):&lt;br /&gt;
&lt;br /&gt;
e. Ein weiterer Klick auf &amp;quot;Output Pin 1&amp;quot; versetzt das Relais in den Ausgangszustand, der vor dem nächsten Schritt wieder eingestellt werden sollte.&lt;br /&gt;
&lt;br /&gt;
f. Das Relais läßt sich auch mittel eines Python-Scripts vom RPi aus ansteuern. Dazu wird folgende Textdatei &amp;quot;wandler.py&amp;quot; im Arbeitsverzeichnis abgespeichert und mit dem Befehl &amp;quot;&amp;lt;tt&amp;gt;python wandler.py&amp;lt;/tt&amp;gt;&amp;quot; gestartet:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler.py&lt;br /&gt;
&lt;br /&gt;
 from time import sleep&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
&lt;br /&gt;
 pfio.init()&lt;br /&gt;
&lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
 print &amp;quot;Strom an&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 sleep(2)&lt;br /&gt;
&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Strom aus&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Nach dem Absetzen des Befehls wechselt nun das blaue Signal an Relais 1 für 2 Sekunden und das Relais klackt entsprechend.&lt;br /&gt;
&lt;br /&gt;
== Einsatz eines Relais&#039; zur Umsetzung von Spannungsänderungen ==&lt;br /&gt;
&lt;br /&gt;
a. Ist das Relais wieder im Ausgangszustand, befestigt man nun einen der vom Breadboard führenden Drähte am unteren und einen am mittleren Relaiseingang (im Moment ist die Polarität noch egal). Zunächst sollte nichts passieren (das Relais hält diesen ja Stromkreis noch offen).&lt;br /&gt;
&lt;br /&gt;
b. Startet man aber das Script wieder (&amp;lt;tt&amp;gt;python wandler.py&amp;lt;/tt&amp;gt;) oder klickt auf &#039;Output Pin 1&#039; wird der Nutzstromkreis geschlossen. Nochmals aufgepasst: unser Nutzer erhält wieder die maximal vorgesehene Spannung - also besser vorher im Script &amp;quot;&amp;lt;tt&amp;gt;sleep(0.3)&amp;lt;/tt&amp;gt;&amp;quot; setzen und speichern.&lt;br /&gt;
&lt;br /&gt;
c. Im Prinzip ist damit die programmgesteuerte Umsetzung eines 0/1 Signals in z.B. eine 0V/15V Spannung erreicht.&lt;br /&gt;
&lt;br /&gt;
d. Da wir bald verschiedene Steuerspannungen schalten wollen, geht es jetzt darum herauszufinden, bei welcher Spannung unser Nutzgerät gerade noch bewegt wird. Dies probiert man aus - mit dem kleinsten Widerstand beginnend: indem einer der Drähte in eine freie Breadboardspalte gesteckt wird und aus dieser Spalte der Widerstand zu dem &#039;alten&#039; Steckplatz des Drahtes geführt wird. Nun startet man jeweils das Script bis der Widerstand so hoch ist, dass die Anlaufspannung beim Nutzgerätes gut ausreicht, eine Reaktion des Nutzgerät (Fahrzeug bewegt sich) zu bewirken (z.B. bei 50 Ohm beträgt der Strom ca. 130 mA während ohne 190 mA fliessen).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Ansteuerung von 3 Schaltstufen =&lt;br /&gt;
&lt;br /&gt;
== Kombination von 2 Relais ==&lt;br /&gt;
&lt;br /&gt;
[[Bild:ZrelMww2.png|thumb|right|250px|Beschaltung der Relais]] a. Die einfachste Stufe der weiteren Verschaltung erreicht man, indem der Widerstand mit einem 2. Relais überbrückt wird. Relais 1 kann dann als &#039;Hauptschalter&#039;, Relais 2 als Spannungsumschalter genutzt werden:&lt;br /&gt;
&lt;br /&gt;
b. Diese Beschaltung kann sogleich mit dem PiFace-Emulator ausprobiert werden. Damit können wir bereits 3 Schaltstufen steuern: keine, verminderte und volle Spannung.&lt;br /&gt;
&lt;br /&gt;
c. Theoretisch liesse sich auch noch eine 4. Spannungsstufe erzeugen, da mit 2 &#039;Bits&#039; (Ein/Aus bei 2 Relais) bereits 4 verschiedene Signale darstellbar sind. Beim jetzigen Aufbau werden aber lediglich die (pin1,pin2)-Signale (0,0), (1,0) und (1,1) &#039;genutzt&#039;, da Relais 1 als Hauptschalter vorgesehen ist und die Kombination (0,1) so nicht ausgewertet wird.&lt;br /&gt;
&lt;br /&gt;
== Programmgesteuerte Schaltung von 2 Relais ==&lt;br /&gt;
&lt;br /&gt;
a. Mit einem veränderten python-Script &amp;quot;wandler2.py&amp;quot; ist auch die programmgesteuerte Schaltung möglich. Dabei werden zusätzlich die Tasten 1 und 2 des PiFace genutzt, um nach dem Start des Scripts (&amp;lt;tt&amp;gt;python wandler2.py&amp;lt;/tt&amp;gt;) den Hauptschalter (Relais 1) zu steuern:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler2.py&lt;br /&gt;
 &lt;br /&gt;
 from time import sleep&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
 pfio.init()&lt;br /&gt;
 &lt;br /&gt;
 taste_1=0&lt;br /&gt;
 taste_2=0&lt;br /&gt;
 intervall_a=0.1&lt;br /&gt;
 intervall_b=0.5&lt;br /&gt;
 # Die Intervalle bestimmen die Schaltzeit für volle/verminderte Spannung&lt;br /&gt;
 &lt;br /&gt;
 print &amp;quot;Zum Start Taste 1 drücken, zum Stoppen Taste 2&amp;quot;&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 while taste_1 == 0:&lt;br /&gt;
   sleep(intervall_a)&lt;br /&gt;
   taste_1=pfio.digital_read(1)&lt;br /&gt;
&lt;br /&gt;
 # Der o.g. &#039;sleep&#039;-Befehl bestimmt die Abfragepausen für Taste 1&lt;br /&gt;
 &lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
 print &amp;quot;Strom an!&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 while taste_2 == 0:&lt;br /&gt;
   pfio.digital_write(2,1)&lt;br /&gt;
   sleep(intervall_a)&lt;br /&gt;
   pfio.digital_write(2,0)&lt;br /&gt;
   sleep(intervall_b)&lt;br /&gt;
   taste_2=pfio.digital_read(2)&lt;br /&gt;
 &lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Strom aus!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
b. Falls beim Ausprobieren von Script-Änderungen mal was schief geht, kann das Script stets auch mit der Tastenkombination (CNTRL-C) gestoppt werden. U.U. muss dann noch zusätzlich Relais 1 und/oder 2 via Emulator zurückgesetzt werden.&lt;br /&gt;
&lt;br /&gt;
c. Beim Verändern des Scripts fällt bald auf, dass die bisherige Programmsteuerung keine direkte Möglichkeit vorsieht, auf Ereignisse zu reagieren. Immerhin wird ein mechanisches Gerät gesteuert, bei dem mit Ausfällen, Fertigungstoleranzen, Umwelteinflüssen etc. zu rechnen ist (im Script wird dies bislang &#039;nur&#039; durch die Abbruchbedingung &#039;Taste 2&#039; berücksichtigt).&lt;br /&gt;
&lt;br /&gt;
== Einfache Sensor-Signale als steuernde Elemente eines Programms ==&lt;br /&gt;
&lt;br /&gt;
a. Eine wichtige Anwendung von D/A-Steuerungen ist die mögliche Reaktion dieser Steuerung auf &#039;äußere&#039; Ereignisse, die z.B. mit Hilfe von Sensoren leistbar ist.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Einf_Sens.jpg|thumb|right|250px|einfacher Sensor]]b. Für unsere Zwecke genügt zunächst ein sehr einfacher Sensor, der ein 0- oder 1-Signal liefert und idealerweise direkt am &#039;Input Pin 1&#039; des PiFace angeschlossen werden kann. So liegt beim Input Pin 1 das Signal &#039;1&#039; an, wenn eine Verbindung zu &#039;Input GND&#039; besteht.&lt;br /&gt;
Z.B. können 2 unisolierte Drähte so plaziert werden, dass ein vorbeifahrendes Fahrzeug einen von ihnen genügend bewegt um den Kontakt kurze Zeit zu öffnen. Genau dann liefert dieser &#039;Sensor&#039; das Signal &#039;0&#039;. Eine - die Schwerkraft nutzende - mögliche Bauform ist rechts abgebildet ;-)&lt;br /&gt;
&lt;br /&gt;
c. Natürlich werden zusätzlich 2 isolierte Drähte benötigt, um jeden der beiden offenen Drähte geschützt mit Input Pin 1 und Input GND zu verbinden.&lt;br /&gt;
&lt;br /&gt;
d. Bei jeder Durchfahrt liefert der Sensor nun ein &#039;0&#039;-Signal, was im Script sowohl für eine Zeitmessung als auch für ein &#039;Schaltintervall-Array&#039; genutzt werden kann. Dort können abwechselnd für beide Spannungen Zeiten (die in etwa zum jeweiligen Streckenabschnitt passen) &#039;programmiert&#039; werden. Statt Taste 1 wird nun der Sensor ausgewertet (wobei Taste 1 als Sensor-Ersatz insoweit genutzt werden kann, dass sie gedrückt bleiben bzw. kurz losgelassen werden muss). Zur genaueren Zeitmessung wird noch das modul &#039;clock&#039; benötigt. &amp;quot;&amp;lt;tt&amp;gt;wandler3.py&amp;lt;/tt&amp;gt;&amp;quot; könnte also so aussehen:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler3.py&lt;br /&gt;
 &lt;br /&gt;
 from time import clock&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
 sensor_1=1&lt;br /&gt;
 sensor_2=0&lt;br /&gt;
 rundenzahl=0&lt;br /&gt;
 v_wechsel=0&lt;br /&gt;
 vorrunde=0&lt;br /&gt;
 index_zaehler=1&lt;br /&gt;
 &lt;br /&gt;
 zeit_array=[0,0.2,0.4,0.2,0.4,0.2,0.4,0.2,5,0.2,6]&lt;br /&gt;
 # dieses array enthält die sek. bis zum Spannungswechsel&lt;br /&gt;
&lt;br /&gt;
 array_laenge=9&lt;br /&gt;
 # legt fest, wie viel Werte des arrays genutzt werden sollen&lt;br /&gt;
 &lt;br /&gt;
 sensor_aus=1.3&lt;br /&gt;
 # bis der Sensor sicher in die Ruhestellung kippt, wird er nicht ausgelesen&lt;br /&gt;
  &lt;br /&gt;
 pfio.init()&lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
&lt;br /&gt;
 # das Fahrzeug wird langsam zum Start (=Sensor) bewegt&lt;br /&gt;
 while sensor_1 == 1 :&lt;br /&gt;
   sensor_1=pfio.digital_read(1)&lt;br /&gt;
  &lt;br /&gt;
 print &amp;quot;fliegender Start... zum Beenden Taste 2 drücken&amp;quot;&lt;br /&gt;
 print &amp;quot;Runde Nr., Ges.Zeit, Rundenzeit, mittlere Rundenzeit&amp;quot;&lt;br /&gt;
 start_zeit=clock()&lt;br /&gt;
 runden_start=start_zeit&lt;br /&gt;
  &lt;br /&gt;
 while sensor_2 == 0 :&lt;br /&gt;
   sensor_2=pfio.digital_read(2)&lt;br /&gt;
   v_wechsel=1-v_wechsel&lt;br /&gt;
   pfio.digital_write(2,v_wechsel)&lt;br /&gt;
   sensor_zeit=clock()&lt;br /&gt;
  &lt;br /&gt;
   while zeit_array[index_zaehler]+sensor_zeit &amp;gt; clock() :&lt;br /&gt;
     if runden_start+sensor_aus &amp;lt; clock() :&lt;br /&gt;
 &lt;br /&gt;
       sensor_1=pfio.digital_read(1) &lt;br /&gt;
       if sensor_1 == 0 :&lt;br /&gt;
         rundenzahl=rundenzahl+1&lt;br /&gt;
         runden_start=clock()&lt;br /&gt;
         zeit=runden_start-start_zeit&lt;br /&gt;
         print rundenzahl, zeit, zeit-vorrunde, zeit/rundenzahl&lt;br /&gt;
         vorrunde=zeit&lt;br /&gt;
         sensor_zeit=0&lt;br /&gt;
         index_zaehler=0&lt;br /&gt;
         v_wechsel=0&lt;br /&gt;
  &lt;br /&gt;
   index_zaehler=index_zaehler+1&lt;br /&gt;
   if index_zaehler &amp;gt; array_laenge :&lt;br /&gt;
     sensor_2=1&lt;br /&gt;
     print &amp;quot;array-Ende erreicht!&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Outp 1 &amp;amp; 2 auf 0!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wird das Array-Ende erreicht, wurden entweder zu wenige Einträge vorgesehen oder es befindet sich kein Fahrzeug (mehr) auf der Strecke, das den Sensor und damit des Zurücksetzen des Arrays auslösen konnte.&lt;br /&gt;
&lt;br /&gt;
e. Das Array ist an die jeweilige Strecke anzupassen, wobei der vorderste Eintrag ungenutzt bleibt und dann mit der Dauer für maximale Spannung begonnen wird. Solange man mit Relais arbeitet, sollten die Schaltzeiten nicht zu kurz sein (&amp;gt;0.1 sek), da diese eine gewisse mechanische Trägheit besitzen.&lt;br /&gt;
&lt;br /&gt;
f. Eben diese mechanische Beschaffenheit der Relais (Verschleiß) ist auch ein guter Grund, auf &#039;volle&#039; digitale Signalumwandlung umzustellen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Optokoppler als Ersatz für Relais =&lt;br /&gt;
&lt;br /&gt;
Ähnlich wie ein Relais dient ein [[Optokoppler]] dazu, eine Signalübertragung zwischen zwei getrennten Stromkreisen zu ermöglichen. Hier liegt der Einsatz von Optokopplern nahe, da sie schneller schalten und keine beweglichen Teile besitzen. Für unsere Zwecke benötigen wir nun als zusätzliche Elemente: Optokoppler (CNY 17-4), npn-[[Transistor]]en (BC 337-40) zur Signalverstärkung sowie einige Widerstände im Bereich von 2k und 400 Ohm. &lt;br /&gt;
&lt;br /&gt;
== Kaskadierung von Transistoren zur Signalverstärkung ==&lt;br /&gt;
&lt;br /&gt;
a. Entsprechend Schritt 2.4.d. (ein Relais bei 50 Ohm) wird zunächst ein Optokoppler eingesetzt, dessen Signal durch einen Transistor verstärkt wird, um die &#039;Grundspannung&#039; zu schalten (Pin 3 und 6 beim Optokoppler sollten unbeschaltet bleiben, allein der &#039;Lichtstrom&#039; reicht für eine Durchschaltung aus):&lt;br /&gt;
&lt;br /&gt;
[[Bild:PiF_CNY_BC_1.png|400px|Optokoppler mit Transistor]]&lt;br /&gt;
&lt;br /&gt;
b. Da immer mit einer gewissen Toleranz bei allen Komponenten zu rechnen ist, kann es sein, dass u.U. die Widerstände etwas größer oder kleiner gewählt werden müssen. Beim Ausprobieren sollte man hier in 10% Schritten variieren.&lt;br /&gt;
&lt;br /&gt;
c. Bei Austesten mit Emulator oder Script ist auch zu beachten, dass nun &#039;Output Pin 8&#039; genutzt wird, da dieser nicht mit den Relais verschaltet ist.&lt;br /&gt;
&lt;br /&gt;
== Umsetzung von 3 Schaltstufen mit Optokopplern ==&lt;br /&gt;
&lt;br /&gt;
a. Entsprechend dem Vorgehen beim Relais kann nun auch der kleine Widerstand zusätzlich beschaltet werden um seine gesteuerte Überbrückung zu ermöglichen. Da hier eine relativ geringe Spannung aufgeschaltet wird, kann zusätzlich eine Diode eingesetzt werden, die die Schaltstufe &#039;maximale Spannung&#039; anzeigt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:SmPiFu2ou2T.png|400px|Kombination von 2 Optokopplern]]&lt;br /&gt;
&lt;br /&gt;
b. Vor dem Testen ist wieder zu beachten, dass nun zusätzlich &#039;Output Pin 7&#039; genutzt wird (statt Output Pin 2).&lt;br /&gt;
&lt;br /&gt;
c. Eine mögliche Realisierung sieht so aus:...&lt;br /&gt;
&lt;br /&gt;
== Zusätzliche Erhöhung der Schaltstufen bei D/A-Wandlern ==&lt;br /&gt;
&lt;br /&gt;
a. Zwar benötigen wir in unserem speziellen Beispiel eine &#039;Grundspannung&#039;, die sich dahingehend auswirkt, dass - wie unter 3.1.c. erwähnt - eine Signalkombination nicht ausgewertet wird, aber mit jeder weiteren Schaltstufe würde sich dieses Problem (theoretisch) relativieren, da bei geschickter Auswahl der Widerstände (z.B. im Verhältnis 1 zu 2) jeweils eine Verdoppelung der Kombinationsmöglichkeiten erreichbar ist.&lt;br /&gt;
&lt;br /&gt;
b. Wird hier der 50 Ohm Widerstand asymmetrisch geteilt (z.B. 15 + 35 Ohm, s.a. [[Spannungsteiler]]) um dort ein weiteres Signal umsetzen zu können, ergeben sich direkt folgende 5 Schaltstufen (aus, 50, 35, 15 und 0 Ohm) u.s.w.:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Sm3ou3t2.png|400px|Erhöhung der Schaltstufen]]&lt;br /&gt;
&lt;br /&gt;
c. Zur Ansteuerung dieser Schaltstufen ist das Script so zu ändern, dass nun zwischen mehr als 2 Stufen gewechselt werden kann und im Array entsprechende Zusatzdaten vorgegeben und ausgelesen werden. Mehr als diese Stufen sind im konkreten Fall aber nicht sinnvoll, da die entstehende Verlustleistung in der Schaltung die maximal verfügbare Leistung reduziert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Weiterführende Ideen =&lt;br /&gt;
&lt;br /&gt;
== Hardwareseitige Ausbauvarianten ==&lt;br /&gt;
&lt;br /&gt;
Die Ausbaumöglichkeiten dieses Projektes sind vielfältig:&lt;br /&gt;
&lt;br /&gt;
- beispielhafte Umsetzung einer differenzierten Abstufung mittels mittels einer logarithmischen Einteilung oder eines möglichst oft durch 2 teilbaren Anfangswertes und der Teiler (640 Ohm, 320, 160...);&lt;br /&gt;
&lt;br /&gt;
- Nachbau des Projekts mit einem Microcontroller (ggf. mit LCD-Anzeige);&lt;br /&gt;
&lt;br /&gt;
- Umbau der Steuerung mit dem Ziel, sie direkt an die GPIO-Pins des RPi anzuschließen;&lt;br /&gt;
&lt;br /&gt;
- Ergänzung um eine Sensorik, die in diesem Beispiel eine Rückmeldung liefert, ob ein Verbraucher aktiv ist oder nicht (Fahrzeug noch auf der Strecke?);&lt;br /&gt;
&lt;br /&gt;
- Einsatz anderer Sensortechniken und/oder mehrerer Sensoren zur Optimierung der Schnelligkeit oder parallelen Steuerung eines 2. Fahrzeuges;&lt;br /&gt;
&lt;br /&gt;
== Softwareseitige Ausbauvarianten ==&lt;br /&gt;
&lt;br /&gt;
- Optimierung des Scripts, indem die Sensor-Abfrage über einen &#039;Listener&#039; umgesetzt wird;&lt;br /&gt;
&lt;br /&gt;
- Erweiterung des Scripts um eine GUI mit Hilfe der python-lib Tkinter, um einen Nutzerzugriff auf das Steuerarray und/oder eine &#039;Verwaltung&#039; mehrerer Fahrzeuge;&lt;br /&gt;
&lt;br /&gt;
- Einbindung eines Web-Interface um eine &#039;Fernsteuerung&#039; zu ermöglichen...&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [http://hackaday.com/2013/01/23/replacement-controllers-for-slot-car-racing/ ähnliches Projekt bei &#039;hackaday&#039;] &lt;br /&gt;
* [https://docs.google.com/folder/d/0B-UAZ9CyJCLGQjJ3RDlqa2pqaDg/edit?pli=1&amp;amp;docId=0B-UAZ9CyJCLGNmpMeVpyYlZJUWc Relaisschaltung mit pädagogischer Erweiterung d. Universität Manchester]&lt;br /&gt;
* [http://elinux.org/RPi_Projects/PiFace_controlling_a_slot-car parallele englischsp. Dokumentation dieses Projekts mit anderem Schwerpunkt] &lt;br /&gt;
* [http://elinux.org/RPi_Projects englischsp. Projektliste zum RPi]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Raspberry Pi]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Mknot9</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=RPi_als_D/A-Wandler&amp;diff=74112</id>
		<title>RPi als D/A-Wandler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=RPi_als_D/A-Wandler&amp;diff=74112"/>
		<updated>2013-03-07T19:16:11Z</updated>

		<summary type="html">&lt;p&gt;Mknot9: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von mknot9&#039;&#039; (in Arbeit)&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
Oft wird ein Computer &#039;nur&#039; genutzt um darauf Software ablaufen zu lassen. Dessen Möglichkeit zur Steuerung von elektrischen und mechanischen Geräten wird dabei leicht übersehen.&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel richtet sich daher an Einsteiger, die mit dem [[Raspberry Pi]] (&#039;RPi&#039;) Grundlagen der Computersteuerung mit Relais und [[Spannungsteiler]]n nachvollziehen möchten. Es wird schrittweise dargestellt, wie mittels eines D/A-Wandlers (Digital/Analog-Wandler = Umwandlung von digitalen 1/0 Signale) die Steuerung einer stufenweise veränderbaren Ausgangsspannung nachgebaut werden kann.&lt;br /&gt;
&lt;br /&gt;
= Verwendete Hardware =&lt;br /&gt;
&lt;br /&gt;
== RPi in Kombination mit der &#039;PiFace&#039;-Karte als Bastelplattform ==&lt;br /&gt;
&lt;br /&gt;
Dank der einfachen Bauweise bietet sich der RPi mit seinen frei zugänglichen GPIO-Pins als ideale Bastelplattform an. Trotzdem kann es beim Experimentieren mit Schaltungen öfters zu kleinen Fehlern kommen, die schlimmstenfalls die empfindliche Elektronik des RPi dauerhaft beschädigen können.&lt;br /&gt;
&lt;br /&gt;
Daher wird bei diesem Projekt zusätzlich mit der &#039;PiFace[http://elinux.org/RPi_Expansion_Boards#Piface]&#039;-Karte gearbeitet, die man auf die GPIO-Pins stecken kann. Diese Erweiterungskarte verschaltet die GPIO-Pins auf je 8 digitale Ein- und Ausgänge, sowie 2 Relais, die eine galvanische Trennung von Stromkreisen ermöglichen. Damit besteht auch für Einsteiger ein gewisser Schutz für die Steuerelektronik des RPi.&lt;br /&gt;
&lt;br /&gt;
Auch im weiteren Verlauf dieser Einführung soll noch auf eine Trennung der Stromkreise Wert gelegt werden, so dass für erste digitale Schaltexperimente ein Optokoppler genutzt wird. Die spätere Nutzung der &#039;Input Pins&#039; des PiFace um eine Steuerung der D/A-Wandlung durch bestimmte Ereignisse zu ermöglichen, erfolgt ebenfalls passiv.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Auch wenn mit vermeindlich &#039;sicheren&#039; Transformatoren gebastelt wird, muss stets bedacht werden, dass diese an einem 230V-Stromnetz betrieben werden und man eher einmal mehr als weniger prüfen sollte, ob man durch eventuelle Fehler mit lebensgefährlicher Spannung in Berührung kommt!&lt;br /&gt;
&lt;br /&gt;
== Auswahl eines Beispielprojektes ==&lt;br /&gt;
&lt;br /&gt;
Günstige Möglichkeiten ein Gerät zu finden, das mit analogen Spannungen arbeitet, bieten sich u.a. im Spielzeugbereich. Im Grunde eignet sich alles, was mit Batterien oder mit Gleichspannungen unter 24 V betrieben wird.&lt;br /&gt;
&lt;br /&gt;
Da jedoch ein Ziel das Steuern von analogen Spannungen ist, bietet sich insbesondere alles an, bei dem [[Potentiometer]] eingesetzt werden. Einen dieser &#039;Handregler&#039; sollte man übrig haben, da er von seinem Anschlusskabel abgetrennt werden muss, um den oft proprietären Steckanschluss nutzen zu können. In diesem Sinne wird hier eine handelsübliche Spielzeug-Autorennbahn mit Potentiometer-Handreglern genutzt.&lt;br /&gt;
&lt;br /&gt;
== Sonstige Bauteile ==&lt;br /&gt;
&lt;br /&gt;
Für die ersten Grundlagen (s. Teile 2 &amp;amp; 3) genügen bereits rund 2 m isolierter Draht, der nicht aus verdrillten feinen Adern (Litze) bestehen sollte, 50 cm nicht-isolierter Draht, einige niederohmige Widerstände (z.B. je 2 mal 100 Ohm, 80, 60, sowie 20) und ein &#039;Experimentierbrett&#039; (engl. [[Breadboard]]).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Grundlagen und Vorbereitung des Projekts =&lt;br /&gt;
&lt;br /&gt;
== Umwandlung von 1/0 zu Ein/Aus mit einem Relais ==&lt;br /&gt;
&lt;br /&gt;
Vom Prinzip her ist jede Umwandlung eines digitalen 0 oder 1 Signals (das über eine bestimmte Spannungsdifferenz festgelegt ist) in eine (nutzbare) Spannung bereits eine D/A-Wandlung. Dies wird schlicht so realisiert, dass mit einer Eingabe am RPi die Nutzspannung des &#039;Verbrauchers&#039; zunächst einfach an- und ausgeschaltet wird.&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung der zu steuernden Hardware ==&lt;br /&gt;
&lt;br /&gt;
a. Um Fehlerquellen auszuschliessen sollte zunächst (und ggf. auch später!) kurz getestet werden, ob der vorhandene Regler wie erwartet funktioniert.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pif_Con9.jpg|thumb|right|400px|Fixierung der Reglerkabel]]&lt;br /&gt;
b. Nach dem Trennen des Reglers von der Einspeisung (und ggf. Ziehen des Netzsteckers) muss das Regler-Kabel abgeschnitten werden (eher nahe beim Regler, da das Kabel bald bis zum Breadboard reichen soll). Die neuen Enden des Einspeiseteils werden abisoliert und auf dem Breadboard diagonal zueinander mit einigen Spalten Abstand fixiert. Auch können bereits die Drähte, die später zum RPi führen, jeweils in den passenden kontaktführenden Spalten eingesteckt werden, z. B. wie rechts zu sehen (die nicht beschrifteten Drähte können vorerst ignoriert werden):&lt;br /&gt;
&lt;br /&gt;
c. Nun bietet sich eine gute Gelegenheit die maximale Spannung am Nutzgerät zu messen. Man verbindet das Regler-Kabel (nun ohne Regler) wieder mit der Einspeisung und die offenen Enden der Drähte mit dem Messgerät, bei dem zunächst ein Messbereich von ca. 10-50 Volt gewählt werden sollte. Dies sollte dann z.B. 14,8 V anzeigen. Natürlich können auch die beiden offenen Enden einen kleinen Moment kurz geschlossen werden, man sollte aber bedenken, dass das zu regelnde Nutzgerät dann die maximal vorgesehene Spannung erhält (hier: maximales Tempo).&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung des RPi ==&lt;br /&gt;
&lt;br /&gt;
Es wird davon ausgegangen, dass entsprechend des zugehörigen &#039;manual&#039; das PiFace bereits auf den RPi gesteckt ist, die nötigen python-Bilbliotheken installiert sind und man sich im Terminal-Arbeitsverzeichnis &#039;pi&#039; befindet.&lt;br /&gt;
&lt;br /&gt;
a. Zunächst wird der PiFace-Emulator (im Terminal direkt aus dem Arbeitsverzeichnis) gestartet: &amp;lt;tt&amp;gt;piface/scripts/piface-emulator&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b. Wenn alles richtig installiert wurde, erscheint ein Fenster (unten links), bei dem die vorerst wichtigen blauen Signale am rechten Rand wie folgt angezeigt werden sollten: &lt;br /&gt;
 &lt;br /&gt;
[[Datei:RPi_PiF_em-scs.jpg|400px|Piface-Emulator im default-Zustand]] [[Datei:RPi_PiF_em_scs1.jpg|400px|Piface-Relais 1 auf &#039;1&#039; geschaltet]]&lt;br /&gt;
&lt;br /&gt;
c. Das rechte Fenster ergibt sich, wenn man nun im Fenster auf &amp;quot;Override Enable&amp;quot; und dann &amp;quot;Output Pin 1&amp;quot; klickt. Es müsste ein &amp;quot;Klack&amp;quot; vom Relais 1 zu hören sein sowie der Schaltzustand des unteren Relais 1 (das an den Output Pin 1 gekoppelt ist) auf die Verbindung der beiden unteren Anschlüsse wechseln. Zugleich wird das erste LED-Icon beim Output Pin 1 rot sowie das zugehörige LED-Icon blau.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pif_rel2.png|thumb|right|250px|Schema der Piface-Relais]]&lt;br /&gt;
d. Rechts ist der Schaltzustand der Relais, die zu Beginn genutzt werden, im Grundzustand dargestellt (jeweils der mittlere und obere Kontakt sind kurzgeschlossen, der jeweils untere Kontakt ist frei):&lt;br /&gt;
&lt;br /&gt;
e. Ein weiterer Klick auf &amp;quot;Output Pin 1&amp;quot; versetzt das Relais in den Ausgangszustand, der vor dem nächsten Schritt wieder eingestellt werden sollte.&lt;br /&gt;
&lt;br /&gt;
f. Das Relais läßt sich auch mittel eines Python-Scripts vom RPi aus ansteuern. Dazu wird folgende Textdatei &amp;quot;wandler.py&amp;quot; im Arbeitsverzeichnis abgespeichert und mit dem Befehl &amp;quot;&amp;lt;tt&amp;gt;python wandler.py&amp;lt;/tt&amp;gt;&amp;quot; gestartet:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler.py&lt;br /&gt;
&lt;br /&gt;
 from time import sleep&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
&lt;br /&gt;
 pfio.init()&lt;br /&gt;
&lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
 print &amp;quot;Strom an&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 sleep(2)&lt;br /&gt;
&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Strom aus&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Nach dem Absetzen des Befehls wechselt nun das blaue Signal an Relais 1 für 2 Sekunden und das Relais klackt entsprechend.&lt;br /&gt;
&lt;br /&gt;
== Einsatz eines Relais&#039; zur Umsetzung von Spannungsänderungen ==&lt;br /&gt;
&lt;br /&gt;
a. Ist das Relais wieder im Ausgangszustand, befestigt man nun einen der vom Breadboard führenden Drähte am unteren und einen am mittleren Relaiseingang (im Moment ist die Polarität noch egal). Zunächst sollte nichts passieren (das Relais hält diesen ja Stromkreis noch offen).&lt;br /&gt;
&lt;br /&gt;
b. Startet man aber das Script wieder (&amp;lt;tt&amp;gt;python wandler.py&amp;lt;/tt&amp;gt;) oder klickt auf &#039;Output Pin 1&#039; wird der Nutzstromkreis geschlossen. Nochmals aufgepasst: unser Nutzer erhält wieder die maximal vorgesehene Spannung - also besser vorher im Script &amp;quot;&amp;lt;tt&amp;gt;sleep(0.3)&amp;lt;/tt&amp;gt;&amp;quot; setzen und speichern.&lt;br /&gt;
&lt;br /&gt;
c. Im Prinzip ist damit die programmgesteuerte Umsetzung eines 0/1 Signals in z.B. eine 0V/15V Spannung erreicht.&lt;br /&gt;
&lt;br /&gt;
d. Da wir bald verschiedene Steuerspannungen schalten wollen, geht es jetzt darum herauszufinden, bei welcher Spannung unser Nutzgerät gerade noch bewegt wird. Dies probiert man aus - mit dem kleinsten Widerstand beginnend: indem einer der Drähte in eine freie Breadboardspalte gesteckt wird und aus dieser Spalte der Widerstand zu dem &#039;alten&#039; Steckplatz des Drahtes geführt wird. Nun startet man jeweils das Script bis der Widerstand so hoch ist, dass die Anlaufspannung beim Nutzgerätes gut ausreicht, eine Reaktion des Nutzgerät (Fahrzeug bewegt sich) zu bewirken (z.B. bei 50 Ohm beträgt der Strom ca. 130 mA während ohne 190 mA fliessen).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Ansteuerung von 3 Schaltstufen =&lt;br /&gt;
&lt;br /&gt;
== Kombination von 2 Relais ==&lt;br /&gt;
&lt;br /&gt;
[[Bild:ZrelMww2.png|thumb|right|250px|Beschaltung der Relais]] a. Die einfachste Stufe der weiteren Verschaltung erreicht man, indem der Widerstand mit einem 2. Relais überbrückt wird. Relais 1 kann dann als &#039;Hauptschalter&#039;, Relais 2 als Spannungsumschalter genutzt werden:&lt;br /&gt;
&lt;br /&gt;
b. Diese Beschaltung kann sogleich mit dem PiFace-Emulator ausprobiert werden. Damit können wir bereits 3 Schaltstufen steuern: keine, verminderte und volle Spannung.&lt;br /&gt;
&lt;br /&gt;
c. Theoretisch liesse sich auch noch eine 4. Spannungsstufe erzeugen, da mit 2 &#039;Bits&#039; (Ein/Aus bei 2 Relais) bereits 4 verschiedene Signale darstellbar sind. Beim jetzigen Aufbau werden aber lediglich die (pin1,pin2)-Signale (0,0), (1,0) und (1,1) &#039;genutzt&#039;, da Relais 1 als Hauptschalter vorgesehen ist und die Kombination (0,1) so nicht ausgewertet wird.&lt;br /&gt;
&lt;br /&gt;
== Programmgesteuerte Schaltung von 2 Relais ==&lt;br /&gt;
&lt;br /&gt;
a. Mit einem veränderten python-Script &amp;quot;wandler2.py&amp;quot; ist auch die programmgesteuerte Schaltung möglich. Dabei werden zusätzlich die Tasten 1 und 2 des PiFace genutzt, um nach dem Start des Scripts (&amp;lt;tt&amp;gt;python wandler2.py&amp;lt;/tt&amp;gt;) den Hauptschalter (Relais 1) zu steuern:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler2.py&lt;br /&gt;
 &lt;br /&gt;
 from time import sleep&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
 pfio.init()&lt;br /&gt;
 &lt;br /&gt;
 taste_1=0&lt;br /&gt;
 taste_2=0&lt;br /&gt;
 intervall_a=0.1&lt;br /&gt;
 intervall_b=0.5&lt;br /&gt;
 # Die Intervalle bestimmen die Schaltzeit für volle/verminderte Spannung&lt;br /&gt;
 &lt;br /&gt;
 print &amp;quot;Zum Start Taste 1 drücken, zum Stoppen Taste 2&amp;quot;&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 while taste_1 == 0:&lt;br /&gt;
   sleep(intervall_a)&lt;br /&gt;
   taste_1=pfio.digital_read(1)&lt;br /&gt;
&lt;br /&gt;
 # Der o.g. &#039;sleep&#039;-Befehl bestimmt die Abfragepausen für Taste 1&lt;br /&gt;
 &lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
 print &amp;quot;Strom an!&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 while taste_2 == 0:&lt;br /&gt;
   pfio.digital_write(2,1)&lt;br /&gt;
   sleep(intervall_a)&lt;br /&gt;
   pfio.digital_write(2,0)&lt;br /&gt;
   sleep(intervall_b)&lt;br /&gt;
   taste_2=pfio.digital_read(2)&lt;br /&gt;
 &lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Strom aus!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
b. Falls beim Ausprobieren von Script-Änderungen mal was schief geht, kann das Script stets auch mit der Tastenkombination (CNTRL-C) gestoppt werden. U.U. muss dann noch zusätzlich Relais 1 und/oder 2 via Emulator zurückgesetzt werden.&lt;br /&gt;
&lt;br /&gt;
c. Beim Verändern des Scripts fällt bald auf, dass die bisherige Programmsteuerung keine direkte Möglichkeit vorsieht, auf Ereignisse zu reagieren. Immerhin wird ein mechanisches Gerät gesteuert, bei dem mit Ausfällen, Fertigungstoleranzen, Umwelteinflüssen etc. zu rechnen ist (im Script wird dies bislang &#039;nur&#039; durch die Abbruchbedingung &#039;Taste 2&#039; berücksichtigt).&lt;br /&gt;
&lt;br /&gt;
== Einfache Sensor-Signale als steuernde Elemente eines Programms ==&lt;br /&gt;
&lt;br /&gt;
a. Eine wichtige Anwendung von D/A-Steuerungen ist die mögliche Reaktion dieser Steuerung auf &#039;äußere&#039; Ereignisse, die z.B. mit Hilfe von Sensoren leistbar ist.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Einf_Sens.jpg|thumb|right|250px|einfacher Sensor]]b. Für unsere Zwecke genügt zunächst ein sehr einfacher Sensor, der ein 0- oder 1-Signal liefert und idealerweise direkt am &#039;Input Pin 1&#039; des PiFace angeschlossen werden kann. So liegt beim Input Pin 1 das Signal &#039;1&#039; an, wenn eine Verbindung zu &#039;Input GND&#039; besteht.&lt;br /&gt;
Z.B. können 2 unisolierte Drähte so plaziert werden, dass ein vorbeifahrendes Fahrzeug einen von ihnen genügend bewegt um den Kontakt kurze Zeit zu öffnen. Genau dann liefert dieser &#039;Sensor&#039; das Signal &#039;0&#039;. Eine - die Schwerkraft nutzende - mögliche Bauform ist rechts abgebildet ;-)&lt;br /&gt;
&lt;br /&gt;
c. Natürlich werden zusätzlich 2 isolierte Drähte benötigt, um jeden der beiden offenen Drähte geschützt mit Input Pin 1 und Input GND zu verbinden.&lt;br /&gt;
&lt;br /&gt;
d. Bei jeder Durchfahrt liefert der Sensor nun ein &#039;0&#039;-Signal, was im Script sowohl für eine Zeitmessung als auch für ein &#039;Schaltintervall-Array&#039; genutzt werden kann. Dort können abwechselnd für beide Spannungen Zeiten (die in etwa zum jeweiligen Streckenabschnitt passen) &#039;programmiert&#039; werden. Statt Taste 1 wird nun der Sensor ausgewertet (wobei Taste 1 als Sensor-Ersatz insoweit genutzt werden kann, dass sie gedrückt bleiben bzw. kurz losgelassen werden muss). Zur genaueren Zeitmessung wird noch das modul &#039;clock&#039; benötigt. &amp;quot;&amp;lt;tt&amp;gt;wandler3.py&amp;lt;/tt&amp;gt;&amp;quot; könnte also so aussehen:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler3.py&lt;br /&gt;
 &lt;br /&gt;
 from time import clock&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
 sensor_1=1&lt;br /&gt;
 sensor_2=0&lt;br /&gt;
 rundenzahl=0&lt;br /&gt;
 v_wechsel=0&lt;br /&gt;
 vorrunde=0&lt;br /&gt;
 index_zaehler=1&lt;br /&gt;
 &lt;br /&gt;
 zeit_array=[0,0.2,0.4,0.2,0.4,0.2,0.4,0.2,5,0.2,6]&lt;br /&gt;
 # dieses array enthält die sek. bis zum Spannungswechsel&lt;br /&gt;
&lt;br /&gt;
 array_laenge=9&lt;br /&gt;
 # legt fest, wie viel Werte des arrays genutzt werden sollen&lt;br /&gt;
 &lt;br /&gt;
 sensor_aus=1.3&lt;br /&gt;
 # bis der Sensor sicher in die Ruhestellung kippt, wird er nicht ausgelesen&lt;br /&gt;
  &lt;br /&gt;
 pfio.init()&lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
&lt;br /&gt;
 # das Fahrzeug wird langsam zum Start (=Sensor) bewegt&lt;br /&gt;
 while sensor_1 == 1 :&lt;br /&gt;
   sensor_1=pfio.digital_read(1)&lt;br /&gt;
  &lt;br /&gt;
 print &amp;quot;fliegender Start... zum Beenden Taste 2 drücken&amp;quot;&lt;br /&gt;
 print &amp;quot;Runde Nr., Ges.Zeit, Rundenzeit, mittlere Rundenzeit&amp;quot;&lt;br /&gt;
 start_zeit=clock()&lt;br /&gt;
 runden_start=start_zeit&lt;br /&gt;
  &lt;br /&gt;
 while sensor_2 == 0 :&lt;br /&gt;
   sensor_2=pfio.digital_read(2)&lt;br /&gt;
   v_wechsel=1-v_wechsel&lt;br /&gt;
   pfio.digital_write(2,v_wechsel)&lt;br /&gt;
   sensor_zeit=clock()&lt;br /&gt;
  &lt;br /&gt;
   while zeit_array[index_zaehler]+sensor_zeit &amp;gt; clock() :&lt;br /&gt;
     if runden_start+sensor_aus &amp;lt; clock() :&lt;br /&gt;
 &lt;br /&gt;
       sensor_1=pfio.digital_read(1) &lt;br /&gt;
       if sensor_1 == 0 :&lt;br /&gt;
         rundenzahl=rundenzahl+1&lt;br /&gt;
         runden_start=clock()&lt;br /&gt;
         zeit=runden_start-start_zeit&lt;br /&gt;
         print rundenzahl, zeit, zeit-vorrunde, zeit/rundenzahl&lt;br /&gt;
         vorrunde=zeit&lt;br /&gt;
         sensor_zeit=0&lt;br /&gt;
         index_zaehler=0&lt;br /&gt;
         v_wechsel=0&lt;br /&gt;
  &lt;br /&gt;
   index_zaehler=index_zaehler+1&lt;br /&gt;
   if index_zaehler &amp;gt; array_laenge :&lt;br /&gt;
     sensor_2=1&lt;br /&gt;
     print &amp;quot;array-Ende erreicht!&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Outp 1 &amp;amp; 2 auf 0!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wird das Array-Ende erreicht, wurden entweder zu wenige Einträge vorgesehen oder es befindet sich kein Fahrzeug (mehr) auf der Strecke, das den Sensor und damit des Zurücksetzen des Arrays auslösen konnte.&lt;br /&gt;
&lt;br /&gt;
e. Das Array ist an die jeweilige Strecke anzupassen, wobei der vorderste Eintrag ungenutzt bleibt und dann mit der Dauer für maximale Spannung begonnen wird. Solange man mit Relais arbeitet, sollten die Schaltzeiten nicht zu kurz sein (&amp;gt;0.1 sek), da diese eine gewisse mechanische Trägheit besitzen.&lt;br /&gt;
&lt;br /&gt;
f. Eben diese mechanische Beschaffenheit der Relais (Verschleiß) ist auch ein guter Grund, auf &#039;volle&#039; digitale Signalumwandlung umzustellen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Optokoppler als Ersatz für Relais =&lt;br /&gt;
&lt;br /&gt;
Ähnlich wie ein Relais dient ein [[Optokoppler]] dazu, eine Signalübertragung zwischen zwei getrennten Stromkreisen zu ermöglichen. Hier liegt der Einsatz von Optokopplern nahe, da sie schneller schalten und keine beweglichen Teile besitzen. Für unsere Zwecke benötigen wir nun als zusätzliche Elemente: Optokoppler (CNY 17-4), npn-[[Transistor]]en (BC 337-40) zur Signalverstärkung sowie einige Widerstände im Bereich von 2k und 400 Ohm. &lt;br /&gt;
&lt;br /&gt;
== Kaskadierung von Transistoren zur Signalverstärkung ==&lt;br /&gt;
&lt;br /&gt;
a. Entsprechend Schritt 2.4.d. (ein Relais bei 50 Ohm) wird zunächst ein Optokoppler eingesetzt, dessen Signal durch einen Transistor verstärkt wird, um die &#039;Grundspannung&#039; zu schalten (Pin 3 und 6 beim Optokoppler sollten unbeschaltet bleiben, allein der &#039;Lichtstrom&#039; reicht für eine Durchschaltung aus):&lt;br /&gt;
&lt;br /&gt;
[[Bild:PiF_CNY_BC_1.png|400px|Optokoppler mit Transistor]]&lt;br /&gt;
&lt;br /&gt;
b. Da immer mit einer gewissen Toleranz bei allen Komponenten zu rechnen ist, kann es sein, dass u.U. die Widerstände etwas größer oder kleiner gewählt werden müssen. Beim Ausprobieren sollte man hier in 10% Schritten variieren.&lt;br /&gt;
&lt;br /&gt;
c. Bei Austesten mit Emulator oder Script ist auch zu beachten, dass nun &#039;Output Pin 8&#039; genutzt wird, da dieser nicht mit den Relais verschaltet ist.&lt;br /&gt;
&lt;br /&gt;
== Umsetzung von 3 Schaltstufen mit Optokopplern ==&lt;br /&gt;
&lt;br /&gt;
a. Entsprechend dem Vorgehen beim Relais kann nun auch der kleine Widerstand zusätzlich beschaltet werden um seine gesteuerte Überbrückung zu ermöglichen. Da hier eine relativ geringe Spannung aufgeschaltet wird, kann zusätzlich eine Diode eingesetzt werden, die die Schaltstufe &#039;maximale Spannung&#039; anzeigt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:SmPiFu2ou2T.png|400px|Kombination von 2 Optokopplern]]&lt;br /&gt;
&lt;br /&gt;
b. Vor dem Testen ist wieder zu beachten, dass nun zusätzlich &#039;Output Pin 7&#039; genutzt wird (statt Output Pin 2).&lt;br /&gt;
&lt;br /&gt;
c. Eine mögliche Realisierung sieht so aus:...&lt;br /&gt;
&lt;br /&gt;
== Zusätzliche Erhöhung der Schaltstufen bei D/A-Wandlern ==&lt;br /&gt;
&lt;br /&gt;
a. Zwar benötigen wir in unserem speziellen Beispiel eine &#039;Grundspannung&#039;, die sich dahingehend auswirkt, dass - wie unter 3.1.c. erwähnt - eine Signalkombination nicht ausgewertet wird, aber mit jeder weiteren Schaltstufe würde sich dieses Problem (theoretisch) relativieren, da bei geschickter Auswahl der Widerstände (z.B. im Verhältnis 1 zu 2) jeweils eine Verdoppelung der Kombinationsmöglichkeiten erreichbar ist.&lt;br /&gt;
&lt;br /&gt;
b. Wird hier der 50 Ohm Widerstand asymmetrisch geteilt (z.B. 15 + 35 Ohm, s.a. [[Spannungsteiler]]) um dort ein weiteres Signal umsetzen zu können, ergeben sich direkt folgende 5 Schaltstufen (aus, 50, 35, 15 und 0 Ohm) u.s.w.:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Sm3ou3t2.png|400px|Erhöhung der Schaltstufen]]&lt;br /&gt;
&lt;br /&gt;
c. Zur Ansteuerung dieser Schaltstufen ist das Script so zu ändern, dass nun zwischen mehr als 2 Stufen gewechselt werden kann und im Array entsprechende Zusatzdaten vorgegeben und ausgelesen werden. Mehr als diese Stufen sind im konkreten Fall aber nicht sinnvoll, da die entstehende Verlustleistung in der Schaltung die maximal verfügbare Leistung reduziert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Weiterführende Ideen =&lt;br /&gt;
&lt;br /&gt;
== Hardwareseitige Ausbauvarianten ==&lt;br /&gt;
&lt;br /&gt;
Dem Ausbau dieses Ansatzes sind kaum Grenzen gesetzt:&lt;br /&gt;
&lt;br /&gt;
- beispielhafte Umsetzung einer differenzierten Abstufung mittels mittels einer logarithmischen Einteilung oder eines möglichst oft durch 2 teilbaren Anfangswertes und der Teiler (640 Ohm, 320, 160...);&lt;br /&gt;
&lt;br /&gt;
- Nachbau des Projekts mit einem Microcontroller (ggf. mit LCD-Anzeige);&lt;br /&gt;
&lt;br /&gt;
- Umbau der Steuerung mit dem Ziel, sie direkt an die GPIO-Pins des RPi anzuschließen;&lt;br /&gt;
&lt;br /&gt;
- Ergänzung um eine Sensorik, die in diesem Beispiel eine Rückmeldung liefert, ob ein Verbraucher aktiv ist oder nicht (Fahrzeug noch auf der Strecke?);&lt;br /&gt;
&lt;br /&gt;
- Einsatz anderer Sensortechniken und/oder mehrerer Sensoren zur Optimierung der Schnelligkeit oder parallelen Steuerung eines 2. Fahrzeuges;&lt;br /&gt;
&lt;br /&gt;
== Softwareseitige Ausbauvarianten ==&lt;br /&gt;
&lt;br /&gt;
- Optimierung des Scripts, indem die Sensor-Abfrage über einen &#039;Listener&#039; umgesetzt wird;&lt;br /&gt;
&lt;br /&gt;
- Erweiterung des Scripts um eine GUI mit Hilfe der python-lib Tkinter, um einen Nutzerzugriff auf das Steuerarray und/oder eine &#039;Verwaltung&#039; mehrerer Fahrzeuge;&lt;br /&gt;
&lt;br /&gt;
- Einbindung eines Web-Interface um eine &#039;Fernsteuerung&#039; zu ermöglichen...&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [http://hackaday.com/2013/01/23/replacement-controllers-for-slot-car-racing/ ähnliches Projekt bei &#039;hackaday&#039;] &lt;br /&gt;
* [https://docs.google.com/folder/d/0B-UAZ9CyJCLGQjJ3RDlqa2pqaDg/edit?pli=1&amp;amp;docId=0B-UAZ9CyJCLGNmpMeVpyYlZJUWc Relaisschaltung mit pädagogischer Erweiterung d. Universität Manchester]&lt;br /&gt;
* [http://elinux.org/RPi_Projects/PiFace_controlling_a_slot-car parallele englischsp. Dokumentation dieses Projekts mit anderem Schwerpunkt] &lt;br /&gt;
* [http://elinux.org/RPi_Projects englischsp. Projektliste zum RPi]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Raspberry Pi]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Mknot9</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=RPi_als_D/A-Wandler&amp;diff=74111</id>
		<title>RPi als D/A-Wandler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=RPi_als_D/A-Wandler&amp;diff=74111"/>
		<updated>2013-03-07T19:14:28Z</updated>

		<summary type="html">&lt;p&gt;Mknot9: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von mknot9&#039;&#039; (in Arbeit)&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
Oft wird ein Computer &#039;nur&#039; genutzt um darauf Software ablaufen zu lassen. Dessen Möglichkeit zur Steuerung von elektrischen und mechanischen Geräten wird dabei leicht übersehen.&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel richtet sich daher an Einsteiger, die mit dem [[Raspberry Pi]] (&#039;RPi&#039;) Grundlagen der Computersteuerung mit [[Relais]] und [[Spannungsteiler]]n nachvollziehen möchten. Es wird schrittweise dargestellt, wie mittels eines D/A-Wandlers (Digital/Analog-Wandler = Umwandlung von digitalen 1/0 Signale) die Steuerung einer stufenweise veränderbaren Ausgangsspannung nachgebaut werden kann.&lt;br /&gt;
&lt;br /&gt;
= Verwendete Hardware =&lt;br /&gt;
&lt;br /&gt;
== RPi in Kombination mit der &#039;PiFace&#039;-Karte als Bastelplattform ==&lt;br /&gt;
&lt;br /&gt;
Dank der einfachen Bauweise bietet sich der RPi mit seinen frei zugänglichen GPIO-Pins als ideale Bastelplattform an. Trotzdem kann es beim Experimentieren mit Schaltungen öfters zu kleinen Fehlern kommen, die schlimmstenfalls die empfindliche Elektronik des RPi dauerhaft beschädigen können.&lt;br /&gt;
&lt;br /&gt;
Daher wird bei diesem Projekt zusätzlich mit der &#039;PiFace[http://elinux.org/RPi_Expansion_Boards#Piface]&#039;-Karte gearbeitet, die man auf die GPIO-Pins stecken kann. Diese Erweiterungskarte verschaltet die GPIO-Pins auf je 8 digitale Ein- und Ausgänge, sowie 2 Relais, die eine galvanische Trennung von Stromkreisen ermöglichen. Damit besteht auch für Einsteiger ein gewisser Schutz für die Steuerelektronik des RPi.&lt;br /&gt;
&lt;br /&gt;
Auch im weiteren Verlauf dieser Einführung soll noch auf eine Trennung der Stromkreise Wert gelegt werden, so dass für erste digitale Schaltexperimente ein Optokoppler genutzt wird. Die spätere Nutzung der &#039;Input Pins&#039; des PiFace um eine Steuerung der D/A-Wandlung durch bestimmte Ereignisse zu ermöglichen, erfolgt ebenfalls passiv.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Auch wenn mit vermeindlich &#039;sicheren&#039; Transformatoren gebastelt wird, muss stets bedacht werden, dass diese an einem 230V-Stromnetz betrieben werden und man eher einmal mehr als weniger prüfen sollte, ob man durch eventuelle Fehler mit lebensgefährlicher Spannung in Berührung kommt!&lt;br /&gt;
&lt;br /&gt;
== Auswahl eines Beispielprojektes ==&lt;br /&gt;
&lt;br /&gt;
Günstige Möglichkeiten ein Gerät zu finden, das mit analogen Spannungen arbeitet, bieten sich u.a. im Spielzeugbereich. Im Grunde eignet sich alles, was mit Batterien oder mit Gleichspannungen unter 24 V betrieben wird.&lt;br /&gt;
&lt;br /&gt;
Da jedoch ein Ziel das Steuern von analogen Spannungen ist, bietet sich insbesondere alles an, bei dem [[Potentiometer]] eingesetzt werden. Einen dieser &#039;Handregler&#039; sollte man übrig haben, da er von seinem Anschlusskabel abgetrennt werden muss, um den oft proprietären Steckanschluss nutzen zu können. In diesem Sinne wird hier eine handelsübliche Spielzeug-Autorennbahn mit Potentiometer-Handreglern genutzt.&lt;br /&gt;
&lt;br /&gt;
== Sonstige Bauteile ==&lt;br /&gt;
&lt;br /&gt;
Für die ersten Grundlagen (s. Teile 2 &amp;amp; 3) genügen bereits rund 2 m isolierter Draht, der nicht aus verdrillten feinen Adern (Litze) bestehen sollte, 50 cm nicht-isolierter Draht, einige niederohmige Widerstände (z.B. je 2 mal 100 Ohm, 80, 60, sowie 20) und ein &#039;Experimentierbrett&#039; (engl. [[Breadboard]]).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Grundlagen und Vorbereitung des Projekts =&lt;br /&gt;
&lt;br /&gt;
== Umwandlung von 1/0 zu Ein/Aus mit einem Relais ==&lt;br /&gt;
&lt;br /&gt;
Vom Prinzip her ist jede Umwandlung eines digitalen 0 oder 1 Signals (das über eine bestimmte Spannungsdifferenz festgelegt ist) in eine (nutzbare) Spannung bereits eine D/A-Wandlung. Dies wird schlicht so realisiert, dass mit einer Eingabe am RPi die Nutzspannung des &#039;Verbrauchers&#039; zunächst einfach an- und ausgeschaltet wird.&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung der zu steuernden Hardware ==&lt;br /&gt;
&lt;br /&gt;
a. Um Fehlerquellen auszuschliessen sollte zunächst (und ggf. auch später!) kurz getestet werden, ob der vorhandene Regler wie erwartet funktioniert.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pif_Con9.jpg|thumb|right|400px|Fixierung der Reglerkabel]]&lt;br /&gt;
b. Nach dem Trennen des Reglers von der Einspeisung (und ggf. Ziehen des Netzsteckers) muss das Regler-Kabel abgeschnitten werden (eher nahe beim Regler, da das Kabel bald bis zum Breadboard reichen soll). Die neuen Enden des Einspeiseteils werden abisoliert und auf dem Breadboard diagonal zueinander mit einigen Spalten Abstand fixiert. Auch können bereits die Drähte, die später zum RPi führen, jeweils in den passenden kontaktführenden Spalten eingesteckt werden, z. B. wie rechts zu sehen (die nicht beschrifteten Drähte können vorerst ignoriert werden):&lt;br /&gt;
&lt;br /&gt;
c. Nun bietet sich eine gute Gelegenheit die maximale Spannung am Nutzgerät zu messen. Man verbindet das Regler-Kabel (nun ohne Regler) wieder mit der Einspeisung und die offenen Enden der Drähte mit dem Messgerät, bei dem zunächst ein Messbereich von ca. 10-50 Volt gewählt werden sollte. Dies sollte dann z.B. 14,8 V anzeigen. Natürlich können auch die beiden offenen Enden einen kleinen Moment kurz geschlossen werden, man sollte aber bedenken, dass das zu regelnde Nutzgerät dann die maximal vorgesehene Spannung erhält (hier: maximales Tempo).&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung des RPi ==&lt;br /&gt;
&lt;br /&gt;
Es wird davon ausgegangen, dass entsprechend des zugehörigen &#039;manual&#039; das PiFace bereits auf den RPi gesteckt ist, die nötigen python-Bilbliotheken installiert sind und man sich im Terminal-Arbeitsverzeichnis &#039;pi&#039; befindet.&lt;br /&gt;
&lt;br /&gt;
a. Zunächst wird der PiFace-Emulator (im Terminal direkt aus dem Arbeitsverzeichnis) gestartet: &amp;lt;tt&amp;gt;piface/scripts/piface-emulator&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b. Wenn alles richtig installiert wurde, erscheint ein Fenster (unten links), bei dem die vorerst wichtigen blauen Signale am rechten Rand wie folgt angezeigt werden sollten: &lt;br /&gt;
 &lt;br /&gt;
[[Datei:RPi_PiF_em-scs.jpg|400px|Piface-Emulator im default-Zustand]] [[Datei:RPi_PiF_em_scs1.jpg|400px|Piface-Relais 1 auf &#039;1&#039; geschaltet]]&lt;br /&gt;
&lt;br /&gt;
c. Das rechte Fenster ergibt sich, wenn man nun im Fenster auf &amp;quot;Override Enable&amp;quot; und dann &amp;quot;Output Pin 1&amp;quot; klickt. Es müsste ein &amp;quot;Klack&amp;quot; vom Relais 1 zu hören sein sowie der Schaltzustand des unteren Relais 1 (das an den Output Pin 1 gekoppelt ist) auf die Verbindung der beiden unteren Anschlüsse wechseln. Zugleich wird das erste LED-Icon beim Output Pin 1 rot sowie das zugehörige LED-Icon blau.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pif_rel2.png|thumb|right|250px|Schema der Piface-Relais]]&lt;br /&gt;
d. Rechts ist der Schaltzustand der Relais, die zu Beginn genutzt werden, im Grundzustand dargestellt (jeweils der mittlere und obere Kontakt sind kurzgeschlossen, der jeweils untere Kontakt ist frei):&lt;br /&gt;
&lt;br /&gt;
e. Ein weiterer Klick auf &amp;quot;Output Pin 1&amp;quot; versetzt das Relais in den Ausgangszustand, der vor dem nächsten Schritt wieder eingestellt werden sollte.&lt;br /&gt;
&lt;br /&gt;
f. Das Relais läßt sich auch mittel eines Python-Scripts vom RPi aus ansteuern. Dazu wird folgende Textdatei &amp;quot;wandler.py&amp;quot; im Arbeitsverzeichnis abgespeichert und mit dem Befehl &amp;quot;&amp;lt;tt&amp;gt;python wandler.py&amp;lt;/tt&amp;gt;&amp;quot; gestartet:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler.py&lt;br /&gt;
&lt;br /&gt;
 from time import sleep&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
&lt;br /&gt;
 pfio.init()&lt;br /&gt;
&lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
 print &amp;quot;Strom an&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 sleep(2)&lt;br /&gt;
&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Strom aus&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Nach dem Absetzen des Befehls wechselt nun das blaue Signal an Relais 1 für 2 Sekunden und das Relais klackt entsprechend.&lt;br /&gt;
&lt;br /&gt;
== Einsatz eines Relais&#039; zur Umsetzung von Spannungsänderungen ==&lt;br /&gt;
&lt;br /&gt;
a. Ist das Relais wieder im Ausgangszustand, befestigt man nun einen der vom Breadboard führenden Drähte am unteren und einen am mittleren Relaiseingang (im Moment ist die Polarität noch egal). Zunächst sollte nichts passieren (das Relais hält diesen ja Stromkreis noch offen).&lt;br /&gt;
&lt;br /&gt;
b. Startet man aber das Script wieder (&amp;lt;tt&amp;gt;python wandler.py&amp;lt;/tt&amp;gt;) oder klickt auf &#039;Output Pin 1&#039; wird der Nutzstromkreis geschlossen. Nochmals aufgepasst: unser Nutzer erhält wieder die maximal vorgesehene Spannung - also besser vorher im Script &amp;quot;&amp;lt;tt&amp;gt;sleep(0.3)&amp;lt;/tt&amp;gt;&amp;quot; setzen und speichern.&lt;br /&gt;
&lt;br /&gt;
c. Im Prinzip ist damit die programmgesteuerte Umsetzung eines 0/1 Signals in z.B. eine 0V/15V Spannung erreicht.&lt;br /&gt;
&lt;br /&gt;
d. Da wir bald verschiedene Steuerspannungen schalten wollen, geht es jetzt darum herauszufinden, bei welcher Spannung unser Nutzgerät gerade noch bewegt wird. Dies probiert man aus - mit dem kleinsten Widerstand beginnend: indem einer der Drähte in eine freie Breadboardspalte gesteckt wird und aus dieser Spalte der Widerstand zu dem &#039;alten&#039; Steckplatz des Drahtes geführt wird. Nun startet man jeweils das Script bis der Widerstand so hoch ist, dass die Anlaufspannung beim Nutzgerätes gut ausreicht, eine Reaktion des Nutzgerät (Fahrzeug bewegt sich) zu bewirken (z.B. bei 50 Ohm beträgt der Strom ca. 130 mA während ohne 190 mA fliessen).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Ansteuerung von 3 Schaltstufen =&lt;br /&gt;
&lt;br /&gt;
== Kombination von 2 Relais ==&lt;br /&gt;
&lt;br /&gt;
[[Bild:ZrelMww2.png|thumb|right|250px|Beschaltung der Relais]] a. Die einfachste Stufe der weiteren Verschaltung erreicht man, indem der Widerstand mit einem 2. Relais überbrückt wird. Relais 1 kann dann als &#039;Hauptschalter&#039;, Relais 2 als Spannungsumschalter genutzt werden:&lt;br /&gt;
&lt;br /&gt;
b. Diese Beschaltung kann sogleich mit dem PiFace-Emulator ausprobiert werden. Damit können wir bereits 3 Schaltstufen steuern: keine, verminderte und volle Spannung.&lt;br /&gt;
&lt;br /&gt;
c. Theoretisch liesse sich auch noch eine 4. Spannungsstufe erzeugen, da mit 2 &#039;Bits&#039; (Ein/Aus bei 2 Relais) bereits 4 verschiedene Signale darstellbar sind. Beim jetzigen Aufbau werden aber lediglich die (pin1,pin2)-Signale (0,0), (1,0) und (1,1) &#039;genutzt&#039;, da Relais 1 als Hauptschalter vorgesehen ist und die Kombination (0,1) so nicht ausgewertet wird.&lt;br /&gt;
&lt;br /&gt;
== Programmgesteuerte Schaltung von 2 Relais ==&lt;br /&gt;
&lt;br /&gt;
a. Mit einem veränderten python-Script &amp;quot;wandler2.py&amp;quot; ist auch die programmgesteuerte Schaltung möglich. Dabei werden zusätzlich die Tasten 1 und 2 des PiFace genutzt, um nach dem Start des Scripts (&amp;lt;tt&amp;gt;python wandler2.py&amp;lt;/tt&amp;gt;) den Hauptschalter (Relais 1) zu steuern:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler2.py&lt;br /&gt;
 &lt;br /&gt;
 from time import sleep&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
 pfio.init()&lt;br /&gt;
 &lt;br /&gt;
 taste_1=0&lt;br /&gt;
 taste_2=0&lt;br /&gt;
 intervall_a=0.1&lt;br /&gt;
 intervall_b=0.5&lt;br /&gt;
 # Die Intervalle bestimmen die Schaltzeit für volle/verminderte Spannung&lt;br /&gt;
 &lt;br /&gt;
 print &amp;quot;Zum Start Taste 1 drücken, zum Stoppen Taste 2&amp;quot;&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 while taste_1 == 0:&lt;br /&gt;
   sleep(intervall_a)&lt;br /&gt;
   taste_1=pfio.digital_read(1)&lt;br /&gt;
&lt;br /&gt;
 # Der o.g. &#039;sleep&#039;-Befehl bestimmt die Abfragepausen für Taste 1&lt;br /&gt;
 &lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
 print &amp;quot;Strom an!&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 while taste_2 == 0:&lt;br /&gt;
   pfio.digital_write(2,1)&lt;br /&gt;
   sleep(intervall_a)&lt;br /&gt;
   pfio.digital_write(2,0)&lt;br /&gt;
   sleep(intervall_b)&lt;br /&gt;
   taste_2=pfio.digital_read(2)&lt;br /&gt;
 &lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Strom aus!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
b. Falls beim Ausprobieren von Script-Änderungen mal was schief geht, kann das Script stets auch mit der Tastenkombination (CNTRL-C) gestoppt werden. U.U. muss dann noch zusätzlich Relais 1 und/oder 2 via Emulator zurückgesetzt werden.&lt;br /&gt;
&lt;br /&gt;
c. Beim Verändern des Scripts fällt bald auf, dass die bisherige Programmsteuerung keine direkte Möglichkeit vorsieht, auf Ereignisse zu reagieren. Immerhin wird ein mechanisches Gerät gesteuert, bei dem mit Ausfällen, Fertigungstoleranzen, Umwelteinflüssen etc. zu rechnen ist (im Script wird dies bislang &#039;nur&#039; durch die Abbruchbedingung &#039;Taste 2&#039; berücksichtigt).&lt;br /&gt;
&lt;br /&gt;
== Einfache Sensor-Signale als steuernde Elemente eines Programms ==&lt;br /&gt;
&lt;br /&gt;
a. Eine wichtige Anwendung von D/A-Steuerungen ist die mögliche Reaktion dieser Steuerung auf &#039;äußere&#039; Ereignisse, die z.B. mit Hilfe von Sensoren leistbar ist.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Einf_Sens.jpg|thumb|right|250px|einfacher Sensor]]b. Für unsere Zwecke genügt zunächst ein sehr einfacher Sensor, der ein 0- oder 1-Signal liefert und idealerweise direkt am &#039;Input Pin 1&#039; des PiFace angeschlossen werden kann. So liegt beim Input Pin 1 das Signal &#039;1&#039; an, wenn eine Verbindung zu &#039;Input GND&#039; besteht.&lt;br /&gt;
Z.B. können 2 unisolierte Drähte so plaziert werden, dass ein vorbeifahrendes Fahrzeug einen von ihnen genügend bewegt um den Kontakt kurze Zeit zu öffnen. Genau dann liefert dieser &#039;Sensor&#039; das Signal &#039;0&#039;. Eine - die Schwerkraft nutzende - mögliche Bauform ist rechts abgebildet ;-)&lt;br /&gt;
&lt;br /&gt;
c. Natürlich werden zusätzlich 2 isolierte Drähte benötigt, um jeden der beiden offenen Drähte geschützt mit Input Pin 1 und Input GND zu verbinden.&lt;br /&gt;
&lt;br /&gt;
d. Bei jeder Durchfahrt liefert der Sensor nun ein &#039;0&#039;-Signal, was im Script sowohl für eine Zeitmessung als auch für ein &#039;Schaltintervall-Array&#039; genutzt werden kann. Dort können abwechselnd für beide Spannungen Zeiten (die in etwa zum jeweiligen Streckenabschnitt passen) &#039;programmiert&#039; werden. Statt Taste 1 wird nun der Sensor ausgewertet (wobei Taste 1 als Sensor-Ersatz insoweit genutzt werden kann, dass sie gedrückt bleiben bzw. kurz losgelassen werden muss). Zur genaueren Zeitmessung wird noch das modul &#039;clock&#039; benötigt. &amp;quot;&amp;lt;tt&amp;gt;wandler3.py&amp;lt;/tt&amp;gt;&amp;quot; könnte also so aussehen:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler3.py&lt;br /&gt;
 &lt;br /&gt;
 from time import clock&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
 sensor_1=1&lt;br /&gt;
 sensor_2=0&lt;br /&gt;
 rundenzahl=0&lt;br /&gt;
 v_wechsel=0&lt;br /&gt;
 vorrunde=0&lt;br /&gt;
 index_zaehler=1&lt;br /&gt;
 &lt;br /&gt;
 zeit_array=[0,0.2,0.4,0.2,0.4,0.2,0.4,0.2,5,0.2,6]&lt;br /&gt;
 # dieses array enthält die sek. bis zum Spannungswechsel&lt;br /&gt;
&lt;br /&gt;
 array_laenge=9&lt;br /&gt;
 # legt fest, wie viel Werte des arrays genutzt werden sollen&lt;br /&gt;
 &lt;br /&gt;
 sensor_aus=1.3&lt;br /&gt;
 # bis der Sensor sicher in die Ruhestellung kippt, wird er nicht ausgelesen&lt;br /&gt;
  &lt;br /&gt;
 pfio.init()&lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
&lt;br /&gt;
 # das Fahrzeug wird langsam zum Start (=Sensor) bewegt&lt;br /&gt;
 while sensor_1 == 1 :&lt;br /&gt;
   sensor_1=pfio.digital_read(1)&lt;br /&gt;
  &lt;br /&gt;
 print &amp;quot;fliegender Start... zum Beenden Taste 2 drücken&amp;quot;&lt;br /&gt;
 print &amp;quot;Runde Nr., Ges.Zeit, Rundenzeit, mittlere Rundenzeit&amp;quot;&lt;br /&gt;
 start_zeit=clock()&lt;br /&gt;
 runden_start=start_zeit&lt;br /&gt;
  &lt;br /&gt;
 while sensor_2 == 0 :&lt;br /&gt;
   sensor_2=pfio.digital_read(2)&lt;br /&gt;
   v_wechsel=1-v_wechsel&lt;br /&gt;
   pfio.digital_write(2,v_wechsel)&lt;br /&gt;
   sensor_zeit=clock()&lt;br /&gt;
  &lt;br /&gt;
   while zeit_array[index_zaehler]+sensor_zeit &amp;gt; clock() :&lt;br /&gt;
     if runden_start+sensor_aus &amp;lt; clock() :&lt;br /&gt;
 &lt;br /&gt;
       sensor_1=pfio.digital_read(1) &lt;br /&gt;
       if sensor_1 == 0 :&lt;br /&gt;
         rundenzahl=rundenzahl+1&lt;br /&gt;
         runden_start=clock()&lt;br /&gt;
         zeit=runden_start-start_zeit&lt;br /&gt;
         print rundenzahl, zeit, zeit-vorrunde, zeit/rundenzahl&lt;br /&gt;
         vorrunde=zeit&lt;br /&gt;
         sensor_zeit=0&lt;br /&gt;
         index_zaehler=0&lt;br /&gt;
         v_wechsel=0&lt;br /&gt;
  &lt;br /&gt;
   index_zaehler=index_zaehler+1&lt;br /&gt;
   if index_zaehler &amp;gt; array_laenge :&lt;br /&gt;
     sensor_2=1&lt;br /&gt;
     print &amp;quot;array-Ende erreicht!&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Outp 1 &amp;amp; 2 auf 0!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wird das Array-Ende erreicht, wurden entweder zu wenige Einträge vorgesehen oder es befindet sich kein Fahrzeug (mehr) auf der Strecke, das den Sensor und damit des Zurücksetzen des Arrays auslösen konnte.&lt;br /&gt;
&lt;br /&gt;
e. Das Array ist an die jeweilige Strecke anzupassen, wobei der vorderste Eintrag ungenutzt bleibt und dann mit der Dauer für maximale Spannung begonnen wird. Solange man mit Relais arbeitet, sollten die Schaltzeiten nicht zu kurz sein (&amp;gt;0.1 sek), da diese eine gewisse mechanische Trägheit besitzen.&lt;br /&gt;
&lt;br /&gt;
f. Eben diese mechanische Beschaffenheit der Relais (Verschleiß) ist auch ein guter Grund, auf &#039;volle&#039; digitale Signalumwandlung umzustellen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Optokoppler als Ersatz für Relais =&lt;br /&gt;
&lt;br /&gt;
Ähnlich wie ein Relais dient ein [[Optokoppler]] dazu, eine Signalübertragung zwischen zwei getrennten Stromkreisen zu ermöglichen. Hier liegt der Einsatz von Optokopplern nahe, da sie schneller schalten und keine beweglichen Teile besitzen. Für unsere Zwecke benötigen wir nun als zusätzliche Elemente: Optokoppler (CNY 17-4), npn-[[Transistor]]en (BC 337-40) zur Signalverstärkung sowie einige Widerstände im Bereich von 2k und 400 Ohm. &lt;br /&gt;
&lt;br /&gt;
== Kaskadierung von Transistoren zur Signalverstärkung ==&lt;br /&gt;
&lt;br /&gt;
a. Entsprechend Schritt 2.4.d. (ein Relais bei 50 Ohm) wird zunächst ein Optokoppler eingesetzt, dessen Signal durch einen Transistor verstärkt wird, um die &#039;Grundspannung&#039; zu schalten (Pin 3 und 6 beim Optokoppler sollten unbeschaltet bleiben, allein der &#039;Lichtstrom&#039; reicht für eine Durchschaltung aus):&lt;br /&gt;
&lt;br /&gt;
[[Bild:PiF_CNY_BC_1.png|500px|Optokoppler mit Transistor]]&lt;br /&gt;
&lt;br /&gt;
b. Da immer mit einer gewissen Toleranz bei allen Komponenten zu rechnen ist, kann es sein, dass u.U. die Widerstände etwas größer oder kleiner gewählt werden müssen. Beim Ausprobieren sollte man hier in 10% Schritten variieren.&lt;br /&gt;
&lt;br /&gt;
c. Bei Austesten mit Emulator oder Script ist auch zu beachten, dass nun &#039;Output Pin 8&#039; genutzt wird, da dieser nicht mit den Relais verschaltet ist.&lt;br /&gt;
&lt;br /&gt;
== Umsetzung von 3 Schaltstufen mit Optokopplern ==&lt;br /&gt;
&lt;br /&gt;
a. Entsprechend dem Vorgehen beim Relais kann nun auch der kleine Widerstand zusätzlich beschaltet werden um seine gesteuerte Überbrückung zu ermöglichen. Da hier eine relativ geringe Spannung aufgeschaltet wird, kann zusätzlich eine Diode eingesetzt werden, die die Schaltstufe &#039;maximale Spannung&#039; anzeigt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:SmPiFu2ou2T.png|500px|Kombination von 2 Optokopplern]]&lt;br /&gt;
&lt;br /&gt;
b. Vor dem Testen ist wieder zu beachten, dass nun zusätzlich &#039;Output Pin 7&#039; genutzt wird (statt Output Pin 2).&lt;br /&gt;
&lt;br /&gt;
c. Eine mögliche Realisierung sieht so aus:...&lt;br /&gt;
&lt;br /&gt;
== Zusätzliche Erhöhung der Schaltstufen bei D/A-Wandlern ==&lt;br /&gt;
&lt;br /&gt;
a. Zwar benötigen wir in unserem speziellen Beispiel eine &#039;Grundspannung&#039;, die sich dahingehend auswirkt, dass - wie unter 3.1.c. erwähnt - eine Signalkombination nicht ausgewertet wird, aber mit jeder weiteren Schaltstufe würde sich dieses Problem (theoretisch) relativieren, da bei geschickter Auswahl der Widerstände (z.B. im Verhältnis 1 zu 2) jeweils eine Verdoppelung der Kombinationsmöglichkeiten erreichbar ist.&lt;br /&gt;
&lt;br /&gt;
b. Wird hier der 50 Ohm Widerstand asymmetrisch geteilt (z.B. 15 + 35 Ohm, s.a. [[Spannungsteiler]]) um dort ein weiteres Signal umsetzen zu können, ergeben sich direkt folgende 5 Schaltstufen (aus, 50, 35, 15 und 0 Ohm) u.s.w.:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Sm3ou3t2.png|450px|Erhöhung der Schaltstufen]]&lt;br /&gt;
&lt;br /&gt;
c. Zur Ansteuerung dieser Schaltstufen ist das Script so zu ändern, dass nun zwischen mehr als 2 Stufen gewechselt werden kann und im Array entsprechende Zusatzdaten vorgegeben und ausgelesen werden. Mehr als diese Stufen sind im konkreten Fall aber nicht sinnvoll, da die entstehende Verlustleistung in der Schaltung die maximal verfügbare Leistung reduziert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Weiterführende Ideen =&lt;br /&gt;
&lt;br /&gt;
== Hardwareseitige Ausbauvarianten ==&lt;br /&gt;
&lt;br /&gt;
Dem Ausbau dieses Ansatzes sind kaum Grenzen gesetzt:&lt;br /&gt;
&lt;br /&gt;
- beispielhafte Umsetzung einer differenzierten Abstufung mittels mittels einer logarithmischen Einteilung oder eines möglichst oft durch 2 teilbaren Anfangswertes und der Teiler (640 Ohm, 320, 160...);&lt;br /&gt;
&lt;br /&gt;
- Nachbau des Projekts mit einem Microcontroller (ggf. mit LCD-Anzeige);&lt;br /&gt;
&lt;br /&gt;
- Umbau der Steuerung mit dem Ziel, sie direkt an die GPIO-Pins des RPi anzuschließen;&lt;br /&gt;
&lt;br /&gt;
- Ergänzung um eine Sensorik, die in diesem Beispiel eine Rückmeldung liefert, ob ein Verbraucher aktiv ist oder nicht (Fahrzeug noch auf der Strecke?);&lt;br /&gt;
&lt;br /&gt;
- Einsatz anderer Sensortechniken und/oder mehrerer Sensoren zur Optimierung der Schnelligkeit oder parallelen Steuerung eines 2. Fahrzeuges;&lt;br /&gt;
&lt;br /&gt;
== Softwareseitige Ausbauvarianten ==&lt;br /&gt;
&lt;br /&gt;
- Optimierung des Scripts, indem die Sensor-Abfrage über einen &#039;Listener&#039; umgesetzt wird;&lt;br /&gt;
&lt;br /&gt;
- Erweiterung des Scripts um eine GUI mit Hilfe der python-lib Tkinter, um einen Nutzerzugriff auf das Steuerarray und/oder eine &#039;Verwaltung&#039; mehrerer Fahrzeuge;&lt;br /&gt;
&lt;br /&gt;
- Einbindung eines Web-Interface um eine &#039;Fernsteuerung&#039; zu ermöglichen...&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [http://hackaday.com/2013/01/23/replacement-controllers-for-slot-car-racing/ ähnliches Projekt bei &#039;hackaday&#039;] &lt;br /&gt;
* [https://docs.google.com/folder/d/0B-UAZ9CyJCLGQjJ3RDlqa2pqaDg/edit?pli=1&amp;amp;docId=0B-UAZ9CyJCLGNmpMeVpyYlZJUWc Relaisschaltung mit pädagogischer Erweiterung d. Universität Manchester]&lt;br /&gt;
* [http://elinux.org/RPi_Projects/PiFace_controlling_a_slot-car parallele englischsp. Dokumentation dieses Projekts mit anderem Schwerpunkt] &lt;br /&gt;
* [http://elinux.org/RPi_Projects englischsp. Projektliste zum RPi]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Raspberry Pi]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Mknot9</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=RPi_als_D/A-Wandler&amp;diff=74097</id>
		<title>RPi als D/A-Wandler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=RPi_als_D/A-Wandler&amp;diff=74097"/>
		<updated>2013-03-07T18:09:59Z</updated>

		<summary type="html">&lt;p&gt;Mknot9: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von mknot9&#039;&#039; (in Arbeit)&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
Oft wird ein Computer &#039;nur&#039; genutzt um darauf Software ablaufen zu lassen. Dessen Möglichkeit zur Steuerung von elektrischen und mechanischen Geräten wird dabei leicht übersehen.&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel richtet sich daher an Einsteiger, die mit dem [[Raspberry Pi]] (&#039;RPi&#039;) Grundlagen der Computersteuerung von Relais und Spannungsteilern nachvollziehen möchten. Es wird schrittweise dargestellt, wie mittels eines D/A-Wandlers (Digital/Analog-Wandler = Umwandlung von digitalen 1/0 Signale) die Steuerung einer stufenweise veränderbaren Ausgangsspannung nachgebaut werden kann.&lt;br /&gt;
&lt;br /&gt;
= Verwendete Hardware =&lt;br /&gt;
&lt;br /&gt;
== RPi in Kombination mit der &#039;PiFace&#039;-Karte als Bastelplattform ==&lt;br /&gt;
&lt;br /&gt;
Dank der einfachen Bauweise bietet sich der RPi mit seinen frei zugänglichen GPIO-Pins als ideale Bastelplattform an. Trotzdem kann es beim Experimentieren mit Schaltungen öfters zu kleinen Fehlern kommen, die schlimmstenfalls die empfindliche Elektronik des RPi dauerhaft beschädigen können.&lt;br /&gt;
&lt;br /&gt;
Daher wird bei diesem Projekt zusätzlich mit der &#039;PiFace[http://elinux.org/RPi_Expansion_Boards#Piface]&#039;-Karte gearbeitet, die man auf die GPIO-Pins stecken kann. Diese Erweiterungskarte verschaltet die GPIO-Pins auf je 8 digitale Ein- und Ausgänge, sowie 2 Relais, die eine galvanische Trennung von Stromkreisen ermöglichen. Damit besteht auch für Einsteiger ein gewisser Schutz für die Steuerelektronik des RPi.&lt;br /&gt;
&lt;br /&gt;
Auch im weiteren Verlauf dieser Einführung soll noch auf eine Trennung der Stromkreise Wert gelegt werden, so dass für erste digitale Schaltexperimente ein Optokoppler genutzt wird. Die spätere Nutzung der &#039;Input Pins&#039; des PiFace um eine Steuerung der D/A-Wandlung durch bestimmte Ereignisse zu ermöglichen, erfolgt ebenfalls passiv.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Auch wenn mit vermeindlich &#039;sicheren&#039; Transformatoren gebastelt wird, muss stets bedacht werden, dass diese an einem 230V-Stromnetz betrieben werden und man eher einmal mehr als weniger prüfen sollte, ob man durch eventuelle Fehler mit lebensgefährlicher Spannung in Berührung kommt!&lt;br /&gt;
&lt;br /&gt;
== Auswahl eines Beispielprojektes ==&lt;br /&gt;
&lt;br /&gt;
Günstige Möglichkeiten ein Gerät zu finden, das mit analogen Spannungen arbeitet, bieten sich u.a. im Spielzeugbereich. Im Grunde eignet sich alles, was mit Batterien oder mit Gleichspannungen unter 24 V betrieben wird.&lt;br /&gt;
&lt;br /&gt;
Da jedoch ein Ziel das Steuern von analogen Spannungen ist, bietet sich insbesondere alles an, bei dem [[Potentiometer]] eingesetzt werden. Einen dieser &#039;Handregler&#039; sollte man übrig haben, da er von seinem Anschlusskabel abgetrennt werden muss, um den oft proprietären Steckanschluss nutzen zu können. In diesem Sinne wird hier eine handelsübliche Spielzeug-Autorennbahn mit Potentiometer-Handreglern genutzt.&lt;br /&gt;
&lt;br /&gt;
== Sonstige Bauteile ==&lt;br /&gt;
&lt;br /&gt;
Für die ersten Grundlagen (s. Teile 2 &amp;amp; 3) genügen bereits rund 2 m isolierter Draht, der nicht aus verdrillten feinen Adern (Litze) bestehen sollte, 50 cm nicht-isolierter Draht, einige niederohmige Widerstände (z.B. je 2 mal 100 Ohm, 80, 60, sowie 20) und ein &#039;Experimentierbrett&#039; (engl. [[Breadboard]]).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Grundlagen und Vorbereitung des Projekts =&lt;br /&gt;
&lt;br /&gt;
== Umwandlung von 1/0 zu Ein/Aus mit einem Relais ==&lt;br /&gt;
&lt;br /&gt;
Vom Prinzip her ist jede Umwandlung eines digitalen 0 oder 1 Signals (das über eine bestimmte Spannungsdifferenz festgelegt ist) in eine (nutzbare) Spannung bereits eine D/A-Wandlung. Dies wird schlicht so realisiert, dass mit einer Eingabe am RPi die Nutzspannung des &#039;Verbrauchers&#039; zunächst einfach an- und ausgeschaltet wird.&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung der zu steuernden Hardware ==&lt;br /&gt;
&lt;br /&gt;
a. Um Fehlerquellen auszuschliessen sollte zunächst (und ggf. auch später!) kurz getestet werden, ob der vorhandene Regler wie erwartet funktioniert.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pif_Con9.jpg|thumb|right|400px|Fixierung der Reglerkabel]]&lt;br /&gt;
b. Nach dem Trennen des Reglers von der Einspeisung (und ggf. Ziehen des Netzsteckers) muss das Regler-Kabel abgeschnitten werden (eher nahe beim Regler, da das Kabel bald bis zum Breadboard reichen soll). Die neuen Enden des Einspeiseteils werden abisoliert und auf dem Breadboard diagonal zueinander mit einigen Spalten Abstand fixiert. Auch können bereits die Drähte, die später zum RPi führen, jeweils in den passenden kontaktführenden Spalten eingesteckt werden, z. B. wie rechts zu sehen (die nicht beschrifteten Drähte können vorerst ignoriert werden):&lt;br /&gt;
&lt;br /&gt;
c. Nun bietet sich eine gute Gelegenheit die maximale Spannung am Nutzgerät zu messen. Man verbindet das Regler-Kabel (nun ohne Regler) wieder mit der Einspeisung und die offenen Enden der Drähte mit dem Messgerät, bei dem zunächst ein Messbereich von ca. 10-50 Volt gewählt werden sollte. Dies sollte dann z.B. 14,8 V anzeigen. Natürlich können auch die beiden offenen Enden einen kleinen Moment kurz geschlossen werden, man sollte aber bedenken, dass das zu regelnde Nutzgerät dann die maximal vorgesehene Spannung erhält (hier: maximales Tempo).&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung des RPi ==&lt;br /&gt;
&lt;br /&gt;
Es wird davon ausgegangen, dass entsprechend des zugehörigen &#039;manual&#039; das PiFace bereits auf den RPi gesteckt ist, die nötigen python-Bilbliotheken installiert sind und man sich im Terminal-Arbeitsverzeichnis &#039;pi&#039; befindet.&lt;br /&gt;
&lt;br /&gt;
a. Zunächst wird der PiFace-Emulator (im Terminal direkt aus dem Arbeitsverzeichnis) gestartet: &amp;lt;tt&amp;gt;piface/scripts/piface-emulator&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b. Wenn alles richtig installiert wurde, erscheint ein Fenster (unten links), bei dem die vorerst wichtigen blauen Signale am rechten Rand wie folgt angezeigt werden sollten: &lt;br /&gt;
 &lt;br /&gt;
[[Datei:RPi_PiF_em-scs.jpg|400px|Piface-Emulator im default-Zustand]] [[Datei:RPi_PiF_em_scs1.jpg|400px|Piface-Relais 1 auf &#039;1&#039; geschaltet]]&lt;br /&gt;
&lt;br /&gt;
c. Das rechte Fenster ergibt sich, wenn man nun im Fenster auf &amp;quot;Override Enable&amp;quot; und dann &amp;quot;Output Pin 1&amp;quot; klickt. Es müsste ein &amp;quot;Klack&amp;quot; vom Relais 1 zu hören sein sowie der Schaltzustand des unteren Relais 1 (das an den Output Pin 1 gekoppelt ist) auf die Verbindung der beiden unteren Anschlüsse wechseln. Zugleich wird das erste LED-Icon beim Output Pin 1 rot sowie das zugehörige LED-Icon blau.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pif_rel2.png|thumb|right|250px|Schema der Piface-Relais]]&lt;br /&gt;
d. Rechts ist der Schaltzustand der Relais, die zu Beginn genutzt werden, im Grundzustand dargestellt (jeweils der mittlere und obere Kontakt sind kurzgeschlossen, der jeweils untere Kontakt ist frei):&lt;br /&gt;
&lt;br /&gt;
e. Ein weiterer Klick auf &amp;quot;Output Pin 1&amp;quot; versetzt das Relais in den Ausgangszustand, der vor dem nächsten Schritt wieder eingestellt werden sollte.&lt;br /&gt;
&lt;br /&gt;
f. Das Relais läßt sich auch mittel eines Python-Scripts vom RPi aus ansteuern. Dazu wird folgende Textdatei &amp;quot;wandler.py&amp;quot; im Arbeitsverzeichnis abgespeichert und mit dem Befehl &amp;quot;&amp;lt;tt&amp;gt;python wandler.py&amp;lt;/tt&amp;gt;&amp;quot; gestartet:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler.py&lt;br /&gt;
&lt;br /&gt;
 from time import sleep&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
&lt;br /&gt;
 pfio.init()&lt;br /&gt;
&lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
 print &amp;quot;Strom an&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 sleep(2)&lt;br /&gt;
&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Strom aus&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Nach dem Absetzen des Befehls wechselt nun das blaue Signal an Relais 1 für 2 Sekunden und das Relais klackt entsprechend.&lt;br /&gt;
&lt;br /&gt;
== Einsatz eines Relais&#039; zur Umsetzung von Spannungsänderungen ==&lt;br /&gt;
&lt;br /&gt;
a. Ist das Relais wieder im Ausgangszustand, befestigt man nun einen der vom Breadboard führenden Drähte am unteren und einen am mittleren Relaiseingang (im Moment ist die Polarität noch egal). Zunächst sollte nichts passieren (das Relais hält diesen ja Stromkreis noch offen).&lt;br /&gt;
&lt;br /&gt;
b. Startet man aber das Script wieder (&amp;lt;tt&amp;gt;python wandler.py&amp;lt;/tt&amp;gt;) oder klickt auf &#039;Output Pin 1&#039; wird der Nutzstromkreis geschlossen. Nochmals aufgepasst: unser Nutzer erhält wieder die maximal vorgesehene Spannung - also besser vorher im Script &amp;quot;&amp;lt;tt&amp;gt;sleep(0.3)&amp;lt;/tt&amp;gt;&amp;quot; setzen und speichern.&lt;br /&gt;
&lt;br /&gt;
c. Im Prinzip ist damit die programmgesteuerte Umsetzung eines 0/1 Signals in z.B. eine 0V/15V Spannung erreicht.&lt;br /&gt;
&lt;br /&gt;
d. Da wir bald verschiedene Steuerspannungen schalten wollen, geht es jetzt darum herauszufinden, bei welcher Spannung unser Nutzgerät gerade noch bewegt wird. Dies probiert man aus - mit dem kleinsten Widerstand beginnend: indem einer der Drähte in eine freie Breadboardspalte gesteckt wird und aus dieser Spalte der Widerstand zu dem &#039;alten&#039; Steckplatz des Drahtes geführt wird. Nun startet man jeweils das Script bis der Widerstand so hoch ist, dass die Anlaufspannung beim Nutzgerätes gut ausreicht, eine Reaktion des Nutzgerät (Fahrzeug bewegt sich) zu bewirken (z.B. bei 50 Ohm beträgt der Strom ca. 130 mA während ohne 190 mA fliessen).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Ansteuerung von 3 Schaltstufen =&lt;br /&gt;
&lt;br /&gt;
== Kombination von 2 Relais ==&lt;br /&gt;
&lt;br /&gt;
[[Bild:ZrelMww2.png|thumb|right|250px|Beschaltung der Relais]] a. Die einfachste Stufe der weiteren Verschaltung erreicht man, indem der Widerstand mit einem 2. Relais überbrückt wird. Relais 1 kann dann als &#039;Hauptschalter&#039;, Relais 2 als Spannungsumschalter genutzt werden:&lt;br /&gt;
&lt;br /&gt;
b. Diese Beschaltung kann sogleich mit dem PiFace-Emulator ausprobiert werden. Damit können wir bereits 3 Schaltstufen steuern: keine, verminderte und volle Spannung.&lt;br /&gt;
&lt;br /&gt;
c. Theoretisch liesse sich auch noch eine 4. Spannungsstufe erzeugen, da mit 2 &#039;Bits&#039; (Ein/Aus bei 2 Relais) bereits 4 verschiedene Signale darstellbar sind. Beim jetzigen Aufbau werden aber lediglich die (pin1,pin2)-Signale (0,0), (1,0) und (1,1) &#039;genutzt&#039;, da Relais 1 als Hauptschalter vorgesehen ist und die Kombination (0,1) so nicht ausgewertet wird.&lt;br /&gt;
&lt;br /&gt;
== Programmgesteuerte Schaltung von 2 Relais ==&lt;br /&gt;
&lt;br /&gt;
a. Mit einem veränderten python-Script &amp;quot;wandler2.py&amp;quot; ist auch die programmgesteuerte Schaltung möglich. Dabei werden zusätzlich die Tasten 1 und 2 des PiFace genutzt, um nach dem Start des Scripts (&amp;lt;tt&amp;gt;python wandler2.py&amp;lt;/tt&amp;gt;) den Hauptschalter (Relais 1) zu steuern:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler2.py&lt;br /&gt;
 &lt;br /&gt;
 from time import sleep&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
 pfio.init()&lt;br /&gt;
 &lt;br /&gt;
 taste_1=0&lt;br /&gt;
 taste_2=0&lt;br /&gt;
 intervall_a=0.1&lt;br /&gt;
 intervall_b=0.5&lt;br /&gt;
 # Die Intervalle bestimmen die Schaltzeit für volle/verminderte Spannung&lt;br /&gt;
 &lt;br /&gt;
 print &amp;quot;Zum Start Taste 1 drücken, zum Stoppen Taste 2&amp;quot;&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 while taste_1 == 0:&lt;br /&gt;
   sleep(intervall_a)&lt;br /&gt;
   taste_1=pfio.digital_read(1)&lt;br /&gt;
&lt;br /&gt;
 # Der o.g. &#039;sleep&#039;-Befehl bestimmt die Abfragepausen für Taste 1&lt;br /&gt;
 &lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
 print &amp;quot;Strom an!&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 while taste_2 == 0:&lt;br /&gt;
   pfio.digital_write(2,1)&lt;br /&gt;
   sleep(intervall_a)&lt;br /&gt;
   pfio.digital_write(2,0)&lt;br /&gt;
   sleep(intervall_b)&lt;br /&gt;
   taste_2=pfio.digital_read(2)&lt;br /&gt;
 &lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Strom aus!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
b. Falls beim Ausprobieren von Script-Änderungen mal was schief geht, kann das Script stets auch mit der Tastenkombination (CNTRL-C) gestoppt werden. U.U. muss dann noch zusätzlich Relais 1 und/oder 2 via Emulator zurückgesetzt werden.&lt;br /&gt;
&lt;br /&gt;
c. Beim Verändern des Scripts fällt bald auf, dass die bisherige Programmsteuerung keine direkte Möglichkeit vorsieht, auf Ereignisse zu reagieren. Immerhin wird ein mechanisches Gerät gesteuert, bei dem mit Ausfällen, Fertigungstoleranzen, Umwelteinflüssen etc. zu rechnen ist (im Script wird dies bislang &#039;nur&#039; durch die Abbruchbedingung &#039;Taste 2&#039; berücksichtigt).&lt;br /&gt;
&lt;br /&gt;
== Einfache Sensor-Signale als steuernde Elemente eines Programms ==&lt;br /&gt;
&lt;br /&gt;
a. Eine wichtige Anwendung von D/A-Steuerungen ist die mögliche Reaktion dieser Steuerung auf &#039;äußere&#039; Ereignisse, die z.B. mit Hilfe von Sensoren leistbar ist.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Einf_Sens.jpg|thumb|right|250px|einfacher Sensor]]b. Für unsere Zwecke genügt zunächst ein sehr einfacher Sensor, der ein 0- oder 1-Signal liefert und idealerweise direkt am &#039;Input Pin 1&#039; des PiFace angeschlossen werden kann. So liegt beim Input Pin 1 das Signal &#039;1&#039; an, wenn eine Verbindung zu &#039;Input GND&#039; besteht.&lt;br /&gt;
Z.B. können 2 unisolierte Drähte so plaziert werden, dass ein vorbeifahrendes Fahrzeug einen von ihnen genügend bewegt um den Kontakt kurze Zeit zu öffnen. Genau dann liefert dieser &#039;Sensor&#039; das Signal &#039;0&#039;. Eine - die Schwerkraft nutzende - mögliche Bauform ist rechts abgebildet ;-)&lt;br /&gt;
&lt;br /&gt;
c. Natürlich werden zusätzlich 2 isolierte Drähte benötigt, um jeden der beiden offenen Drähte geschützt mit Input Pin 1 und Input GND zu verbinden.&lt;br /&gt;
&lt;br /&gt;
d. Bei jeder Durchfahrt liefert der Sensor nun ein &#039;0&#039;-Signal, was im Script sowohl für eine Zeitmessung als auch für ein &#039;Schaltintervall-Array&#039; genutzt werden kann. Dort können abwechselnd für beide Spannungen Zeiten (die in etwa zum jeweiligen Streckenabschnitt passen) &#039;programmiert&#039; werden. Statt Taste 1 wird nun der Sensor ausgewertet (wobei Taste 1 als Sensor-Ersatz insoweit genutzt werden kann, dass sie gedrückt bleiben bzw. kurz losgelassen werden muss). Zur genaueren Zeitmessung wird noch das modul &#039;clock&#039; benötigt. &amp;quot;&amp;lt;tt&amp;gt;wandler3.py&amp;lt;/tt&amp;gt;&amp;quot; könnte also so aussehen:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler3.py&lt;br /&gt;
 &lt;br /&gt;
 from time import clock&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
 sensor_1=1&lt;br /&gt;
 sensor_2=0&lt;br /&gt;
 rundenzahl=0&lt;br /&gt;
 v_wechsel=0&lt;br /&gt;
 vorrunde=0&lt;br /&gt;
 index_zaehler=1&lt;br /&gt;
 &lt;br /&gt;
 zeit_array=[0,0.2,0.4,0.2,0.4,0.2,0.4,0.2,5,0.2,6]&lt;br /&gt;
 # dieses array enthält die sek. bis zum Spannungswechsel&lt;br /&gt;
&lt;br /&gt;
 array_laenge=9&lt;br /&gt;
 # legt fest, wie viel Werte des arrays genutzt werden sollen&lt;br /&gt;
 &lt;br /&gt;
 sensor_aus=1.3&lt;br /&gt;
 # bis der Sensor sicher in die Ruhestellung kippt, wird er nicht ausgelesen&lt;br /&gt;
  &lt;br /&gt;
 pfio.init()&lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
&lt;br /&gt;
 # das Fahrzeug wird langsam zum Start (=Sensor) bewegt&lt;br /&gt;
 while sensor_1 == 1 :&lt;br /&gt;
   sensor_1=pfio.digital_read(1)&lt;br /&gt;
  &lt;br /&gt;
 print &amp;quot;fliegender Start... zum Beenden Taste 2 drücken&amp;quot;&lt;br /&gt;
 print &amp;quot;Runde Nr., Ges.Zeit, Rundenzeit, mittlere Rundenzeit&amp;quot;&lt;br /&gt;
 start_zeit=clock()&lt;br /&gt;
 runden_start=start_zeit&lt;br /&gt;
  &lt;br /&gt;
 while sensor_2 == 0 :&lt;br /&gt;
   sensor_2=pfio.digital_read(2)&lt;br /&gt;
   v_wechsel=1-v_wechsel&lt;br /&gt;
   pfio.digital_write(2,v_wechsel)&lt;br /&gt;
   sensor_zeit=clock()&lt;br /&gt;
  &lt;br /&gt;
   while zeit_array[index_zaehler]+sensor_zeit &amp;gt; clock() :&lt;br /&gt;
     if runden_start+sensor_aus &amp;lt; clock() :&lt;br /&gt;
 &lt;br /&gt;
       sensor_1=pfio.digital_read(1) &lt;br /&gt;
       if sensor_1 == 0 :&lt;br /&gt;
         rundenzahl=rundenzahl+1&lt;br /&gt;
         runden_start=clock()&lt;br /&gt;
         zeit=runden_start-start_zeit&lt;br /&gt;
         print rundenzahl, zeit, zeit-vorrunde, zeit/rundenzahl&lt;br /&gt;
         vorrunde=zeit&lt;br /&gt;
         sensor_zeit=0&lt;br /&gt;
         index_zaehler=0&lt;br /&gt;
         v_wechsel=0&lt;br /&gt;
  &lt;br /&gt;
   index_zaehler=index_zaehler+1&lt;br /&gt;
   if index_zaehler &amp;gt; array_laenge :&lt;br /&gt;
     sensor_2=1&lt;br /&gt;
     print &amp;quot;array-Ende erreicht!&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Outp 1 &amp;amp; 2 auf 0!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wird das Array-Ende erreicht, wurden entweder zu wenige Einträge vorgesehen oder es befindet sich kein Fahrzeug (mehr) auf der Strecke, das den Sensor und damit des Zurücksetzen des Arrays auslösen konnte.&lt;br /&gt;
&lt;br /&gt;
e. Das Array ist an die jeweilige Strecke anzupassen, wobei der vorderste Eintrag ungenutzt bleibt und dann mit der Dauer für maximale Spannung begonnen wird. Solange man mit Relais arbeitet, sollten die Schaltzeiten nicht zu kurz sein (&amp;gt;0.1 sek), da diese eine gewisse mechanische Trägheit besitzen.&lt;br /&gt;
&lt;br /&gt;
f. Eben diese mechanische Beschaffenheit der Relais (Verschleiß) ist auch ein guter Grund, auf &#039;volle&#039; digitale Signalumwandlung umzustellen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Optokoppler als Ersatz für Relais =&lt;br /&gt;
&lt;br /&gt;
Ähnlich wie ein Relais dient ein [[Optokoppler]] dazu, eine Signalübertragung zwischen zwei getrennten Stromkreisen zu ermöglichen. Hier liegt der Einsatz von Optokopplern nahe, da sie schneller schalten und keine beweglichen Teile besitzen. Für unsere Zwecke benötigen wir nun als zusätzliche Elemente: Optokoppler (CNY 17-4), npn-[[Transistor]]en (BC 337-40) zur Signalverstärkung sowie einige Widerstände im Bereich von 2k und 400 Ohm. &lt;br /&gt;
&lt;br /&gt;
== Kaskadierung von Transistoren zur Signalverstärkung ==&lt;br /&gt;
&lt;br /&gt;
a. Entsprechend Schritt 2.4.d. (ein Relais bei 50 Ohm) wird zunächst ein Optokoppler eingesetzt, dessen Signal durch einen Transistor verstärkt wird, um die &#039;Grundspannung&#039; zu schalten (Pin 3 und 6 beim Optokoppler sollten unbeschaltet bleiben, allein der &#039;Lichtstrom&#039; reicht für eine Durchschaltung aus):&lt;br /&gt;
&lt;br /&gt;
[[Bild:PiF_CNY_BC_1.png|500px|Optokoppler mit Transistor]]&lt;br /&gt;
&lt;br /&gt;
b. Da immer mit einer gewissen Toleranz bei allen Komponenten zu rechnen ist, kann es sein, dass u.U. die Widerstände etwas größer oder kleiner gewählt werden müssen. Beim Ausprobieren sollte man hier in 10% Schritten variieren.&lt;br /&gt;
&lt;br /&gt;
c. Bei Austesten mit Emulator oder Script ist auch zu beachten, dass nun &#039;Output Pin 8&#039; genutzt wird, da dieser nicht mit den Relais verschaltet ist.&lt;br /&gt;
&lt;br /&gt;
== Umsetzung von 3 Schaltstufen mit Optokopplern ==&lt;br /&gt;
&lt;br /&gt;
a. Entsprechend dem Vorgehen beim Relais kann nun auch der kleine Widerstand zusätzlich beschaltet werden um seine gesteuerte Überbrückung zu ermöglichen. Da hier eine relativ geringe Spannung aufgeschaltet wird, kann zusätzlich eine Diode eingesetzt werden, die die Schaltstufe &#039;maximale Spannung&#039; anzeigt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:SmPiFu2ou2T.png|500px|Kombination von 2 Optokopplern]]&lt;br /&gt;
&lt;br /&gt;
b. Vor dem Testen ist wieder zu beachten, dass nun zusätzlich &#039;Output Pin 7&#039; genutzt wird (statt Output Pin 2).&lt;br /&gt;
&lt;br /&gt;
c. Eine mögliche Realisierung sieht so aus:...&lt;br /&gt;
&lt;br /&gt;
== Zusätzliche Erhöhung der Schaltstufen bei D/A-Wandlern ==&lt;br /&gt;
&lt;br /&gt;
a. Zwar benötigen wir in unserem speziellen Beispiel eine &#039;Grundspannung&#039;, die sich dahingehend auswirkt, dass - wie unter 3.1.c. erwähnt - eine Signalkombination nicht ausgewertet wird, aber mit jeder weiteren Schaltstufe würde sich dieses Problem (theoretisch) relativieren, da bei geschickter Auswahl der Widerstände (z.B. im Verhältnis 1 zu 2) jeweils eine Verdoppelung der Kombinationsmöglichkeiten erreichbar ist.&lt;br /&gt;
&lt;br /&gt;
b. Wird hier der 50 Ohm Widerstand asymmetrisch geteilt (z.B. 15 + 35 Ohm, s.a. [[Spannungsteiler]]) um dort ein weiteres Signal umsetzen zu können, ergeben sich direkt folgende 5 Schaltstufen (aus, 50, 35, 15 und 0 Ohm) u.s.w.:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Sm3ou3t2.png|450px|Erhöhung der Schaltstufen]]&lt;br /&gt;
&lt;br /&gt;
c. Zur Ansteuerung dieser Schaltstufen ist das Script so zu ändern, dass nun zwischen mehr als 2 Stufen gewechselt werden kann und im Array entsprechende Zusatzdaten vorgegeben und ausgelesen werden. Mehr als diese Stufen sind im konkreten Fall aber nicht sinnvoll, da die entstehende Verlustleistung in der Schaltung die maximal verfügbare Leistung reduziert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Weiterführende Ideen =&lt;br /&gt;
&lt;br /&gt;
== Hardwareseitige Ausbauvarianten ==&lt;br /&gt;
&lt;br /&gt;
Dem Ausbau dieses Ansatzes sind kaum Grenzen gesetzt:&lt;br /&gt;
&lt;br /&gt;
- beispielhafte Umsetzung einer differenzierten Abstufung mittels mittels einer logarithmischen Einteilung oder eines möglichst oft durch 2 teilbaren Anfangswertes und der Teiler (640 Ohm, 320, 160...);&lt;br /&gt;
&lt;br /&gt;
- Nachbau des Projekts mit einem Microcontroller (ggf. mit LCD-Anzeige);&lt;br /&gt;
&lt;br /&gt;
- Umbau der Steuerung mit dem Ziel, sie direkt an die GPIO-Pins des RPi anzuschließen;&lt;br /&gt;
&lt;br /&gt;
- Ergänzung um eine Sensorik, die in diesem Beispiel eine Rückmeldung liefert, ob ein Verbraucher aktiv ist oder nicht (Fahrzeug noch auf der Strecke?);&lt;br /&gt;
&lt;br /&gt;
- Einsatz anderer Sensortechniken und/oder mehrerer Sensoren zur Optimierung der Schnelligkeit oder parallelen Steuerung eines 2. Fahrzeuges;&lt;br /&gt;
&lt;br /&gt;
== Softwareseitige Ausbauvarianten ==&lt;br /&gt;
&lt;br /&gt;
- Optimierung des Scripts, indem die Sensor-Abfrage über einen &#039;Listener&#039; umgesetzt wird;&lt;br /&gt;
&lt;br /&gt;
- Erweiterung des Scripts um eine GUI mit Hilfe der python-lib Tkinter, um einen Nutzerzugriff auf das Steuerarray und/oder eine &#039;Verwaltung&#039; mehrerer Fahrzeuge;&lt;br /&gt;
&lt;br /&gt;
- Einbindung eines Web-Interface um eine &#039;Fernsteuerung&#039; zu ermöglichen...&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [http://hackaday.com/2013/01/23/replacement-controllers-for-slot-car-racing/ ähnliches Projekt bei &#039;hackaday&#039;] &lt;br /&gt;
* [https://docs.google.com/folder/d/0B-UAZ9CyJCLGQjJ3RDlqa2pqaDg/edit?pli=1&amp;amp;docId=0B-UAZ9CyJCLGNmpMeVpyYlZJUWc Relaisschaltung mit pädagogischer Erweiterung d. Universität Manchester]&lt;br /&gt;
* [http://elinux.org/RPi_Projects/PiFace_controlling_a_slot-car parallele englischsp. Dokumentation dieses Projekts mit anderem Schwerpunkt] &lt;br /&gt;
* [http://elinux.org/RPi_Projects englischsp. Projektliste zum RPi]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Raspberry Pi]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Mknot9</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=RPi_als_D/A-Wandler&amp;diff=74096</id>
		<title>RPi als D/A-Wandler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=RPi_als_D/A-Wandler&amp;diff=74096"/>
		<updated>2013-03-07T18:07:47Z</updated>

		<summary type="html">&lt;p&gt;Mknot9: /* Umsetzung von 3 Schaltstufen mit Optokopplern */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von mknot9&#039;&#039; (in Arbeit)&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
Oft wird ein Computer &#039;nur&#039; genutzt um darauf Software ablaufen zu lassen. Dessen Möglichkeit zur Steuerung von elektrischen und mechanischen Geräten wird dabei leicht übersehen.&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel richtet sich daher an Einsteiger, die mit dem [[Raspberry Pi]] (&#039;RPi&#039;) Grundlagen der Computersteuerung von Relais und Spannungsteilern nachvollziehen möchten. Es wird schrittweise dargestellt, wie mittels eines D/A-Wandlers (Digital/Analog-Wandler = Umwandlung von digitalen 1/0 Signale) die Steuerung einer stufenweise veränderbaren Ausgangsspannung nachgebaut werden kann.&lt;br /&gt;
&lt;br /&gt;
= Verwendete Hardware =&lt;br /&gt;
&lt;br /&gt;
== RPi in Kombination mit der &#039;PiFace&#039;-Karte als Bastelplattform ==&lt;br /&gt;
&lt;br /&gt;
Dank der einfachen Bauweise bietet sich der RPi mit seinen frei zugänglichen GPIO-Pins als ideale Bastelplattform an. Trotzdem kann es beim Experimentieren mit Schaltungen öfters zu kleinen Fehlern kommen, die schlimmstenfalls die empfindliche Elektronik des RPi dauerhaft beschädigen können.&lt;br /&gt;
&lt;br /&gt;
Daher wird bei diesem Projekt zusätzlich mit der &#039;PiFace[http://elinux.org/RPi_Expansion_Boards#Piface]&#039;-Karte gearbeitet, die man auf die GPIO-Pins stecken kann. Diese Erweiterungskarte verschaltet die GPIO-Pins auf je 8 digitale Ein- und Ausgänge, sowie 2 Relais, die eine galvanische Trennung von Stromkreisen ermöglichen. Damit besteht auch für Einsteiger ein gewisser Schutz für die Steuerelektronik des RPi.&lt;br /&gt;
&lt;br /&gt;
Auch im weiteren Verlauf dieser Einführung soll noch auf eine Trennung der Stromkreise Wert gelegt werden, so dass für erste digitale Schaltexperimente ein Optokoppler genutzt wird. Die spätere Nutzung der &#039;Input Pins&#039; des PiFace um eine Steuerung der D/A-Wandlung durch bestimmte Ereignisse zu ermöglichen, erfolgt ebenfalls passiv.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Auch wenn mit vermeindlich &#039;sicheren&#039; Transformatoren gebastelt wird, muss stets bedacht werden, dass diese an einem 230V-Stromnetz betrieben werden und man eher einmal mehr als weniger prüfen sollte, ob man durch eventuelle Fehler mit lebensgefährlicher Spannung in Berührung kommt!&lt;br /&gt;
&lt;br /&gt;
== Auswahl eines Beispielprojektes ==&lt;br /&gt;
&lt;br /&gt;
Günstige Möglichkeiten ein Gerät zu finden, das mit analogen Spannungen arbeitet, bieten sich u.a. im Spielzeugbereich. Im Grunde eignet sich alles, was mit Batterien oder mit Gleichspannungen unter 24 V betrieben wird.&lt;br /&gt;
&lt;br /&gt;
Da jedoch ein Ziel das Steuern von analogen Spannungen ist, bietet sich insbesondere alles an, bei dem [[Potentiometer]] eingesetzt werden. Einen dieser &#039;Handregler&#039; sollte man übrig haben, da er von seinem Anschlusskabel abgetrennt werden muss, um den oft proprietären Steckanschluss nutzen zu können. In diesem Sinne wird hier eine handelsübliche Spielzeug-Autorennbahn mit Potentiometer-Handreglern genutzt.&lt;br /&gt;
&lt;br /&gt;
== Sonstige Bauteile ==&lt;br /&gt;
&lt;br /&gt;
Für die ersten Grundlagen (s. Teile 2 &amp;amp; 3) genügen bereits rund 2 m isolierter Draht, der nicht aus verdrillten feinen Adern (Litze) bestehen sollte, 50 cm nicht-isolierter Draht, einige niederohmige Widerstände (z.B. je 2 mal 100 Ohm, 80, 60, sowie 20) und ein &#039;Experimentierbrett&#039; (engl. [[Breadboard]]).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Grundlagen und Vorbereitung des Projekts =&lt;br /&gt;
&lt;br /&gt;
== Umwandlung von 1/0 zu Ein/Aus mit einem Relais ==&lt;br /&gt;
&lt;br /&gt;
Vom Prinzip her ist jede Umwandlung eines digitalen 0 oder 1 Signals (das über eine bestimmte Spannungsdifferenz festgelegt ist) in eine (nutzbare) Spannung bereits eine D/A-Wandlung. Dies wird schlicht so realisiert, dass mit einer Eingabe am RPi die Nutzspannung des &#039;Verbrauchers&#039; zunächst einfach an- und ausgeschaltet wird.&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung der zu steuernden Hardware ==&lt;br /&gt;
&lt;br /&gt;
a. Um Fehlerquellen auszuschliessen sollte zunächst (und ggf. auch später!) kurz getestet werden, ob der vorhandene Regler wie erwartet funktioniert.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pif_Con9.jpg|thumb|right|400px|Fixierung der Reglerkabel]]&lt;br /&gt;
b. Nach dem Trennen des Reglers von der Einspeisung (und ggf. Ziehen des Netzsteckers) muss das Regler-Kabel abgeschnitten werden (eher nahe beim Regler, da das Kabel bald bis zum Breadboard reichen soll). Die neuen Enden des Einspeiseteils werden abisoliert und auf dem Breadboard diagonal zueinander mit einigen Spalten Abstand fixiert. Auch können bereits die Drähte, die später zum RPi führen, jeweils in den passenden kontaktführenden Spalten eingesteckt werden, z. B. wie rechts zu sehen (die nicht beschrifteten Drähte können vorerst ignoriert werden):&lt;br /&gt;
&lt;br /&gt;
c. Nun bietet sich eine gute Gelegenheit die maximale Spannung am Nutzgerät zu messen. Man verbindet das Regler-Kabel (nun ohne Regler) wieder mit der Einspeisung und die offenen Enden der Drähte mit dem Messgerät, bei dem zunächst ein Messbereich von ca. 10-50 Volt gewählt werden sollte. Dies sollte dann z.B. 14,8 V anzeigen. Natürlich können auch die beiden offenen Enden einen kleinen Moment kurz geschlossen werden, man sollte aber bedenken, dass das zu regelnde Nutzgerät dann die maximal vorgesehene Spannung erhält (hier: maximales Tempo).&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung des RPi ==&lt;br /&gt;
&lt;br /&gt;
Es wird davon ausgegangen, dass entsprechend des zugehörigen &#039;manual&#039; das PiFace bereits auf den RPi gesteckt ist, die nötigen python-Bilbliotheken installiert sind und man sich im Terminal-Arbeitsverzeichnis &#039;pi&#039; befindet.&lt;br /&gt;
&lt;br /&gt;
a. Zunächst wird der PiFace-Emulator (im Terminal direkt aus dem Arbeitsverzeichnis) gestartet: &amp;lt;tt&amp;gt;piface/scripts/piface-emulator&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b. Wenn alles richtig installiert wurde, erscheint ein Fenster (unten links), bei dem die vorerst wichtigen blauen Signale am rechten Rand wie folgt angezeigt werden sollten: &lt;br /&gt;
 &lt;br /&gt;
[[Datei:RPi_PiF_em-scs.jpg|400px|Piface-Emulator im default-Zustand]] [[Datei:RPi_PiF_em_scs1.jpg|400px|Piface-Relais 1 auf &#039;1&#039; geschaltet]]&lt;br /&gt;
&lt;br /&gt;
c. Das rechte Fenster ergibt sich, wenn man nun im Fenster auf &amp;quot;Override Enable&amp;quot; und dann &amp;quot;Output Pin 1&amp;quot; klickt. Es müsste ein &amp;quot;Klack&amp;quot; vom Relais 1 zu hören sein sowie der Schaltzustand des unteren Relais 1 (das an den Output Pin 1 gekoppelt ist) auf die Verbindung der beiden unteren Anschlüsse wechseln. Zugleich wird das erste LED-Icon beim Output Pin 1 rot sowie das zugehörige LED-Icon blau.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pif_rel2.png|thumb|right|250px|Schema der Piface-Relais]]&lt;br /&gt;
d. Rechts ist der Schaltzustand der Relais, die zu Beginn genutzt werden, im Grundzustand dargestellt (jeweils der mittlere und obere Kontakt sind kurzgeschlossen, der jeweils untere Kontakt ist frei):&lt;br /&gt;
&lt;br /&gt;
e. Ein weiterer Klick auf &amp;quot;Output Pin 1&amp;quot; versetzt das Relais in den Ausgangszustand, der vor dem nächsten Schritt wieder eingestellt werden sollte.&lt;br /&gt;
&lt;br /&gt;
f. Das Relais läßt sich auch mittel eines Python-Scripts vom RPi aus ansteuern. Dazu wird folgende Textdatei &amp;quot;wandler.py&amp;quot; im Arbeitsverzeichnis abgespeichert und mit dem Befehl &amp;quot;&amp;lt;tt&amp;gt;python wandler.py&amp;lt;/tt&amp;gt;&amp;quot; gestartet:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler.py&lt;br /&gt;
&lt;br /&gt;
 from time import sleep&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
&lt;br /&gt;
 pfio.init()&lt;br /&gt;
&lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
 print &amp;quot;Strom an&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 sleep(2)&lt;br /&gt;
&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Strom aus&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Nach dem Absetzen des Befehls wechselt nun das blaue Signal an Relais 1 für 2 Sekunden und das Relais klackt entsprechend.&lt;br /&gt;
&lt;br /&gt;
== Einsatz eines Relais&#039; zur Umsetzung von Spannungsänderungen ==&lt;br /&gt;
&lt;br /&gt;
a. Ist das Relais wieder im Ausgangszustand, befestigt man nun einen der vom Breadboard führenden Drähte am unteren und einen am mittleren Relaiseingang (im Moment ist die Polarität noch egal). Zunächst sollte nichts passieren (das Relais hält diesen ja Stromkreis noch offen).&lt;br /&gt;
&lt;br /&gt;
b. Startet man aber das Script wieder (&amp;lt;tt&amp;gt;python wandler.py&amp;lt;/tt&amp;gt;) oder klickt auf &#039;Output Pin 1&#039; wird der Nutzstromkreis geschlossen. Nochmals aufgepasst: unser Nutzer erhält wieder die maximal vorgesehene Spannung - also besser vorher im Script &amp;quot;&amp;lt;tt&amp;gt;sleep(0.3)&amp;lt;/tt&amp;gt;&amp;quot; setzen und speichern.&lt;br /&gt;
&lt;br /&gt;
c. Im Prinzip ist damit die programmgesteuerte Umsetzung eines 0/1 Signals in z.B. eine 0V/15V Spannung erreicht.&lt;br /&gt;
&lt;br /&gt;
d. Da wir bald verschiedene Steuerspannungen schalten wollen, geht es jetzt darum herauszufinden, bei welcher Spannung unser Nutzgerät gerade noch bewegt wird. Dies probiert man aus - mit dem kleinsten Widerstand beginnend: indem einer der Drähte in eine freie Breadboardspalte gesteckt wird und aus dieser Spalte der Widerstand zu dem &#039;alten&#039; Steckplatz des Drahtes geführt wird. Nun startet man jeweils das Script bis der Widerstand so hoch ist, dass die Anlaufspannung beim Nutzgerätes gut ausreicht, eine Reaktion des Nutzgerät (Fahrzeug bewegt sich) zu bewirken (z.B. bei 50 Ohm beträgt der Strom ca. 130 mA während ohne 190 mA fliessen).&lt;br /&gt;
&lt;br /&gt;
= Ansteuerung von 3 Schaltstufen =&lt;br /&gt;
&lt;br /&gt;
== Kombination von 2 Relais ==&lt;br /&gt;
&lt;br /&gt;
[[Bild:ZrelMww2.png|thumb|right|250px|Beschaltung der Relais]] a. Die einfachste Stufe der weiteren Verschaltung erreicht man, indem der Widerstand mit einem 2. Relais überbrückt wird. Relais 1 kann dann als &#039;Hauptschalter&#039;, Relais 2 als Spannungsumschalter genutzt werden:&lt;br /&gt;
&lt;br /&gt;
b. Diese Beschaltung kann sogleich mit dem PiFace-Emulator ausprobiert werden. Damit können wir bereits 3 Schaltstufen steuern: keine, verminderte und volle Spannung.&lt;br /&gt;
&lt;br /&gt;
c. Theoretisch liesse sich auch noch eine 4. Spannungsstufe erzeugen, da mit 2 &#039;Bits&#039; (Ein/Aus bei 2 Relais) bereits 4 verschiedene Signale darstellbar sind. Beim jetzigen Aufbau werden aber lediglich die (pin1,pin2)-Signale (0,0), (1,0) und (1,1) &#039;genutzt&#039;, da Relais 1 als Hauptschalter vorgesehen ist und die Kombination (0,1) so nicht ausgewertet wird.&lt;br /&gt;
&lt;br /&gt;
== Programmgesteuerte Schaltung von 2 Relais ==&lt;br /&gt;
&lt;br /&gt;
a. Mit einem veränderten python-Script &amp;quot;wandler2.py&amp;quot; ist auch die programmgesteuerte Schaltung möglich. Dabei werden zusätzlich die Tasten 1 und 2 des PiFace genutzt, um nach dem Start des Scripts (&amp;lt;tt&amp;gt;python wandler2.py&amp;lt;/tt&amp;gt;) den Hauptschalter (Relais 1) zu steuern:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler2.py&lt;br /&gt;
 &lt;br /&gt;
 from time import sleep&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
 pfio.init()&lt;br /&gt;
 &lt;br /&gt;
 taste_1=0&lt;br /&gt;
 taste_2=0&lt;br /&gt;
 intervall_a=0.1&lt;br /&gt;
 intervall_b=0.5&lt;br /&gt;
 # Die Intervalle bestimmen die Schaltzeit für volle/verminderte Spannung&lt;br /&gt;
 &lt;br /&gt;
 print &amp;quot;Zum Start Taste 1 drücken, zum Stoppen Taste 2&amp;quot;&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 while taste_1 == 0:&lt;br /&gt;
   sleep(intervall_a)&lt;br /&gt;
   taste_1=pfio.digital_read(1)&lt;br /&gt;
&lt;br /&gt;
 # Der o.g. &#039;sleep&#039;-Befehl bestimmt die Abfragepausen für Taste 1&lt;br /&gt;
 &lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
 print &amp;quot;Strom an!&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 while taste_2 == 0:&lt;br /&gt;
   pfio.digital_write(2,1)&lt;br /&gt;
   sleep(intervall_a)&lt;br /&gt;
   pfio.digital_write(2,0)&lt;br /&gt;
   sleep(intervall_b)&lt;br /&gt;
   taste_2=pfio.digital_read(2)&lt;br /&gt;
 &lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Strom aus!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
b. Falls beim Ausprobieren von Script-Änderungen mal was schief geht, kann das Script stets auch mit der Tastenkombination (CNTRL-C) gestoppt werden. U.U. muss dann noch zusätzlich Relais 1 und/oder 2 via Emulator zurückgesetzt werden.&lt;br /&gt;
&lt;br /&gt;
c. Beim Verändern des Scripts fällt bald auf, dass die bisherige Programmsteuerung keine direkte Möglichkeit vorsieht, auf Ereignisse zu reagieren. Immerhin wird ein mechanisches Gerät gesteuert, bei dem mit Ausfällen, Fertigungstoleranzen, Umwelteinflüssen etc. zu rechnen ist (im Script wird dies bislang &#039;nur&#039; durch die Abbruchbedingung &#039;Taste 2&#039; berücksichtigt).&lt;br /&gt;
&lt;br /&gt;
== Einfache Sensor-Signale als steuernde Elemente eines Programms ==&lt;br /&gt;
&lt;br /&gt;
a. Eine wichtige Anwendung von D/A-Steuerungen ist die mögliche Reaktion dieser Steuerung auf &#039;äußere&#039; Ereignisse, die z.B. mit Hilfe von Sensoren leistbar ist.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Einf_Sens.jpg|thumb|right|250px|einfacher Sensor]]b. Für unsere Zwecke genügt zunächst ein sehr einfacher Sensor, der ein 0- oder 1-Signal liefert und idealerweise direkt am &#039;Input Pin 1&#039; des PiFace angeschlossen werden kann. So liegt beim Input Pin 1 das Signal &#039;1&#039; an, wenn eine Verbindung zu &#039;Input GND&#039; besteht.&lt;br /&gt;
Z.B. können 2 unisolierte Drähte so plaziert werden, dass ein vorbeifahrendes Fahrzeug einen von ihnen genügend bewegt um den Kontakt kurze Zeit zu öffnen. Genau dann liefert dieser &#039;Sensor&#039; das Signal &#039;0&#039;. Eine - die Schwerkraft nutzende - mögliche Bauform ist rechts abgebildet ;-)&lt;br /&gt;
&lt;br /&gt;
c. Natürlich werden zusätzlich 2 isolierte Drähte benötigt, um jeden der beiden offenen Drähte geschützt mit Input Pin 1 und Input GND zu verbinden.&lt;br /&gt;
&lt;br /&gt;
d. Bei jeder Durchfahrt liefert der Sensor nun ein &#039;0&#039;-Signal, was im Script sowohl für eine Zeitmessung als auch für ein &#039;Schaltintervall-Array&#039; genutzt werden kann. Dort können abwechselnd für beide Spannungen Zeiten (die in etwa zum jeweiligen Streckenabschnitt passen) &#039;programmiert&#039; werden. Statt Taste 1 wird nun der Sensor ausgewertet (wobei Taste 1 als Sensor-Ersatz insoweit genutzt werden kann, dass sie gedrückt bleiben bzw. kurz losgelassen werden muss). Zur genaueren Zeitmessung wird noch das modul &#039;clock&#039; benötigt. &amp;quot;&amp;lt;tt&amp;gt;wandler3.py&amp;lt;/tt&amp;gt;&amp;quot; könnte also so aussehen:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler3.py&lt;br /&gt;
 &lt;br /&gt;
 from time import clock&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
 sensor_1=1&lt;br /&gt;
 sensor_2=0&lt;br /&gt;
 rundenzahl=0&lt;br /&gt;
 v_wechsel=0&lt;br /&gt;
 vorrunde=0&lt;br /&gt;
 index_zaehler=1&lt;br /&gt;
 &lt;br /&gt;
 zeit_array=[0,0.2,0.4,0.2,0.4,0.2,0.4,0.2,5,0.2,6]&lt;br /&gt;
 # dieses array enthält die sek. bis zum Spannungswechsel&lt;br /&gt;
&lt;br /&gt;
 array_laenge=9&lt;br /&gt;
 # legt fest, wie viel Werte des arrays genutzt werden sollen&lt;br /&gt;
 &lt;br /&gt;
 sensor_aus=1.3&lt;br /&gt;
 # bis der Sensor sicher in die Ruhestellung kippt, wird er nicht ausgelesen&lt;br /&gt;
  &lt;br /&gt;
 pfio.init()&lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
&lt;br /&gt;
 # das Fahrzeug wird langsam zum Start (=Sensor) bewegt&lt;br /&gt;
 while sensor_1 == 1 :&lt;br /&gt;
   sensor_1=pfio.digital_read(1)&lt;br /&gt;
  &lt;br /&gt;
 print &amp;quot;fliegender Start... zum Beenden Taste 2 drücken&amp;quot;&lt;br /&gt;
 print &amp;quot;Runde Nr., Ges.Zeit, Rundenzeit, mittlere Rundenzeit&amp;quot;&lt;br /&gt;
 start_zeit=clock()&lt;br /&gt;
 runden_start=start_zeit&lt;br /&gt;
  &lt;br /&gt;
 while sensor_2 == 0 :&lt;br /&gt;
   sensor_2=pfio.digital_read(2)&lt;br /&gt;
   v_wechsel=1-v_wechsel&lt;br /&gt;
   pfio.digital_write(2,v_wechsel)&lt;br /&gt;
   sensor_zeit=clock()&lt;br /&gt;
  &lt;br /&gt;
   while zeit_array[index_zaehler]+sensor_zeit &amp;gt; clock() :&lt;br /&gt;
     if runden_start+sensor_aus &amp;lt; clock() :&lt;br /&gt;
 &lt;br /&gt;
       sensor_1=pfio.digital_read(1) &lt;br /&gt;
       if sensor_1 == 0 :&lt;br /&gt;
         rundenzahl=rundenzahl+1&lt;br /&gt;
         runden_start=clock()&lt;br /&gt;
         zeit=runden_start-start_zeit&lt;br /&gt;
         print rundenzahl, zeit, zeit-vorrunde, zeit/rundenzahl&lt;br /&gt;
         vorrunde=zeit&lt;br /&gt;
         sensor_zeit=0&lt;br /&gt;
         index_zaehler=0&lt;br /&gt;
         v_wechsel=0&lt;br /&gt;
  &lt;br /&gt;
   index_zaehler=index_zaehler+1&lt;br /&gt;
   if index_zaehler &amp;gt; array_laenge :&lt;br /&gt;
     sensor_2=1&lt;br /&gt;
     print &amp;quot;array-Ende erreicht!&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Outp 1 &amp;amp; 2 auf 0!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wird das Array-Ende erreicht, wurden entweder zu wenige Einträge vorgesehen oder es befindet sich kein Fahrzeug (mehr) auf der Strecke, das den Sensor und damit des Zurücksetzen des Arrays auslösen konnte.&lt;br /&gt;
&lt;br /&gt;
e. Das Array ist an die jeweilige Strecke anzupassen, wobei der vorderste Eintrag ungenutzt bleibt und dann mit der Dauer für maximale Spannung begonnen wird. Solange man mit Relais arbeitet, sollten die Schaltzeiten nicht zu kurz sein (&amp;gt;0.1 sek), da diese eine gewisse mechanische Trägheit besitzen.&lt;br /&gt;
&lt;br /&gt;
f. Eben diese mechanische Beschaffenheit der Relais (Verschleiß) ist auch ein guter Grund, auf &#039;volle&#039; digitale Signalumwandlung umzustellen.&lt;br /&gt;
&lt;br /&gt;
= Optokoppler als Ersatz für Relais =&lt;br /&gt;
&lt;br /&gt;
Ähnlich wie ein Relais dient ein [[Optokoppler]] dazu, eine Signalübertragung zwischen zwei getrennten Stromkreisen zu ermöglichen. Hier liegt der Einsatz von Optokopplern nahe, da sie schneller schalten und keine beweglichen Teile besitzen. Für unsere Zwecke benötigen wir nun als zusätzliche Elemente: Optokoppler (CNY 17-4), npn-[[Transistor]]en (BC 337-40) zur Signalverstärkung sowie einige Widerstände im Bereich von 2k und 400 Ohm. &lt;br /&gt;
&lt;br /&gt;
== Kaskadierung von Transistoren zur Signalverstärkung ==&lt;br /&gt;
&lt;br /&gt;
a. Entsprechend Schritt 2.4.d. (ein Relais bei 50 Ohm) wird zunächst ein Optokoppler eingesetzt, dessen Signal durch einen Transistor verstärkt wird, um die &#039;Grundspannung&#039; zu schalten (Pin 3 und 6 beim Optokoppler sollten unbeschaltet bleiben, allein der &#039;Lichtstrom&#039; reicht für eine Durchschaltung aus):&lt;br /&gt;
&lt;br /&gt;
[[Bild:PiF_CNY_BC_1.png|500px|Optokoppler mit Transistor]]&lt;br /&gt;
&lt;br /&gt;
b. Da immer mit einer gewissen Toleranz bei allen Komponenten zu rechnen ist, kann es sein, dass u.U. die Widerstände etwas größer oder kleiner gewählt werden müssen. Beim Ausprobieren sollte man hier in 10% Schritten variieren.&lt;br /&gt;
&lt;br /&gt;
c. Bei Austesten mit Emulator oder Script ist auch zu beachten, dass nun &#039;Output Pin 8&#039; genutzt wird, da dieser nicht mit den Relais verschaltet ist.&lt;br /&gt;
&lt;br /&gt;
== Umsetzung von 3 Schaltstufen mit Optokopplern ==&lt;br /&gt;
&lt;br /&gt;
a. Entsprechend dem Vorgehen beim Relais kann nun auch der kleine Widerstand zusätzlich beschaltet werden um seine gesteuerte Überbrückung zu ermöglichen. Da hier eine relativ geringe Spannung aufgeschaltet wird, kann zusätzlich eine Diode eingesetzt werden, die die Schaltstufe &#039;maximale Spannung&#039; anzeigt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:SmPiFu2ou2T.png|500px|Kombination von 2 Optokopplern]]&lt;br /&gt;
&lt;br /&gt;
b. Vor dem Testen ist wieder zu beachten, dass nun zusätzlich &#039;Output Pin 7&#039; genutzt wird (statt Output Pin 2).&lt;br /&gt;
&lt;br /&gt;
c. Eine mögliche Realisierung sieht so aus:...&lt;br /&gt;
&lt;br /&gt;
== Zusätzliche Erhöhung der Schaltstufen bei D/A-Wandlern ==&lt;br /&gt;
&lt;br /&gt;
[[Bild:Sm3ou3t2.png|thumb|right|450px|Erhöhung der Schaltstufen]]a. Zwar benötigen wir in unserem speziellen Beispiel eine &#039;Grundspannung&#039;, die sich dahingehend auswirkt, dass - wie unter 3.1.c. erwähnt - eine Signalkombination nicht ausgewertet wird, aber mit jeder weiteren Schaltstufe würde sich dieses Problem (theoretisch) relativieren, da bei geschickter Auswahl der Widerstände (z.B. im Verhältnis 1 zu 2) jeweils eine Verdoppelung der Kombinationsmöglichkeiten erreichbar ist.&lt;br /&gt;
&lt;br /&gt;
b. Wird hier der 50 Ohm Widerstand asymmetrisch geteilt (z.B. 15 + 35 Ohm, s.a. [[Spannungsteiler]]) um dort ein weiteres Signal umsetzen zu können, ergeben sich direkt folgende 5 Schaltstufen (aus, 50, 35, 15 und 0 Ohm) u.s.w.&lt;br /&gt;
&lt;br /&gt;
c. Zur Ansteuerung dieser Schaltstufen ist das Script so zu ändern, dass nun zwischen mehr als 2 Stufen gewechselt werden kann und im Array entsprechende Zusatzdaten vorgegeben und ausgelesen werden. Mehr als diese Stufen sind im konkreten Fall aber nicht sinnvoll, da die entstehende Verlustleistung in der Schaltung die maximal verfügbare Leistung reduziert.&lt;br /&gt;
&lt;br /&gt;
= Weiterführende Ideen =&lt;br /&gt;
&lt;br /&gt;
== Hardwareseitige Ausbauvarianten ==&lt;br /&gt;
&lt;br /&gt;
Dem Ausbau dieses Ansatzes sind kaum Grenzen gesetzt:&lt;br /&gt;
&lt;br /&gt;
- beispielhafte Umsetzung einer differenzierten Abstufung mittels mittels einer logarithmischen Einteilung oder eines möglichst oft durch 2 teilbaren Anfangswertes und der Teiler (640 Ohm, 320, 160...);&lt;br /&gt;
&lt;br /&gt;
- Nachbau des Projekts mit einem Microcontroller (ggf. mit LCD-Anzeige);&lt;br /&gt;
&lt;br /&gt;
- Umbau der Steuerung mit dem Ziel, sie direkt an die GPIO-Pins des RPi anzuschließen;&lt;br /&gt;
&lt;br /&gt;
- Ergänzung um eine Sensorik, die in diesem Beispiel eine Rückmeldung liefert, ob ein Verbraucher aktiv ist oder nicht (Fahrzeug noch auf der Strecke?);&lt;br /&gt;
&lt;br /&gt;
- Einsatz anderer Sensortechniken und/oder mehrerer Sensoren zur Optimierung der Schnelligkeit oder parallelen Steuerung eines 2. Fahrzeuges;&lt;br /&gt;
&lt;br /&gt;
== Softwareseitige Ausbauvarianten ==&lt;br /&gt;
&lt;br /&gt;
- Optimierung des Scripts, indem die Sensor-Abfrage über einen &#039;Listener&#039; umgesetzt wird;&lt;br /&gt;
&lt;br /&gt;
- Erweiterung des Scripts um eine GUI mit Hilfe der python-lib Tkinter, um einen Nutzerzugriff auf das Steuerarray und/oder eine &#039;Verwaltung&#039; mehrerer Fahrzeuge;&lt;br /&gt;
&lt;br /&gt;
- Einbindung eines Web-Interface um eine &#039;Fernsteuerung&#039; zu ermöglichen...&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [http://hackaday.com/2013/01/23/replacement-controllers-for-slot-car-racing/ ähnliches Projekt bei &#039;hackaday&#039;] &lt;br /&gt;
* [https://docs.google.com/folder/d/0B-UAZ9CyJCLGQjJ3RDlqa2pqaDg/edit?pli=1&amp;amp;docId=0B-UAZ9CyJCLGNmpMeVpyYlZJUWc Relaisschaltung mit pädagogischer Erweiterung d. Universität Manchester]&lt;br /&gt;
* [http://elinux.org/RPi_Projects/PiFace_controlling_a_slot-car parallele englischsp. Dokumentation dieses Projekts mit anderem Schwerpunkt] &lt;br /&gt;
* [http://elinux.org/RPi_Projects englischsp. Projektliste zum RPi]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Raspberry Pi]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Mknot9</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=RPi_als_D/A-Wandler&amp;diff=74095</id>
		<title>RPi als D/A-Wandler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=RPi_als_D/A-Wandler&amp;diff=74095"/>
		<updated>2013-03-07T18:07:22Z</updated>

		<summary type="html">&lt;p&gt;Mknot9: /* Kaskadierung von Transistoren zur Signalverstärkung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von mknot9&#039;&#039; (in Arbeit)&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
Oft wird ein Computer &#039;nur&#039; genutzt um darauf Software ablaufen zu lassen. Dessen Möglichkeit zur Steuerung von elektrischen und mechanischen Geräten wird dabei leicht übersehen.&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel richtet sich daher an Einsteiger, die mit dem [[Raspberry Pi]] (&#039;RPi&#039;) Grundlagen der Computersteuerung von Relais und Spannungsteilern nachvollziehen möchten. Es wird schrittweise dargestellt, wie mittels eines D/A-Wandlers (Digital/Analog-Wandler = Umwandlung von digitalen 1/0 Signale) die Steuerung einer stufenweise veränderbaren Ausgangsspannung nachgebaut werden kann.&lt;br /&gt;
&lt;br /&gt;
= Verwendete Hardware =&lt;br /&gt;
&lt;br /&gt;
== RPi in Kombination mit der &#039;PiFace&#039;-Karte als Bastelplattform ==&lt;br /&gt;
&lt;br /&gt;
Dank der einfachen Bauweise bietet sich der RPi mit seinen frei zugänglichen GPIO-Pins als ideale Bastelplattform an. Trotzdem kann es beim Experimentieren mit Schaltungen öfters zu kleinen Fehlern kommen, die schlimmstenfalls die empfindliche Elektronik des RPi dauerhaft beschädigen können.&lt;br /&gt;
&lt;br /&gt;
Daher wird bei diesem Projekt zusätzlich mit der &#039;PiFace[http://elinux.org/RPi_Expansion_Boards#Piface]&#039;-Karte gearbeitet, die man auf die GPIO-Pins stecken kann. Diese Erweiterungskarte verschaltet die GPIO-Pins auf je 8 digitale Ein- und Ausgänge, sowie 2 Relais, die eine galvanische Trennung von Stromkreisen ermöglichen. Damit besteht auch für Einsteiger ein gewisser Schutz für die Steuerelektronik des RPi.&lt;br /&gt;
&lt;br /&gt;
Auch im weiteren Verlauf dieser Einführung soll noch auf eine Trennung der Stromkreise Wert gelegt werden, so dass für erste digitale Schaltexperimente ein Optokoppler genutzt wird. Die spätere Nutzung der &#039;Input Pins&#039; des PiFace um eine Steuerung der D/A-Wandlung durch bestimmte Ereignisse zu ermöglichen, erfolgt ebenfalls passiv.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Auch wenn mit vermeindlich &#039;sicheren&#039; Transformatoren gebastelt wird, muss stets bedacht werden, dass diese an einem 230V-Stromnetz betrieben werden und man eher einmal mehr als weniger prüfen sollte, ob man durch eventuelle Fehler mit lebensgefährlicher Spannung in Berührung kommt!&lt;br /&gt;
&lt;br /&gt;
== Auswahl eines Beispielprojektes ==&lt;br /&gt;
&lt;br /&gt;
Günstige Möglichkeiten ein Gerät zu finden, das mit analogen Spannungen arbeitet, bieten sich u.a. im Spielzeugbereich. Im Grunde eignet sich alles, was mit Batterien oder mit Gleichspannungen unter 24 V betrieben wird.&lt;br /&gt;
&lt;br /&gt;
Da jedoch ein Ziel das Steuern von analogen Spannungen ist, bietet sich insbesondere alles an, bei dem [[Potentiometer]] eingesetzt werden. Einen dieser &#039;Handregler&#039; sollte man übrig haben, da er von seinem Anschlusskabel abgetrennt werden muss, um den oft proprietären Steckanschluss nutzen zu können. In diesem Sinne wird hier eine handelsübliche Spielzeug-Autorennbahn mit Potentiometer-Handreglern genutzt.&lt;br /&gt;
&lt;br /&gt;
== Sonstige Bauteile ==&lt;br /&gt;
&lt;br /&gt;
Für die ersten Grundlagen (s. Teile 2 &amp;amp; 3) genügen bereits rund 2 m isolierter Draht, der nicht aus verdrillten feinen Adern (Litze) bestehen sollte, 50 cm nicht-isolierter Draht, einige niederohmige Widerstände (z.B. je 2 mal 100 Ohm, 80, 60, sowie 20) und ein &#039;Experimentierbrett&#039; (engl. [[Breadboard]]).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Grundlagen und Vorbereitung des Projekts =&lt;br /&gt;
&lt;br /&gt;
== Umwandlung von 1/0 zu Ein/Aus mit einem Relais ==&lt;br /&gt;
&lt;br /&gt;
Vom Prinzip her ist jede Umwandlung eines digitalen 0 oder 1 Signals (das über eine bestimmte Spannungsdifferenz festgelegt ist) in eine (nutzbare) Spannung bereits eine D/A-Wandlung. Dies wird schlicht so realisiert, dass mit einer Eingabe am RPi die Nutzspannung des &#039;Verbrauchers&#039; zunächst einfach an- und ausgeschaltet wird.&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung der zu steuernden Hardware ==&lt;br /&gt;
&lt;br /&gt;
a. Um Fehlerquellen auszuschliessen sollte zunächst (und ggf. auch später!) kurz getestet werden, ob der vorhandene Regler wie erwartet funktioniert.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pif_Con9.jpg|thumb|right|400px|Fixierung der Reglerkabel]]&lt;br /&gt;
b. Nach dem Trennen des Reglers von der Einspeisung (und ggf. Ziehen des Netzsteckers) muss das Regler-Kabel abgeschnitten werden (eher nahe beim Regler, da das Kabel bald bis zum Breadboard reichen soll). Die neuen Enden des Einspeiseteils werden abisoliert und auf dem Breadboard diagonal zueinander mit einigen Spalten Abstand fixiert. Auch können bereits die Drähte, die später zum RPi führen, jeweils in den passenden kontaktführenden Spalten eingesteckt werden, z. B. wie rechts zu sehen (die nicht beschrifteten Drähte können vorerst ignoriert werden):&lt;br /&gt;
&lt;br /&gt;
c. Nun bietet sich eine gute Gelegenheit die maximale Spannung am Nutzgerät zu messen. Man verbindet das Regler-Kabel (nun ohne Regler) wieder mit der Einspeisung und die offenen Enden der Drähte mit dem Messgerät, bei dem zunächst ein Messbereich von ca. 10-50 Volt gewählt werden sollte. Dies sollte dann z.B. 14,8 V anzeigen. Natürlich können auch die beiden offenen Enden einen kleinen Moment kurz geschlossen werden, man sollte aber bedenken, dass das zu regelnde Nutzgerät dann die maximal vorgesehene Spannung erhält (hier: maximales Tempo).&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung des RPi ==&lt;br /&gt;
&lt;br /&gt;
Es wird davon ausgegangen, dass entsprechend des zugehörigen &#039;manual&#039; das PiFace bereits auf den RPi gesteckt ist, die nötigen python-Bilbliotheken installiert sind und man sich im Terminal-Arbeitsverzeichnis &#039;pi&#039; befindet.&lt;br /&gt;
&lt;br /&gt;
a. Zunächst wird der PiFace-Emulator (im Terminal direkt aus dem Arbeitsverzeichnis) gestartet: &amp;lt;tt&amp;gt;piface/scripts/piface-emulator&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b. Wenn alles richtig installiert wurde, erscheint ein Fenster (unten links), bei dem die vorerst wichtigen blauen Signale am rechten Rand wie folgt angezeigt werden sollten: &lt;br /&gt;
 &lt;br /&gt;
[[Datei:RPi_PiF_em-scs.jpg|400px|Piface-Emulator im default-Zustand]] [[Datei:RPi_PiF_em_scs1.jpg|400px|Piface-Relais 1 auf &#039;1&#039; geschaltet]]&lt;br /&gt;
&lt;br /&gt;
c. Das rechte Fenster ergibt sich, wenn man nun im Fenster auf &amp;quot;Override Enable&amp;quot; und dann &amp;quot;Output Pin 1&amp;quot; klickt. Es müsste ein &amp;quot;Klack&amp;quot; vom Relais 1 zu hören sein sowie der Schaltzustand des unteren Relais 1 (das an den Output Pin 1 gekoppelt ist) auf die Verbindung der beiden unteren Anschlüsse wechseln. Zugleich wird das erste LED-Icon beim Output Pin 1 rot sowie das zugehörige LED-Icon blau.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pif_rel2.png|thumb|right|250px|Schema der Piface-Relais]]&lt;br /&gt;
d. Rechts ist der Schaltzustand der Relais, die zu Beginn genutzt werden, im Grundzustand dargestellt (jeweils der mittlere und obere Kontakt sind kurzgeschlossen, der jeweils untere Kontakt ist frei):&lt;br /&gt;
&lt;br /&gt;
e. Ein weiterer Klick auf &amp;quot;Output Pin 1&amp;quot; versetzt das Relais in den Ausgangszustand, der vor dem nächsten Schritt wieder eingestellt werden sollte.&lt;br /&gt;
&lt;br /&gt;
f. Das Relais läßt sich auch mittel eines Python-Scripts vom RPi aus ansteuern. Dazu wird folgende Textdatei &amp;quot;wandler.py&amp;quot; im Arbeitsverzeichnis abgespeichert und mit dem Befehl &amp;quot;&amp;lt;tt&amp;gt;python wandler.py&amp;lt;/tt&amp;gt;&amp;quot; gestartet:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler.py&lt;br /&gt;
&lt;br /&gt;
 from time import sleep&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
&lt;br /&gt;
 pfio.init()&lt;br /&gt;
&lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
 print &amp;quot;Strom an&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 sleep(2)&lt;br /&gt;
&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Strom aus&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Nach dem Absetzen des Befehls wechselt nun das blaue Signal an Relais 1 für 2 Sekunden und das Relais klackt entsprechend.&lt;br /&gt;
&lt;br /&gt;
== Einsatz eines Relais&#039; zur Umsetzung von Spannungsänderungen ==&lt;br /&gt;
&lt;br /&gt;
a. Ist das Relais wieder im Ausgangszustand, befestigt man nun einen der vom Breadboard führenden Drähte am unteren und einen am mittleren Relaiseingang (im Moment ist die Polarität noch egal). Zunächst sollte nichts passieren (das Relais hält diesen ja Stromkreis noch offen).&lt;br /&gt;
&lt;br /&gt;
b. Startet man aber das Script wieder (&amp;lt;tt&amp;gt;python wandler.py&amp;lt;/tt&amp;gt;) oder klickt auf &#039;Output Pin 1&#039; wird der Nutzstromkreis geschlossen. Nochmals aufgepasst: unser Nutzer erhält wieder die maximal vorgesehene Spannung - also besser vorher im Script &amp;quot;&amp;lt;tt&amp;gt;sleep(0.3)&amp;lt;/tt&amp;gt;&amp;quot; setzen und speichern.&lt;br /&gt;
&lt;br /&gt;
c. Im Prinzip ist damit die programmgesteuerte Umsetzung eines 0/1 Signals in z.B. eine 0V/15V Spannung erreicht.&lt;br /&gt;
&lt;br /&gt;
d. Da wir bald verschiedene Steuerspannungen schalten wollen, geht es jetzt darum herauszufinden, bei welcher Spannung unser Nutzgerät gerade noch bewegt wird. Dies probiert man aus - mit dem kleinsten Widerstand beginnend: indem einer der Drähte in eine freie Breadboardspalte gesteckt wird und aus dieser Spalte der Widerstand zu dem &#039;alten&#039; Steckplatz des Drahtes geführt wird. Nun startet man jeweils das Script bis der Widerstand so hoch ist, dass die Anlaufspannung beim Nutzgerätes gut ausreicht, eine Reaktion des Nutzgerät (Fahrzeug bewegt sich) zu bewirken (z.B. bei 50 Ohm beträgt der Strom ca. 130 mA während ohne 190 mA fliessen).&lt;br /&gt;
&lt;br /&gt;
= Ansteuerung von 3 Schaltstufen =&lt;br /&gt;
&lt;br /&gt;
== Kombination von 2 Relais ==&lt;br /&gt;
&lt;br /&gt;
[[Bild:ZrelMww2.png|thumb|right|250px|Beschaltung der Relais]] a. Die einfachste Stufe der weiteren Verschaltung erreicht man, indem der Widerstand mit einem 2. Relais überbrückt wird. Relais 1 kann dann als &#039;Hauptschalter&#039;, Relais 2 als Spannungsumschalter genutzt werden:&lt;br /&gt;
&lt;br /&gt;
b. Diese Beschaltung kann sogleich mit dem PiFace-Emulator ausprobiert werden. Damit können wir bereits 3 Schaltstufen steuern: keine, verminderte und volle Spannung.&lt;br /&gt;
&lt;br /&gt;
c. Theoretisch liesse sich auch noch eine 4. Spannungsstufe erzeugen, da mit 2 &#039;Bits&#039; (Ein/Aus bei 2 Relais) bereits 4 verschiedene Signale darstellbar sind. Beim jetzigen Aufbau werden aber lediglich die (pin1,pin2)-Signale (0,0), (1,0) und (1,1) &#039;genutzt&#039;, da Relais 1 als Hauptschalter vorgesehen ist und die Kombination (0,1) so nicht ausgewertet wird.&lt;br /&gt;
&lt;br /&gt;
== Programmgesteuerte Schaltung von 2 Relais ==&lt;br /&gt;
&lt;br /&gt;
a. Mit einem veränderten python-Script &amp;quot;wandler2.py&amp;quot; ist auch die programmgesteuerte Schaltung möglich. Dabei werden zusätzlich die Tasten 1 und 2 des PiFace genutzt, um nach dem Start des Scripts (&amp;lt;tt&amp;gt;python wandler2.py&amp;lt;/tt&amp;gt;) den Hauptschalter (Relais 1) zu steuern:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler2.py&lt;br /&gt;
 &lt;br /&gt;
 from time import sleep&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
 pfio.init()&lt;br /&gt;
 &lt;br /&gt;
 taste_1=0&lt;br /&gt;
 taste_2=0&lt;br /&gt;
 intervall_a=0.1&lt;br /&gt;
 intervall_b=0.5&lt;br /&gt;
 # Die Intervalle bestimmen die Schaltzeit für volle/verminderte Spannung&lt;br /&gt;
 &lt;br /&gt;
 print &amp;quot;Zum Start Taste 1 drücken, zum Stoppen Taste 2&amp;quot;&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 while taste_1 == 0:&lt;br /&gt;
   sleep(intervall_a)&lt;br /&gt;
   taste_1=pfio.digital_read(1)&lt;br /&gt;
&lt;br /&gt;
 # Der o.g. &#039;sleep&#039;-Befehl bestimmt die Abfragepausen für Taste 1&lt;br /&gt;
 &lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
 print &amp;quot;Strom an!&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 while taste_2 == 0:&lt;br /&gt;
   pfio.digital_write(2,1)&lt;br /&gt;
   sleep(intervall_a)&lt;br /&gt;
   pfio.digital_write(2,0)&lt;br /&gt;
   sleep(intervall_b)&lt;br /&gt;
   taste_2=pfio.digital_read(2)&lt;br /&gt;
 &lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Strom aus!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
b. Falls beim Ausprobieren von Script-Änderungen mal was schief geht, kann das Script stets auch mit der Tastenkombination (CNTRL-C) gestoppt werden. U.U. muss dann noch zusätzlich Relais 1 und/oder 2 via Emulator zurückgesetzt werden.&lt;br /&gt;
&lt;br /&gt;
c. Beim Verändern des Scripts fällt bald auf, dass die bisherige Programmsteuerung keine direkte Möglichkeit vorsieht, auf Ereignisse zu reagieren. Immerhin wird ein mechanisches Gerät gesteuert, bei dem mit Ausfällen, Fertigungstoleranzen, Umwelteinflüssen etc. zu rechnen ist (im Script wird dies bislang &#039;nur&#039; durch die Abbruchbedingung &#039;Taste 2&#039; berücksichtigt).&lt;br /&gt;
&lt;br /&gt;
== Einfache Sensor-Signale als steuernde Elemente eines Programms ==&lt;br /&gt;
&lt;br /&gt;
a. Eine wichtige Anwendung von D/A-Steuerungen ist die mögliche Reaktion dieser Steuerung auf &#039;äußere&#039; Ereignisse, die z.B. mit Hilfe von Sensoren leistbar ist.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Einf_Sens.jpg|thumb|right|250px|einfacher Sensor]]b. Für unsere Zwecke genügt zunächst ein sehr einfacher Sensor, der ein 0- oder 1-Signal liefert und idealerweise direkt am &#039;Input Pin 1&#039; des PiFace angeschlossen werden kann. So liegt beim Input Pin 1 das Signal &#039;1&#039; an, wenn eine Verbindung zu &#039;Input GND&#039; besteht.&lt;br /&gt;
Z.B. können 2 unisolierte Drähte so plaziert werden, dass ein vorbeifahrendes Fahrzeug einen von ihnen genügend bewegt um den Kontakt kurze Zeit zu öffnen. Genau dann liefert dieser &#039;Sensor&#039; das Signal &#039;0&#039;. Eine - die Schwerkraft nutzende - mögliche Bauform ist rechts abgebildet ;-)&lt;br /&gt;
&lt;br /&gt;
c. Natürlich werden zusätzlich 2 isolierte Drähte benötigt, um jeden der beiden offenen Drähte geschützt mit Input Pin 1 und Input GND zu verbinden.&lt;br /&gt;
&lt;br /&gt;
d. Bei jeder Durchfahrt liefert der Sensor nun ein &#039;0&#039;-Signal, was im Script sowohl für eine Zeitmessung als auch für ein &#039;Schaltintervall-Array&#039; genutzt werden kann. Dort können abwechselnd für beide Spannungen Zeiten (die in etwa zum jeweiligen Streckenabschnitt passen) &#039;programmiert&#039; werden. Statt Taste 1 wird nun der Sensor ausgewertet (wobei Taste 1 als Sensor-Ersatz insoweit genutzt werden kann, dass sie gedrückt bleiben bzw. kurz losgelassen werden muss). Zur genaueren Zeitmessung wird noch das modul &#039;clock&#039; benötigt. &amp;quot;&amp;lt;tt&amp;gt;wandler3.py&amp;lt;/tt&amp;gt;&amp;quot; könnte also so aussehen:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler3.py&lt;br /&gt;
 &lt;br /&gt;
 from time import clock&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
 sensor_1=1&lt;br /&gt;
 sensor_2=0&lt;br /&gt;
 rundenzahl=0&lt;br /&gt;
 v_wechsel=0&lt;br /&gt;
 vorrunde=0&lt;br /&gt;
 index_zaehler=1&lt;br /&gt;
 &lt;br /&gt;
 zeit_array=[0,0.2,0.4,0.2,0.4,0.2,0.4,0.2,5,0.2,6]&lt;br /&gt;
 # dieses array enthält die sek. bis zum Spannungswechsel&lt;br /&gt;
&lt;br /&gt;
 array_laenge=9&lt;br /&gt;
 # legt fest, wie viel Werte des arrays genutzt werden sollen&lt;br /&gt;
 &lt;br /&gt;
 sensor_aus=1.3&lt;br /&gt;
 # bis der Sensor sicher in die Ruhestellung kippt, wird er nicht ausgelesen&lt;br /&gt;
  &lt;br /&gt;
 pfio.init()&lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
&lt;br /&gt;
 # das Fahrzeug wird langsam zum Start (=Sensor) bewegt&lt;br /&gt;
 while sensor_1 == 1 :&lt;br /&gt;
   sensor_1=pfio.digital_read(1)&lt;br /&gt;
  &lt;br /&gt;
 print &amp;quot;fliegender Start... zum Beenden Taste 2 drücken&amp;quot;&lt;br /&gt;
 print &amp;quot;Runde Nr., Ges.Zeit, Rundenzeit, mittlere Rundenzeit&amp;quot;&lt;br /&gt;
 start_zeit=clock()&lt;br /&gt;
 runden_start=start_zeit&lt;br /&gt;
  &lt;br /&gt;
 while sensor_2 == 0 :&lt;br /&gt;
   sensor_2=pfio.digital_read(2)&lt;br /&gt;
   v_wechsel=1-v_wechsel&lt;br /&gt;
   pfio.digital_write(2,v_wechsel)&lt;br /&gt;
   sensor_zeit=clock()&lt;br /&gt;
  &lt;br /&gt;
   while zeit_array[index_zaehler]+sensor_zeit &amp;gt; clock() :&lt;br /&gt;
     if runden_start+sensor_aus &amp;lt; clock() :&lt;br /&gt;
 &lt;br /&gt;
       sensor_1=pfio.digital_read(1) &lt;br /&gt;
       if sensor_1 == 0 :&lt;br /&gt;
         rundenzahl=rundenzahl+1&lt;br /&gt;
         runden_start=clock()&lt;br /&gt;
         zeit=runden_start-start_zeit&lt;br /&gt;
         print rundenzahl, zeit, zeit-vorrunde, zeit/rundenzahl&lt;br /&gt;
         vorrunde=zeit&lt;br /&gt;
         sensor_zeit=0&lt;br /&gt;
         index_zaehler=0&lt;br /&gt;
         v_wechsel=0&lt;br /&gt;
  &lt;br /&gt;
   index_zaehler=index_zaehler+1&lt;br /&gt;
   if index_zaehler &amp;gt; array_laenge :&lt;br /&gt;
     sensor_2=1&lt;br /&gt;
     print &amp;quot;array-Ende erreicht!&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Outp 1 &amp;amp; 2 auf 0!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wird das Array-Ende erreicht, wurden entweder zu wenige Einträge vorgesehen oder es befindet sich kein Fahrzeug (mehr) auf der Strecke, das den Sensor und damit des Zurücksetzen des Arrays auslösen konnte.&lt;br /&gt;
&lt;br /&gt;
e. Das Array ist an die jeweilige Strecke anzupassen, wobei der vorderste Eintrag ungenutzt bleibt und dann mit der Dauer für maximale Spannung begonnen wird. Solange man mit Relais arbeitet, sollten die Schaltzeiten nicht zu kurz sein (&amp;gt;0.1 sek), da diese eine gewisse mechanische Trägheit besitzen.&lt;br /&gt;
&lt;br /&gt;
f. Eben diese mechanische Beschaffenheit der Relais (Verschleiß) ist auch ein guter Grund, auf &#039;volle&#039; digitale Signalumwandlung umzustellen.&lt;br /&gt;
&lt;br /&gt;
= Optokoppler als Ersatz für Relais =&lt;br /&gt;
&lt;br /&gt;
Ähnlich wie ein Relais dient ein [[Optokoppler]] dazu, eine Signalübertragung zwischen zwei getrennten Stromkreisen zu ermöglichen. Hier liegt der Einsatz von Optokopplern nahe, da sie schneller schalten und keine beweglichen Teile besitzen. Für unsere Zwecke benötigen wir nun als zusätzliche Elemente: Optokoppler (CNY 17-4), npn-[[Transistor]]en (BC 337-40) zur Signalverstärkung sowie einige Widerstände im Bereich von 2k und 400 Ohm. &lt;br /&gt;
&lt;br /&gt;
== Kaskadierung von Transistoren zur Signalverstärkung ==&lt;br /&gt;
&lt;br /&gt;
a. Entsprechend Schritt 2.4.d. (ein Relais bei 50 Ohm) wird zunächst ein Optokoppler eingesetzt, dessen Signal durch einen Transistor verstärkt wird, um die &#039;Grundspannung&#039; zu schalten (Pin 3 und 6 beim Optokoppler sollten unbeschaltet bleiben, allein der &#039;Lichtstrom&#039; reicht für eine Durchschaltung aus):&lt;br /&gt;
&lt;br /&gt;
[[Bild:PiF_CNY_BC_1.png|500px|Optokoppler mit Transistor]]&lt;br /&gt;
&lt;br /&gt;
b. Da immer mit einer gewissen Toleranz bei allen Komponenten zu rechnen ist, kann es sein, dass u.U. die Widerstände etwas größer oder kleiner gewählt werden müssen. Beim Ausprobieren sollte man hier in 10% Schritten variieren.&lt;br /&gt;
&lt;br /&gt;
c. Bei Austesten mit Emulator oder Script ist auch zu beachten, dass nun &#039;Output Pin 8&#039; genutzt wird, da dieser nicht mit den Relais verschaltet ist.&lt;br /&gt;
&lt;br /&gt;
== Umsetzung von 3 Schaltstufen mit Optokopplern ==&lt;br /&gt;
&lt;br /&gt;
a. Entsprechend dem Vorgehen beim Relais kann nun auch der kleine Widerstand zusätzlich beschaltet werden um seine gesteuerte Überbrückung zu ermöglichen. Da hier eine relativ geringe Spannung aufgeschaltet wird, kann zusätzlich eine Diode eingesetzt werden, die die Schaltstufe &#039;maximale Spannung&#039; anzeigt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:SmPiFu2ou2T.png|thumb|left|450px|Kombination von 2 Optokopplern]]&lt;br /&gt;
&lt;br /&gt;
b. Vor dem Testen ist wieder zu beachten, dass nun zusätzlich &#039;Output Pin 7&#039; genutzt wird (statt Output Pin 2).&lt;br /&gt;
&lt;br /&gt;
c. Eine mögliche Realisierung sieht so aus:...&lt;br /&gt;
&lt;br /&gt;
== Zusätzliche Erhöhung der Schaltstufen bei D/A-Wandlern ==&lt;br /&gt;
&lt;br /&gt;
[[Bild:Sm3ou3t2.png|thumb|right|450px|Erhöhung der Schaltstufen]]a. Zwar benötigen wir in unserem speziellen Beispiel eine &#039;Grundspannung&#039;, die sich dahingehend auswirkt, dass - wie unter 3.1.c. erwähnt - eine Signalkombination nicht ausgewertet wird, aber mit jeder weiteren Schaltstufe würde sich dieses Problem (theoretisch) relativieren, da bei geschickter Auswahl der Widerstände (z.B. im Verhältnis 1 zu 2) jeweils eine Verdoppelung der Kombinationsmöglichkeiten erreichbar ist.&lt;br /&gt;
&lt;br /&gt;
b. Wird hier der 50 Ohm Widerstand asymmetrisch geteilt (z.B. 15 + 35 Ohm, s.a. [[Spannungsteiler]]) um dort ein weiteres Signal umsetzen zu können, ergeben sich direkt folgende 5 Schaltstufen (aus, 50, 35, 15 und 0 Ohm) u.s.w.&lt;br /&gt;
&lt;br /&gt;
c. Zur Ansteuerung dieser Schaltstufen ist das Script so zu ändern, dass nun zwischen mehr als 2 Stufen gewechselt werden kann und im Array entsprechende Zusatzdaten vorgegeben und ausgelesen werden. Mehr als diese Stufen sind im konkreten Fall aber nicht sinnvoll, da die entstehende Verlustleistung in der Schaltung die maximal verfügbare Leistung reduziert.&lt;br /&gt;
&lt;br /&gt;
= Weiterführende Ideen =&lt;br /&gt;
&lt;br /&gt;
== Hardwareseitige Ausbauvarianten ==&lt;br /&gt;
&lt;br /&gt;
Dem Ausbau dieses Ansatzes sind kaum Grenzen gesetzt:&lt;br /&gt;
&lt;br /&gt;
- beispielhafte Umsetzung einer differenzierten Abstufung mittels mittels einer logarithmischen Einteilung oder eines möglichst oft durch 2 teilbaren Anfangswertes und der Teiler (640 Ohm, 320, 160...);&lt;br /&gt;
&lt;br /&gt;
- Nachbau des Projekts mit einem Microcontroller (ggf. mit LCD-Anzeige);&lt;br /&gt;
&lt;br /&gt;
- Umbau der Steuerung mit dem Ziel, sie direkt an die GPIO-Pins des RPi anzuschließen;&lt;br /&gt;
&lt;br /&gt;
- Ergänzung um eine Sensorik, die in diesem Beispiel eine Rückmeldung liefert, ob ein Verbraucher aktiv ist oder nicht (Fahrzeug noch auf der Strecke?);&lt;br /&gt;
&lt;br /&gt;
- Einsatz anderer Sensortechniken und/oder mehrerer Sensoren zur Optimierung der Schnelligkeit oder parallelen Steuerung eines 2. Fahrzeuges;&lt;br /&gt;
&lt;br /&gt;
== Softwareseitige Ausbauvarianten ==&lt;br /&gt;
&lt;br /&gt;
- Optimierung des Scripts, indem die Sensor-Abfrage über einen &#039;Listener&#039; umgesetzt wird;&lt;br /&gt;
&lt;br /&gt;
- Erweiterung des Scripts um eine GUI mit Hilfe der python-lib Tkinter, um einen Nutzerzugriff auf das Steuerarray und/oder eine &#039;Verwaltung&#039; mehrerer Fahrzeuge;&lt;br /&gt;
&lt;br /&gt;
- Einbindung eines Web-Interface um eine &#039;Fernsteuerung&#039; zu ermöglichen...&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [http://hackaday.com/2013/01/23/replacement-controllers-for-slot-car-racing/ ähnliches Projekt bei &#039;hackaday&#039;] &lt;br /&gt;
* [https://docs.google.com/folder/d/0B-UAZ9CyJCLGQjJ3RDlqa2pqaDg/edit?pli=1&amp;amp;docId=0B-UAZ9CyJCLGNmpMeVpyYlZJUWc Relaisschaltung mit pädagogischer Erweiterung d. Universität Manchester]&lt;br /&gt;
* [http://elinux.org/RPi_Projects/PiFace_controlling_a_slot-car parallele englischsp. Dokumentation dieses Projekts mit anderem Schwerpunkt] &lt;br /&gt;
* [http://elinux.org/RPi_Projects englischsp. Projektliste zum RPi]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Raspberry Pi]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Mknot9</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=RPi_als_D/A-Wandler&amp;diff=74094</id>
		<title>RPi als D/A-Wandler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=RPi_als_D/A-Wandler&amp;diff=74094"/>
		<updated>2013-03-07T18:06:57Z</updated>

		<summary type="html">&lt;p&gt;Mknot9: /* Kaskadierung von Transistoren zur Signalverstärkung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von mknot9&#039;&#039; (in Arbeit)&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
Oft wird ein Computer &#039;nur&#039; genutzt um darauf Software ablaufen zu lassen. Dessen Möglichkeit zur Steuerung von elektrischen und mechanischen Geräten wird dabei leicht übersehen.&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel richtet sich daher an Einsteiger, die mit dem [[Raspberry Pi]] (&#039;RPi&#039;) Grundlagen der Computersteuerung von Relais und Spannungsteilern nachvollziehen möchten. Es wird schrittweise dargestellt, wie mittels eines D/A-Wandlers (Digital/Analog-Wandler = Umwandlung von digitalen 1/0 Signale) die Steuerung einer stufenweise veränderbaren Ausgangsspannung nachgebaut werden kann.&lt;br /&gt;
&lt;br /&gt;
= Verwendete Hardware =&lt;br /&gt;
&lt;br /&gt;
== RPi in Kombination mit der &#039;PiFace&#039;-Karte als Bastelplattform ==&lt;br /&gt;
&lt;br /&gt;
Dank der einfachen Bauweise bietet sich der RPi mit seinen frei zugänglichen GPIO-Pins als ideale Bastelplattform an. Trotzdem kann es beim Experimentieren mit Schaltungen öfters zu kleinen Fehlern kommen, die schlimmstenfalls die empfindliche Elektronik des RPi dauerhaft beschädigen können.&lt;br /&gt;
&lt;br /&gt;
Daher wird bei diesem Projekt zusätzlich mit der &#039;PiFace[http://elinux.org/RPi_Expansion_Boards#Piface]&#039;-Karte gearbeitet, die man auf die GPIO-Pins stecken kann. Diese Erweiterungskarte verschaltet die GPIO-Pins auf je 8 digitale Ein- und Ausgänge, sowie 2 Relais, die eine galvanische Trennung von Stromkreisen ermöglichen. Damit besteht auch für Einsteiger ein gewisser Schutz für die Steuerelektronik des RPi.&lt;br /&gt;
&lt;br /&gt;
Auch im weiteren Verlauf dieser Einführung soll noch auf eine Trennung der Stromkreise Wert gelegt werden, so dass für erste digitale Schaltexperimente ein Optokoppler genutzt wird. Die spätere Nutzung der &#039;Input Pins&#039; des PiFace um eine Steuerung der D/A-Wandlung durch bestimmte Ereignisse zu ermöglichen, erfolgt ebenfalls passiv.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Auch wenn mit vermeindlich &#039;sicheren&#039; Transformatoren gebastelt wird, muss stets bedacht werden, dass diese an einem 230V-Stromnetz betrieben werden und man eher einmal mehr als weniger prüfen sollte, ob man durch eventuelle Fehler mit lebensgefährlicher Spannung in Berührung kommt!&lt;br /&gt;
&lt;br /&gt;
== Auswahl eines Beispielprojektes ==&lt;br /&gt;
&lt;br /&gt;
Günstige Möglichkeiten ein Gerät zu finden, das mit analogen Spannungen arbeitet, bieten sich u.a. im Spielzeugbereich. Im Grunde eignet sich alles, was mit Batterien oder mit Gleichspannungen unter 24 V betrieben wird.&lt;br /&gt;
&lt;br /&gt;
Da jedoch ein Ziel das Steuern von analogen Spannungen ist, bietet sich insbesondere alles an, bei dem [[Potentiometer]] eingesetzt werden. Einen dieser &#039;Handregler&#039; sollte man übrig haben, da er von seinem Anschlusskabel abgetrennt werden muss, um den oft proprietären Steckanschluss nutzen zu können. In diesem Sinne wird hier eine handelsübliche Spielzeug-Autorennbahn mit Potentiometer-Handreglern genutzt.&lt;br /&gt;
&lt;br /&gt;
== Sonstige Bauteile ==&lt;br /&gt;
&lt;br /&gt;
Für die ersten Grundlagen (s. Teile 2 &amp;amp; 3) genügen bereits rund 2 m isolierter Draht, der nicht aus verdrillten feinen Adern (Litze) bestehen sollte, 50 cm nicht-isolierter Draht, einige niederohmige Widerstände (z.B. je 2 mal 100 Ohm, 80, 60, sowie 20) und ein &#039;Experimentierbrett&#039; (engl. [[Breadboard]]).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Grundlagen und Vorbereitung des Projekts =&lt;br /&gt;
&lt;br /&gt;
== Umwandlung von 1/0 zu Ein/Aus mit einem Relais ==&lt;br /&gt;
&lt;br /&gt;
Vom Prinzip her ist jede Umwandlung eines digitalen 0 oder 1 Signals (das über eine bestimmte Spannungsdifferenz festgelegt ist) in eine (nutzbare) Spannung bereits eine D/A-Wandlung. Dies wird schlicht so realisiert, dass mit einer Eingabe am RPi die Nutzspannung des &#039;Verbrauchers&#039; zunächst einfach an- und ausgeschaltet wird.&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung der zu steuernden Hardware ==&lt;br /&gt;
&lt;br /&gt;
a. Um Fehlerquellen auszuschliessen sollte zunächst (und ggf. auch später!) kurz getestet werden, ob der vorhandene Regler wie erwartet funktioniert.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pif_Con9.jpg|thumb|right|400px|Fixierung der Reglerkabel]]&lt;br /&gt;
b. Nach dem Trennen des Reglers von der Einspeisung (und ggf. Ziehen des Netzsteckers) muss das Regler-Kabel abgeschnitten werden (eher nahe beim Regler, da das Kabel bald bis zum Breadboard reichen soll). Die neuen Enden des Einspeiseteils werden abisoliert und auf dem Breadboard diagonal zueinander mit einigen Spalten Abstand fixiert. Auch können bereits die Drähte, die später zum RPi führen, jeweils in den passenden kontaktführenden Spalten eingesteckt werden, z. B. wie rechts zu sehen (die nicht beschrifteten Drähte können vorerst ignoriert werden):&lt;br /&gt;
&lt;br /&gt;
c. Nun bietet sich eine gute Gelegenheit die maximale Spannung am Nutzgerät zu messen. Man verbindet das Regler-Kabel (nun ohne Regler) wieder mit der Einspeisung und die offenen Enden der Drähte mit dem Messgerät, bei dem zunächst ein Messbereich von ca. 10-50 Volt gewählt werden sollte. Dies sollte dann z.B. 14,8 V anzeigen. Natürlich können auch die beiden offenen Enden einen kleinen Moment kurz geschlossen werden, man sollte aber bedenken, dass das zu regelnde Nutzgerät dann die maximal vorgesehene Spannung erhält (hier: maximales Tempo).&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung des RPi ==&lt;br /&gt;
&lt;br /&gt;
Es wird davon ausgegangen, dass entsprechend des zugehörigen &#039;manual&#039; das PiFace bereits auf den RPi gesteckt ist, die nötigen python-Bilbliotheken installiert sind und man sich im Terminal-Arbeitsverzeichnis &#039;pi&#039; befindet.&lt;br /&gt;
&lt;br /&gt;
a. Zunächst wird der PiFace-Emulator (im Terminal direkt aus dem Arbeitsverzeichnis) gestartet: &amp;lt;tt&amp;gt;piface/scripts/piface-emulator&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b. Wenn alles richtig installiert wurde, erscheint ein Fenster (unten links), bei dem die vorerst wichtigen blauen Signale am rechten Rand wie folgt angezeigt werden sollten: &lt;br /&gt;
 &lt;br /&gt;
[[Datei:RPi_PiF_em-scs.jpg|400px|Piface-Emulator im default-Zustand]] [[Datei:RPi_PiF_em_scs1.jpg|400px|Piface-Relais 1 auf &#039;1&#039; geschaltet]]&lt;br /&gt;
&lt;br /&gt;
c. Das rechte Fenster ergibt sich, wenn man nun im Fenster auf &amp;quot;Override Enable&amp;quot; und dann &amp;quot;Output Pin 1&amp;quot; klickt. Es müsste ein &amp;quot;Klack&amp;quot; vom Relais 1 zu hören sein sowie der Schaltzustand des unteren Relais 1 (das an den Output Pin 1 gekoppelt ist) auf die Verbindung der beiden unteren Anschlüsse wechseln. Zugleich wird das erste LED-Icon beim Output Pin 1 rot sowie das zugehörige LED-Icon blau.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pif_rel2.png|thumb|right|250px|Schema der Piface-Relais]]&lt;br /&gt;
d. Rechts ist der Schaltzustand der Relais, die zu Beginn genutzt werden, im Grundzustand dargestellt (jeweils der mittlere und obere Kontakt sind kurzgeschlossen, der jeweils untere Kontakt ist frei):&lt;br /&gt;
&lt;br /&gt;
e. Ein weiterer Klick auf &amp;quot;Output Pin 1&amp;quot; versetzt das Relais in den Ausgangszustand, der vor dem nächsten Schritt wieder eingestellt werden sollte.&lt;br /&gt;
&lt;br /&gt;
f. Das Relais läßt sich auch mittel eines Python-Scripts vom RPi aus ansteuern. Dazu wird folgende Textdatei &amp;quot;wandler.py&amp;quot; im Arbeitsverzeichnis abgespeichert und mit dem Befehl &amp;quot;&amp;lt;tt&amp;gt;python wandler.py&amp;lt;/tt&amp;gt;&amp;quot; gestartet:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler.py&lt;br /&gt;
&lt;br /&gt;
 from time import sleep&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
&lt;br /&gt;
 pfio.init()&lt;br /&gt;
&lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
 print &amp;quot;Strom an&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 sleep(2)&lt;br /&gt;
&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Strom aus&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Nach dem Absetzen des Befehls wechselt nun das blaue Signal an Relais 1 für 2 Sekunden und das Relais klackt entsprechend.&lt;br /&gt;
&lt;br /&gt;
== Einsatz eines Relais&#039; zur Umsetzung von Spannungsänderungen ==&lt;br /&gt;
&lt;br /&gt;
a. Ist das Relais wieder im Ausgangszustand, befestigt man nun einen der vom Breadboard führenden Drähte am unteren und einen am mittleren Relaiseingang (im Moment ist die Polarität noch egal). Zunächst sollte nichts passieren (das Relais hält diesen ja Stromkreis noch offen).&lt;br /&gt;
&lt;br /&gt;
b. Startet man aber das Script wieder (&amp;lt;tt&amp;gt;python wandler.py&amp;lt;/tt&amp;gt;) oder klickt auf &#039;Output Pin 1&#039; wird der Nutzstromkreis geschlossen. Nochmals aufgepasst: unser Nutzer erhält wieder die maximal vorgesehene Spannung - also besser vorher im Script &amp;quot;&amp;lt;tt&amp;gt;sleep(0.3)&amp;lt;/tt&amp;gt;&amp;quot; setzen und speichern.&lt;br /&gt;
&lt;br /&gt;
c. Im Prinzip ist damit die programmgesteuerte Umsetzung eines 0/1 Signals in z.B. eine 0V/15V Spannung erreicht.&lt;br /&gt;
&lt;br /&gt;
d. Da wir bald verschiedene Steuerspannungen schalten wollen, geht es jetzt darum herauszufinden, bei welcher Spannung unser Nutzgerät gerade noch bewegt wird. Dies probiert man aus - mit dem kleinsten Widerstand beginnend: indem einer der Drähte in eine freie Breadboardspalte gesteckt wird und aus dieser Spalte der Widerstand zu dem &#039;alten&#039; Steckplatz des Drahtes geführt wird. Nun startet man jeweils das Script bis der Widerstand so hoch ist, dass die Anlaufspannung beim Nutzgerätes gut ausreicht, eine Reaktion des Nutzgerät (Fahrzeug bewegt sich) zu bewirken (z.B. bei 50 Ohm beträgt der Strom ca. 130 mA während ohne 190 mA fliessen).&lt;br /&gt;
&lt;br /&gt;
= Ansteuerung von 3 Schaltstufen =&lt;br /&gt;
&lt;br /&gt;
== Kombination von 2 Relais ==&lt;br /&gt;
&lt;br /&gt;
[[Bild:ZrelMww2.png|thumb|right|250px|Beschaltung der Relais]] a. Die einfachste Stufe der weiteren Verschaltung erreicht man, indem der Widerstand mit einem 2. Relais überbrückt wird. Relais 1 kann dann als &#039;Hauptschalter&#039;, Relais 2 als Spannungsumschalter genutzt werden:&lt;br /&gt;
&lt;br /&gt;
b. Diese Beschaltung kann sogleich mit dem PiFace-Emulator ausprobiert werden. Damit können wir bereits 3 Schaltstufen steuern: keine, verminderte und volle Spannung.&lt;br /&gt;
&lt;br /&gt;
c. Theoretisch liesse sich auch noch eine 4. Spannungsstufe erzeugen, da mit 2 &#039;Bits&#039; (Ein/Aus bei 2 Relais) bereits 4 verschiedene Signale darstellbar sind. Beim jetzigen Aufbau werden aber lediglich die (pin1,pin2)-Signale (0,0), (1,0) und (1,1) &#039;genutzt&#039;, da Relais 1 als Hauptschalter vorgesehen ist und die Kombination (0,1) so nicht ausgewertet wird.&lt;br /&gt;
&lt;br /&gt;
== Programmgesteuerte Schaltung von 2 Relais ==&lt;br /&gt;
&lt;br /&gt;
a. Mit einem veränderten python-Script &amp;quot;wandler2.py&amp;quot; ist auch die programmgesteuerte Schaltung möglich. Dabei werden zusätzlich die Tasten 1 und 2 des PiFace genutzt, um nach dem Start des Scripts (&amp;lt;tt&amp;gt;python wandler2.py&amp;lt;/tt&amp;gt;) den Hauptschalter (Relais 1) zu steuern:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler2.py&lt;br /&gt;
 &lt;br /&gt;
 from time import sleep&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
 pfio.init()&lt;br /&gt;
 &lt;br /&gt;
 taste_1=0&lt;br /&gt;
 taste_2=0&lt;br /&gt;
 intervall_a=0.1&lt;br /&gt;
 intervall_b=0.5&lt;br /&gt;
 # Die Intervalle bestimmen die Schaltzeit für volle/verminderte Spannung&lt;br /&gt;
 &lt;br /&gt;
 print &amp;quot;Zum Start Taste 1 drücken, zum Stoppen Taste 2&amp;quot;&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 while taste_1 == 0:&lt;br /&gt;
   sleep(intervall_a)&lt;br /&gt;
   taste_1=pfio.digital_read(1)&lt;br /&gt;
&lt;br /&gt;
 # Der o.g. &#039;sleep&#039;-Befehl bestimmt die Abfragepausen für Taste 1&lt;br /&gt;
 &lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
 print &amp;quot;Strom an!&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 while taste_2 == 0:&lt;br /&gt;
   pfio.digital_write(2,1)&lt;br /&gt;
   sleep(intervall_a)&lt;br /&gt;
   pfio.digital_write(2,0)&lt;br /&gt;
   sleep(intervall_b)&lt;br /&gt;
   taste_2=pfio.digital_read(2)&lt;br /&gt;
 &lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Strom aus!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
b. Falls beim Ausprobieren von Script-Änderungen mal was schief geht, kann das Script stets auch mit der Tastenkombination (CNTRL-C) gestoppt werden. U.U. muss dann noch zusätzlich Relais 1 und/oder 2 via Emulator zurückgesetzt werden.&lt;br /&gt;
&lt;br /&gt;
c. Beim Verändern des Scripts fällt bald auf, dass die bisherige Programmsteuerung keine direkte Möglichkeit vorsieht, auf Ereignisse zu reagieren. Immerhin wird ein mechanisches Gerät gesteuert, bei dem mit Ausfällen, Fertigungstoleranzen, Umwelteinflüssen etc. zu rechnen ist (im Script wird dies bislang &#039;nur&#039; durch die Abbruchbedingung &#039;Taste 2&#039; berücksichtigt).&lt;br /&gt;
&lt;br /&gt;
== Einfache Sensor-Signale als steuernde Elemente eines Programms ==&lt;br /&gt;
&lt;br /&gt;
a. Eine wichtige Anwendung von D/A-Steuerungen ist die mögliche Reaktion dieser Steuerung auf &#039;äußere&#039; Ereignisse, die z.B. mit Hilfe von Sensoren leistbar ist.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Einf_Sens.jpg|thumb|right|250px|einfacher Sensor]]b. Für unsere Zwecke genügt zunächst ein sehr einfacher Sensor, der ein 0- oder 1-Signal liefert und idealerweise direkt am &#039;Input Pin 1&#039; des PiFace angeschlossen werden kann. So liegt beim Input Pin 1 das Signal &#039;1&#039; an, wenn eine Verbindung zu &#039;Input GND&#039; besteht.&lt;br /&gt;
Z.B. können 2 unisolierte Drähte so plaziert werden, dass ein vorbeifahrendes Fahrzeug einen von ihnen genügend bewegt um den Kontakt kurze Zeit zu öffnen. Genau dann liefert dieser &#039;Sensor&#039; das Signal &#039;0&#039;. Eine - die Schwerkraft nutzende - mögliche Bauform ist rechts abgebildet ;-)&lt;br /&gt;
&lt;br /&gt;
c. Natürlich werden zusätzlich 2 isolierte Drähte benötigt, um jeden der beiden offenen Drähte geschützt mit Input Pin 1 und Input GND zu verbinden.&lt;br /&gt;
&lt;br /&gt;
d. Bei jeder Durchfahrt liefert der Sensor nun ein &#039;0&#039;-Signal, was im Script sowohl für eine Zeitmessung als auch für ein &#039;Schaltintervall-Array&#039; genutzt werden kann. Dort können abwechselnd für beide Spannungen Zeiten (die in etwa zum jeweiligen Streckenabschnitt passen) &#039;programmiert&#039; werden. Statt Taste 1 wird nun der Sensor ausgewertet (wobei Taste 1 als Sensor-Ersatz insoweit genutzt werden kann, dass sie gedrückt bleiben bzw. kurz losgelassen werden muss). Zur genaueren Zeitmessung wird noch das modul &#039;clock&#039; benötigt. &amp;quot;&amp;lt;tt&amp;gt;wandler3.py&amp;lt;/tt&amp;gt;&amp;quot; könnte also so aussehen:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler3.py&lt;br /&gt;
 &lt;br /&gt;
 from time import clock&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
 sensor_1=1&lt;br /&gt;
 sensor_2=0&lt;br /&gt;
 rundenzahl=0&lt;br /&gt;
 v_wechsel=0&lt;br /&gt;
 vorrunde=0&lt;br /&gt;
 index_zaehler=1&lt;br /&gt;
 &lt;br /&gt;
 zeit_array=[0,0.2,0.4,0.2,0.4,0.2,0.4,0.2,5,0.2,6]&lt;br /&gt;
 # dieses array enthält die sek. bis zum Spannungswechsel&lt;br /&gt;
&lt;br /&gt;
 array_laenge=9&lt;br /&gt;
 # legt fest, wie viel Werte des arrays genutzt werden sollen&lt;br /&gt;
 &lt;br /&gt;
 sensor_aus=1.3&lt;br /&gt;
 # bis der Sensor sicher in die Ruhestellung kippt, wird er nicht ausgelesen&lt;br /&gt;
  &lt;br /&gt;
 pfio.init()&lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
&lt;br /&gt;
 # das Fahrzeug wird langsam zum Start (=Sensor) bewegt&lt;br /&gt;
 while sensor_1 == 1 :&lt;br /&gt;
   sensor_1=pfio.digital_read(1)&lt;br /&gt;
  &lt;br /&gt;
 print &amp;quot;fliegender Start... zum Beenden Taste 2 drücken&amp;quot;&lt;br /&gt;
 print &amp;quot;Runde Nr., Ges.Zeit, Rundenzeit, mittlere Rundenzeit&amp;quot;&lt;br /&gt;
 start_zeit=clock()&lt;br /&gt;
 runden_start=start_zeit&lt;br /&gt;
  &lt;br /&gt;
 while sensor_2 == 0 :&lt;br /&gt;
   sensor_2=pfio.digital_read(2)&lt;br /&gt;
   v_wechsel=1-v_wechsel&lt;br /&gt;
   pfio.digital_write(2,v_wechsel)&lt;br /&gt;
   sensor_zeit=clock()&lt;br /&gt;
  &lt;br /&gt;
   while zeit_array[index_zaehler]+sensor_zeit &amp;gt; clock() :&lt;br /&gt;
     if runden_start+sensor_aus &amp;lt; clock() :&lt;br /&gt;
 &lt;br /&gt;
       sensor_1=pfio.digital_read(1) &lt;br /&gt;
       if sensor_1 == 0 :&lt;br /&gt;
         rundenzahl=rundenzahl+1&lt;br /&gt;
         runden_start=clock()&lt;br /&gt;
         zeit=runden_start-start_zeit&lt;br /&gt;
         print rundenzahl, zeit, zeit-vorrunde, zeit/rundenzahl&lt;br /&gt;
         vorrunde=zeit&lt;br /&gt;
         sensor_zeit=0&lt;br /&gt;
         index_zaehler=0&lt;br /&gt;
         v_wechsel=0&lt;br /&gt;
  &lt;br /&gt;
   index_zaehler=index_zaehler+1&lt;br /&gt;
   if index_zaehler &amp;gt; array_laenge :&lt;br /&gt;
     sensor_2=1&lt;br /&gt;
     print &amp;quot;array-Ende erreicht!&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Outp 1 &amp;amp; 2 auf 0!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wird das Array-Ende erreicht, wurden entweder zu wenige Einträge vorgesehen oder es befindet sich kein Fahrzeug (mehr) auf der Strecke, das den Sensor und damit des Zurücksetzen des Arrays auslösen konnte.&lt;br /&gt;
&lt;br /&gt;
e. Das Array ist an die jeweilige Strecke anzupassen, wobei der vorderste Eintrag ungenutzt bleibt und dann mit der Dauer für maximale Spannung begonnen wird. Solange man mit Relais arbeitet, sollten die Schaltzeiten nicht zu kurz sein (&amp;gt;0.1 sek), da diese eine gewisse mechanische Trägheit besitzen.&lt;br /&gt;
&lt;br /&gt;
f. Eben diese mechanische Beschaffenheit der Relais (Verschleiß) ist auch ein guter Grund, auf &#039;volle&#039; digitale Signalumwandlung umzustellen.&lt;br /&gt;
&lt;br /&gt;
= Optokoppler als Ersatz für Relais =&lt;br /&gt;
&lt;br /&gt;
Ähnlich wie ein Relais dient ein [[Optokoppler]] dazu, eine Signalübertragung zwischen zwei getrennten Stromkreisen zu ermöglichen. Hier liegt der Einsatz von Optokopplern nahe, da sie schneller schalten und keine beweglichen Teile besitzen. Für unsere Zwecke benötigen wir nun als zusätzliche Elemente: Optokoppler (CNY 17-4), npn-[[Transistor]]en (BC 337-40) zur Signalverstärkung sowie einige Widerstände im Bereich von 2k und 400 Ohm. &lt;br /&gt;
&lt;br /&gt;
== Kaskadierung von Transistoren zur Signalverstärkung ==&lt;br /&gt;
&lt;br /&gt;
a. Entsprechend Schritt 2.4.d. (ein Relais bei 50 Ohm) wird zunächst ein Optokoppler eingesetzt, dessen Signal durch einen Transistor verstärkt wird, um die &#039;Grundspannung&#039; zu schalten (Pin 3 und 6 beim Optokoppler sollten unbeschaltet bleiben, allein der &#039;Lichtstrom&#039; reicht für eine Durchschaltung aus).&lt;br /&gt;
&lt;br /&gt;
[[Bild:PiF_CNY_BC_1.png|450px|Optokoppler mit Transistor]]&lt;br /&gt;
&lt;br /&gt;
b. Da immer mit einer gewissen Toleranz bei allen Komponenten zu rechnen ist, kann es sein, dass u.U. die Widerstände etwas größer oder kleiner gewählt werden müssen. Beim Ausprobieren sollte man hier in 10% Schritten variieren.&lt;br /&gt;
&lt;br /&gt;
c. Bei Austesten mit Emulator oder Script ist auch zu beachten, dass nun &#039;Output Pin 8&#039; genutzt wird, da dieser nicht mit den Relais verschaltet ist.&lt;br /&gt;
&lt;br /&gt;
== Umsetzung von 3 Schaltstufen mit Optokopplern ==&lt;br /&gt;
&lt;br /&gt;
a. Entsprechend dem Vorgehen beim Relais kann nun auch der kleine Widerstand zusätzlich beschaltet werden um seine gesteuerte Überbrückung zu ermöglichen. Da hier eine relativ geringe Spannung aufgeschaltet wird, kann zusätzlich eine Diode eingesetzt werden, die die Schaltstufe &#039;maximale Spannung&#039; anzeigt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:SmPiFu2ou2T.png|thumb|left|450px|Kombination von 2 Optokopplern]]&lt;br /&gt;
&lt;br /&gt;
b. Vor dem Testen ist wieder zu beachten, dass nun zusätzlich &#039;Output Pin 7&#039; genutzt wird (statt Output Pin 2).&lt;br /&gt;
&lt;br /&gt;
c. Eine mögliche Realisierung sieht so aus:...&lt;br /&gt;
&lt;br /&gt;
== Zusätzliche Erhöhung der Schaltstufen bei D/A-Wandlern ==&lt;br /&gt;
&lt;br /&gt;
[[Bild:Sm3ou3t2.png|thumb|right|450px|Erhöhung der Schaltstufen]]a. Zwar benötigen wir in unserem speziellen Beispiel eine &#039;Grundspannung&#039;, die sich dahingehend auswirkt, dass - wie unter 3.1.c. erwähnt - eine Signalkombination nicht ausgewertet wird, aber mit jeder weiteren Schaltstufe würde sich dieses Problem (theoretisch) relativieren, da bei geschickter Auswahl der Widerstände (z.B. im Verhältnis 1 zu 2) jeweils eine Verdoppelung der Kombinationsmöglichkeiten erreichbar ist.&lt;br /&gt;
&lt;br /&gt;
b. Wird hier der 50 Ohm Widerstand asymmetrisch geteilt (z.B. 15 + 35 Ohm, s.a. [[Spannungsteiler]]) um dort ein weiteres Signal umsetzen zu können, ergeben sich direkt folgende 5 Schaltstufen (aus, 50, 35, 15 und 0 Ohm) u.s.w.&lt;br /&gt;
&lt;br /&gt;
c. Zur Ansteuerung dieser Schaltstufen ist das Script so zu ändern, dass nun zwischen mehr als 2 Stufen gewechselt werden kann und im Array entsprechende Zusatzdaten vorgegeben und ausgelesen werden. Mehr als diese Stufen sind im konkreten Fall aber nicht sinnvoll, da die entstehende Verlustleistung in der Schaltung die maximal verfügbare Leistung reduziert.&lt;br /&gt;
&lt;br /&gt;
= Weiterführende Ideen =&lt;br /&gt;
&lt;br /&gt;
== Hardwareseitige Ausbauvarianten ==&lt;br /&gt;
&lt;br /&gt;
Dem Ausbau dieses Ansatzes sind kaum Grenzen gesetzt:&lt;br /&gt;
&lt;br /&gt;
- beispielhafte Umsetzung einer differenzierten Abstufung mittels mittels einer logarithmischen Einteilung oder eines möglichst oft durch 2 teilbaren Anfangswertes und der Teiler (640 Ohm, 320, 160...);&lt;br /&gt;
&lt;br /&gt;
- Nachbau des Projekts mit einem Microcontroller (ggf. mit LCD-Anzeige);&lt;br /&gt;
&lt;br /&gt;
- Umbau der Steuerung mit dem Ziel, sie direkt an die GPIO-Pins des RPi anzuschließen;&lt;br /&gt;
&lt;br /&gt;
- Ergänzung um eine Sensorik, die in diesem Beispiel eine Rückmeldung liefert, ob ein Verbraucher aktiv ist oder nicht (Fahrzeug noch auf der Strecke?);&lt;br /&gt;
&lt;br /&gt;
- Einsatz anderer Sensortechniken und/oder mehrerer Sensoren zur Optimierung der Schnelligkeit oder parallelen Steuerung eines 2. Fahrzeuges;&lt;br /&gt;
&lt;br /&gt;
== Softwareseitige Ausbauvarianten ==&lt;br /&gt;
&lt;br /&gt;
- Optimierung des Scripts, indem die Sensor-Abfrage über einen &#039;Listener&#039; umgesetzt wird;&lt;br /&gt;
&lt;br /&gt;
- Erweiterung des Scripts um eine GUI mit Hilfe der python-lib Tkinter, um einen Nutzerzugriff auf das Steuerarray und/oder eine &#039;Verwaltung&#039; mehrerer Fahrzeuge;&lt;br /&gt;
&lt;br /&gt;
- Einbindung eines Web-Interface um eine &#039;Fernsteuerung&#039; zu ermöglichen...&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [http://hackaday.com/2013/01/23/replacement-controllers-for-slot-car-racing/ ähnliches Projekt bei &#039;hackaday&#039;] &lt;br /&gt;
* [https://docs.google.com/folder/d/0B-UAZ9CyJCLGQjJ3RDlqa2pqaDg/edit?pli=1&amp;amp;docId=0B-UAZ9CyJCLGNmpMeVpyYlZJUWc Relaisschaltung mit pädagogischer Erweiterung d. Universität Manchester]&lt;br /&gt;
* [http://elinux.org/RPi_Projects/PiFace_controlling_a_slot-car parallele englischsp. Dokumentation dieses Projekts mit anderem Schwerpunkt] &lt;br /&gt;
* [http://elinux.org/RPi_Projects englischsp. Projektliste zum RPi]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Raspberry Pi]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Mknot9</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=RPi_als_D/A-Wandler&amp;diff=74093</id>
		<title>RPi als D/A-Wandler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=RPi_als_D/A-Wandler&amp;diff=74093"/>
		<updated>2013-03-07T18:06:09Z</updated>

		<summary type="html">&lt;p&gt;Mknot9: /* RPi in Kombination mit der &amp;#039;PiFace&amp;#039;-Karte als Bastelplattform */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von mknot9&#039;&#039; (in Arbeit)&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
Oft wird ein Computer &#039;nur&#039; genutzt um darauf Software ablaufen zu lassen. Dessen Möglichkeit zur Steuerung von elektrischen und mechanischen Geräten wird dabei leicht übersehen.&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel richtet sich daher an Einsteiger, die mit dem [[Raspberry Pi]] (&#039;RPi&#039;) Grundlagen der Computersteuerung von Relais und Spannungsteilern nachvollziehen möchten. Es wird schrittweise dargestellt, wie mittels eines D/A-Wandlers (Digital/Analog-Wandler = Umwandlung von digitalen 1/0 Signale) die Steuerung einer stufenweise veränderbaren Ausgangsspannung nachgebaut werden kann.&lt;br /&gt;
&lt;br /&gt;
= Verwendete Hardware =&lt;br /&gt;
&lt;br /&gt;
== RPi in Kombination mit der &#039;PiFace&#039;-Karte als Bastelplattform ==&lt;br /&gt;
&lt;br /&gt;
Dank der einfachen Bauweise bietet sich der RPi mit seinen frei zugänglichen GPIO-Pins als ideale Bastelplattform an. Trotzdem kann es beim Experimentieren mit Schaltungen öfters zu kleinen Fehlern kommen, die schlimmstenfalls die empfindliche Elektronik des RPi dauerhaft beschädigen können.&lt;br /&gt;
&lt;br /&gt;
Daher wird bei diesem Projekt zusätzlich mit der &#039;PiFace[http://elinux.org/RPi_Expansion_Boards#Piface]&#039;-Karte gearbeitet, die man auf die GPIO-Pins stecken kann. Diese Erweiterungskarte verschaltet die GPIO-Pins auf je 8 digitale Ein- und Ausgänge, sowie 2 Relais, die eine galvanische Trennung von Stromkreisen ermöglichen. Damit besteht auch für Einsteiger ein gewisser Schutz für die Steuerelektronik des RPi.&lt;br /&gt;
&lt;br /&gt;
Auch im weiteren Verlauf dieser Einführung soll noch auf eine Trennung der Stromkreise Wert gelegt werden, so dass für erste digitale Schaltexperimente ein Optokoppler genutzt wird. Die spätere Nutzung der &#039;Input Pins&#039; des PiFace um eine Steuerung der D/A-Wandlung durch bestimmte Ereignisse zu ermöglichen, erfolgt ebenfalls passiv.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Auch wenn mit vermeindlich &#039;sicheren&#039; Transformatoren gebastelt wird, muss stets bedacht werden, dass diese an einem 230V-Stromnetz betrieben werden und man eher einmal mehr als weniger prüfen sollte, ob man durch eventuelle Fehler mit lebensgefährlicher Spannung in Berührung kommt!&lt;br /&gt;
&lt;br /&gt;
== Auswahl eines Beispielprojektes ==&lt;br /&gt;
&lt;br /&gt;
Günstige Möglichkeiten ein Gerät zu finden, das mit analogen Spannungen arbeitet, bieten sich u.a. im Spielzeugbereich. Im Grunde eignet sich alles, was mit Batterien oder mit Gleichspannungen unter 24 V betrieben wird.&lt;br /&gt;
&lt;br /&gt;
Da jedoch ein Ziel das Steuern von analogen Spannungen ist, bietet sich insbesondere alles an, bei dem [[Potentiometer]] eingesetzt werden. Einen dieser &#039;Handregler&#039; sollte man übrig haben, da er von seinem Anschlusskabel abgetrennt werden muss, um den oft proprietären Steckanschluss nutzen zu können. In diesem Sinne wird hier eine handelsübliche Spielzeug-Autorennbahn mit Potentiometer-Handreglern genutzt.&lt;br /&gt;
&lt;br /&gt;
== Sonstige Bauteile ==&lt;br /&gt;
&lt;br /&gt;
Für die ersten Grundlagen (s. Teile 2 &amp;amp; 3) genügen bereits rund 2 m isolierter Draht, der nicht aus verdrillten feinen Adern (Litze) bestehen sollte, 50 cm nicht-isolierter Draht, einige niederohmige Widerstände (z.B. je 2 mal 100 Ohm, 80, 60, sowie 20) und ein &#039;Experimentierbrett&#039; (engl. [[Breadboard]]).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Grundlagen und Vorbereitung des Projekts =&lt;br /&gt;
&lt;br /&gt;
== Umwandlung von 1/0 zu Ein/Aus mit einem Relais ==&lt;br /&gt;
&lt;br /&gt;
Vom Prinzip her ist jede Umwandlung eines digitalen 0 oder 1 Signals (das über eine bestimmte Spannungsdifferenz festgelegt ist) in eine (nutzbare) Spannung bereits eine D/A-Wandlung. Dies wird schlicht so realisiert, dass mit einer Eingabe am RPi die Nutzspannung des &#039;Verbrauchers&#039; zunächst einfach an- und ausgeschaltet wird.&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung der zu steuernden Hardware ==&lt;br /&gt;
&lt;br /&gt;
a. Um Fehlerquellen auszuschliessen sollte zunächst (und ggf. auch später!) kurz getestet werden, ob der vorhandene Regler wie erwartet funktioniert.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pif_Con9.jpg|thumb|right|400px|Fixierung der Reglerkabel]]&lt;br /&gt;
b. Nach dem Trennen des Reglers von der Einspeisung (und ggf. Ziehen des Netzsteckers) muss das Regler-Kabel abgeschnitten werden (eher nahe beim Regler, da das Kabel bald bis zum Breadboard reichen soll). Die neuen Enden des Einspeiseteils werden abisoliert und auf dem Breadboard diagonal zueinander mit einigen Spalten Abstand fixiert. Auch können bereits die Drähte, die später zum RPi führen, jeweils in den passenden kontaktführenden Spalten eingesteckt werden, z. B. wie rechts zu sehen (die nicht beschrifteten Drähte können vorerst ignoriert werden):&lt;br /&gt;
&lt;br /&gt;
c. Nun bietet sich eine gute Gelegenheit die maximale Spannung am Nutzgerät zu messen. Man verbindet das Regler-Kabel (nun ohne Regler) wieder mit der Einspeisung und die offenen Enden der Drähte mit dem Messgerät, bei dem zunächst ein Messbereich von ca. 10-50 Volt gewählt werden sollte. Dies sollte dann z.B. 14,8 V anzeigen. Natürlich können auch die beiden offenen Enden einen kleinen Moment kurz geschlossen werden, man sollte aber bedenken, dass das zu regelnde Nutzgerät dann die maximal vorgesehene Spannung erhält (hier: maximales Tempo).&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung des RPi ==&lt;br /&gt;
&lt;br /&gt;
Es wird davon ausgegangen, dass entsprechend des zugehörigen &#039;manual&#039; das PiFace bereits auf den RPi gesteckt ist, die nötigen python-Bilbliotheken installiert sind und man sich im Terminal-Arbeitsverzeichnis &#039;pi&#039; befindet.&lt;br /&gt;
&lt;br /&gt;
a. Zunächst wird der PiFace-Emulator (im Terminal direkt aus dem Arbeitsverzeichnis) gestartet: &amp;lt;tt&amp;gt;piface/scripts/piface-emulator&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b. Wenn alles richtig installiert wurde, erscheint ein Fenster (unten links), bei dem die vorerst wichtigen blauen Signale am rechten Rand wie folgt angezeigt werden sollten: &lt;br /&gt;
 &lt;br /&gt;
[[Datei:RPi_PiF_em-scs.jpg|400px|Piface-Emulator im default-Zustand]] [[Datei:RPi_PiF_em_scs1.jpg|400px|Piface-Relais 1 auf &#039;1&#039; geschaltet]]&lt;br /&gt;
&lt;br /&gt;
c. Das rechte Fenster ergibt sich, wenn man nun im Fenster auf &amp;quot;Override Enable&amp;quot; und dann &amp;quot;Output Pin 1&amp;quot; klickt. Es müsste ein &amp;quot;Klack&amp;quot; vom Relais 1 zu hören sein sowie der Schaltzustand des unteren Relais 1 (das an den Output Pin 1 gekoppelt ist) auf die Verbindung der beiden unteren Anschlüsse wechseln. Zugleich wird das erste LED-Icon beim Output Pin 1 rot sowie das zugehörige LED-Icon blau.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pif_rel2.png|thumb|right|250px|Schema der Piface-Relais]]&lt;br /&gt;
d. Rechts ist der Schaltzustand der Relais, die zu Beginn genutzt werden, im Grundzustand dargestellt (jeweils der mittlere und obere Kontakt sind kurzgeschlossen, der jeweils untere Kontakt ist frei):&lt;br /&gt;
&lt;br /&gt;
e. Ein weiterer Klick auf &amp;quot;Output Pin 1&amp;quot; versetzt das Relais in den Ausgangszustand, der vor dem nächsten Schritt wieder eingestellt werden sollte.&lt;br /&gt;
&lt;br /&gt;
f. Das Relais läßt sich auch mittel eines Python-Scripts vom RPi aus ansteuern. Dazu wird folgende Textdatei &amp;quot;wandler.py&amp;quot; im Arbeitsverzeichnis abgespeichert und mit dem Befehl &amp;quot;&amp;lt;tt&amp;gt;python wandler.py&amp;lt;/tt&amp;gt;&amp;quot; gestartet:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler.py&lt;br /&gt;
&lt;br /&gt;
 from time import sleep&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
&lt;br /&gt;
 pfio.init()&lt;br /&gt;
&lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
 print &amp;quot;Strom an&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 sleep(2)&lt;br /&gt;
&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Strom aus&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Nach dem Absetzen des Befehls wechselt nun das blaue Signal an Relais 1 für 2 Sekunden und das Relais klackt entsprechend.&lt;br /&gt;
&lt;br /&gt;
== Einsatz eines Relais&#039; zur Umsetzung von Spannungsänderungen ==&lt;br /&gt;
&lt;br /&gt;
a. Ist das Relais wieder im Ausgangszustand, befestigt man nun einen der vom Breadboard führenden Drähte am unteren und einen am mittleren Relaiseingang (im Moment ist die Polarität noch egal). Zunächst sollte nichts passieren (das Relais hält diesen ja Stromkreis noch offen).&lt;br /&gt;
&lt;br /&gt;
b. Startet man aber das Script wieder (&amp;lt;tt&amp;gt;python wandler.py&amp;lt;/tt&amp;gt;) oder klickt auf &#039;Output Pin 1&#039; wird der Nutzstromkreis geschlossen. Nochmals aufgepasst: unser Nutzer erhält wieder die maximal vorgesehene Spannung - also besser vorher im Script &amp;quot;&amp;lt;tt&amp;gt;sleep(0.3)&amp;lt;/tt&amp;gt;&amp;quot; setzen und speichern.&lt;br /&gt;
&lt;br /&gt;
c. Im Prinzip ist damit die programmgesteuerte Umsetzung eines 0/1 Signals in z.B. eine 0V/15V Spannung erreicht.&lt;br /&gt;
&lt;br /&gt;
d. Da wir bald verschiedene Steuerspannungen schalten wollen, geht es jetzt darum herauszufinden, bei welcher Spannung unser Nutzgerät gerade noch bewegt wird. Dies probiert man aus - mit dem kleinsten Widerstand beginnend: indem einer der Drähte in eine freie Breadboardspalte gesteckt wird und aus dieser Spalte der Widerstand zu dem &#039;alten&#039; Steckplatz des Drahtes geführt wird. Nun startet man jeweils das Script bis der Widerstand so hoch ist, dass die Anlaufspannung beim Nutzgerätes gut ausreicht, eine Reaktion des Nutzgerät (Fahrzeug bewegt sich) zu bewirken (z.B. bei 50 Ohm beträgt der Strom ca. 130 mA während ohne 190 mA fliessen).&lt;br /&gt;
&lt;br /&gt;
= Ansteuerung von 3 Schaltstufen =&lt;br /&gt;
&lt;br /&gt;
== Kombination von 2 Relais ==&lt;br /&gt;
&lt;br /&gt;
[[Bild:ZrelMww2.png|thumb|right|250px|Beschaltung der Relais]] a. Die einfachste Stufe der weiteren Verschaltung erreicht man, indem der Widerstand mit einem 2. Relais überbrückt wird. Relais 1 kann dann als &#039;Hauptschalter&#039;, Relais 2 als Spannungsumschalter genutzt werden:&lt;br /&gt;
&lt;br /&gt;
b. Diese Beschaltung kann sogleich mit dem PiFace-Emulator ausprobiert werden. Damit können wir bereits 3 Schaltstufen steuern: keine, verminderte und volle Spannung.&lt;br /&gt;
&lt;br /&gt;
c. Theoretisch liesse sich auch noch eine 4. Spannungsstufe erzeugen, da mit 2 &#039;Bits&#039; (Ein/Aus bei 2 Relais) bereits 4 verschiedene Signale darstellbar sind. Beim jetzigen Aufbau werden aber lediglich die (pin1,pin2)-Signale (0,0), (1,0) und (1,1) &#039;genutzt&#039;, da Relais 1 als Hauptschalter vorgesehen ist und die Kombination (0,1) so nicht ausgewertet wird.&lt;br /&gt;
&lt;br /&gt;
== Programmgesteuerte Schaltung von 2 Relais ==&lt;br /&gt;
&lt;br /&gt;
a. Mit einem veränderten python-Script &amp;quot;wandler2.py&amp;quot; ist auch die programmgesteuerte Schaltung möglich. Dabei werden zusätzlich die Tasten 1 und 2 des PiFace genutzt, um nach dem Start des Scripts (&amp;lt;tt&amp;gt;python wandler2.py&amp;lt;/tt&amp;gt;) den Hauptschalter (Relais 1) zu steuern:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler2.py&lt;br /&gt;
 &lt;br /&gt;
 from time import sleep&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
 pfio.init()&lt;br /&gt;
 &lt;br /&gt;
 taste_1=0&lt;br /&gt;
 taste_2=0&lt;br /&gt;
 intervall_a=0.1&lt;br /&gt;
 intervall_b=0.5&lt;br /&gt;
 # Die Intervalle bestimmen die Schaltzeit für volle/verminderte Spannung&lt;br /&gt;
 &lt;br /&gt;
 print &amp;quot;Zum Start Taste 1 drücken, zum Stoppen Taste 2&amp;quot;&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 while taste_1 == 0:&lt;br /&gt;
   sleep(intervall_a)&lt;br /&gt;
   taste_1=pfio.digital_read(1)&lt;br /&gt;
&lt;br /&gt;
 # Der o.g. &#039;sleep&#039;-Befehl bestimmt die Abfragepausen für Taste 1&lt;br /&gt;
 &lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
 print &amp;quot;Strom an!&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 while taste_2 == 0:&lt;br /&gt;
   pfio.digital_write(2,1)&lt;br /&gt;
   sleep(intervall_a)&lt;br /&gt;
   pfio.digital_write(2,0)&lt;br /&gt;
   sleep(intervall_b)&lt;br /&gt;
   taste_2=pfio.digital_read(2)&lt;br /&gt;
 &lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Strom aus!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
b. Falls beim Ausprobieren von Script-Änderungen mal was schief geht, kann das Script stets auch mit der Tastenkombination (CNTRL-C) gestoppt werden. U.U. muss dann noch zusätzlich Relais 1 und/oder 2 via Emulator zurückgesetzt werden.&lt;br /&gt;
&lt;br /&gt;
c. Beim Verändern des Scripts fällt bald auf, dass die bisherige Programmsteuerung keine direkte Möglichkeit vorsieht, auf Ereignisse zu reagieren. Immerhin wird ein mechanisches Gerät gesteuert, bei dem mit Ausfällen, Fertigungstoleranzen, Umwelteinflüssen etc. zu rechnen ist (im Script wird dies bislang &#039;nur&#039; durch die Abbruchbedingung &#039;Taste 2&#039; berücksichtigt).&lt;br /&gt;
&lt;br /&gt;
== Einfache Sensor-Signale als steuernde Elemente eines Programms ==&lt;br /&gt;
&lt;br /&gt;
a. Eine wichtige Anwendung von D/A-Steuerungen ist die mögliche Reaktion dieser Steuerung auf &#039;äußere&#039; Ereignisse, die z.B. mit Hilfe von Sensoren leistbar ist.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Einf_Sens.jpg|thumb|right|250px|einfacher Sensor]]b. Für unsere Zwecke genügt zunächst ein sehr einfacher Sensor, der ein 0- oder 1-Signal liefert und idealerweise direkt am &#039;Input Pin 1&#039; des PiFace angeschlossen werden kann. So liegt beim Input Pin 1 das Signal &#039;1&#039; an, wenn eine Verbindung zu &#039;Input GND&#039; besteht.&lt;br /&gt;
Z.B. können 2 unisolierte Drähte so plaziert werden, dass ein vorbeifahrendes Fahrzeug einen von ihnen genügend bewegt um den Kontakt kurze Zeit zu öffnen. Genau dann liefert dieser &#039;Sensor&#039; das Signal &#039;0&#039;. Eine - die Schwerkraft nutzende - mögliche Bauform ist rechts abgebildet ;-)&lt;br /&gt;
&lt;br /&gt;
c. Natürlich werden zusätzlich 2 isolierte Drähte benötigt, um jeden der beiden offenen Drähte geschützt mit Input Pin 1 und Input GND zu verbinden.&lt;br /&gt;
&lt;br /&gt;
d. Bei jeder Durchfahrt liefert der Sensor nun ein &#039;0&#039;-Signal, was im Script sowohl für eine Zeitmessung als auch für ein &#039;Schaltintervall-Array&#039; genutzt werden kann. Dort können abwechselnd für beide Spannungen Zeiten (die in etwa zum jeweiligen Streckenabschnitt passen) &#039;programmiert&#039; werden. Statt Taste 1 wird nun der Sensor ausgewertet (wobei Taste 1 als Sensor-Ersatz insoweit genutzt werden kann, dass sie gedrückt bleiben bzw. kurz losgelassen werden muss). Zur genaueren Zeitmessung wird noch das modul &#039;clock&#039; benötigt. &amp;quot;&amp;lt;tt&amp;gt;wandler3.py&amp;lt;/tt&amp;gt;&amp;quot; könnte also so aussehen:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler3.py&lt;br /&gt;
 &lt;br /&gt;
 from time import clock&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
 sensor_1=1&lt;br /&gt;
 sensor_2=0&lt;br /&gt;
 rundenzahl=0&lt;br /&gt;
 v_wechsel=0&lt;br /&gt;
 vorrunde=0&lt;br /&gt;
 index_zaehler=1&lt;br /&gt;
 &lt;br /&gt;
 zeit_array=[0,0.2,0.4,0.2,0.4,0.2,0.4,0.2,5,0.2,6]&lt;br /&gt;
 # dieses array enthält die sek. bis zum Spannungswechsel&lt;br /&gt;
&lt;br /&gt;
 array_laenge=9&lt;br /&gt;
 # legt fest, wie viel Werte des arrays genutzt werden sollen&lt;br /&gt;
 &lt;br /&gt;
 sensor_aus=1.3&lt;br /&gt;
 # bis der Sensor sicher in die Ruhestellung kippt, wird er nicht ausgelesen&lt;br /&gt;
  &lt;br /&gt;
 pfio.init()&lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
&lt;br /&gt;
 # das Fahrzeug wird langsam zum Start (=Sensor) bewegt&lt;br /&gt;
 while sensor_1 == 1 :&lt;br /&gt;
   sensor_1=pfio.digital_read(1)&lt;br /&gt;
  &lt;br /&gt;
 print &amp;quot;fliegender Start... zum Beenden Taste 2 drücken&amp;quot;&lt;br /&gt;
 print &amp;quot;Runde Nr., Ges.Zeit, Rundenzeit, mittlere Rundenzeit&amp;quot;&lt;br /&gt;
 start_zeit=clock()&lt;br /&gt;
 runden_start=start_zeit&lt;br /&gt;
  &lt;br /&gt;
 while sensor_2 == 0 :&lt;br /&gt;
   sensor_2=pfio.digital_read(2)&lt;br /&gt;
   v_wechsel=1-v_wechsel&lt;br /&gt;
   pfio.digital_write(2,v_wechsel)&lt;br /&gt;
   sensor_zeit=clock()&lt;br /&gt;
  &lt;br /&gt;
   while zeit_array[index_zaehler]+sensor_zeit &amp;gt; clock() :&lt;br /&gt;
     if runden_start+sensor_aus &amp;lt; clock() :&lt;br /&gt;
 &lt;br /&gt;
       sensor_1=pfio.digital_read(1) &lt;br /&gt;
       if sensor_1 == 0 :&lt;br /&gt;
         rundenzahl=rundenzahl+1&lt;br /&gt;
         runden_start=clock()&lt;br /&gt;
         zeit=runden_start-start_zeit&lt;br /&gt;
         print rundenzahl, zeit, zeit-vorrunde, zeit/rundenzahl&lt;br /&gt;
         vorrunde=zeit&lt;br /&gt;
         sensor_zeit=0&lt;br /&gt;
         index_zaehler=0&lt;br /&gt;
         v_wechsel=0&lt;br /&gt;
  &lt;br /&gt;
   index_zaehler=index_zaehler+1&lt;br /&gt;
   if index_zaehler &amp;gt; array_laenge :&lt;br /&gt;
     sensor_2=1&lt;br /&gt;
     print &amp;quot;array-Ende erreicht!&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Outp 1 &amp;amp; 2 auf 0!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wird das Array-Ende erreicht, wurden entweder zu wenige Einträge vorgesehen oder es befindet sich kein Fahrzeug (mehr) auf der Strecke, das den Sensor und damit des Zurücksetzen des Arrays auslösen konnte.&lt;br /&gt;
&lt;br /&gt;
e. Das Array ist an die jeweilige Strecke anzupassen, wobei der vorderste Eintrag ungenutzt bleibt und dann mit der Dauer für maximale Spannung begonnen wird. Solange man mit Relais arbeitet, sollten die Schaltzeiten nicht zu kurz sein (&amp;gt;0.1 sek), da diese eine gewisse mechanische Trägheit besitzen.&lt;br /&gt;
&lt;br /&gt;
f. Eben diese mechanische Beschaffenheit der Relais (Verschleiß) ist auch ein guter Grund, auf &#039;volle&#039; digitale Signalumwandlung umzustellen.&lt;br /&gt;
&lt;br /&gt;
= Optokoppler als Ersatz für Relais =&lt;br /&gt;
&lt;br /&gt;
Ähnlich wie ein Relais dient ein [[Optokoppler]] dazu, eine Signalübertragung zwischen zwei getrennten Stromkreisen zu ermöglichen. Hier liegt der Einsatz von Optokopplern nahe, da sie schneller schalten und keine beweglichen Teile besitzen. Für unsere Zwecke benötigen wir nun als zusätzliche Elemente: Optokoppler (CNY 17-4), npn-[[Transistor]]en (BC 337-40) zur Signalverstärkung sowie einige Widerstände im Bereich von 2k und 400 Ohm. &lt;br /&gt;
&lt;br /&gt;
== Kaskadierung von Transistoren zur Signalverstärkung ==&lt;br /&gt;
&lt;br /&gt;
a. Entsprechend Schritt 2.4.d. (ein Relais bei 50 Ohm) wird zunächst ein Optokoppler eingesetzt, dessen Signal durch einen Transistor verstärkt wird, um die &#039;Grundspannung&#039; zu schalten (Pin 3 und 6 beim Optokoppler sollten unbeschaltet bleiben, allein der &#039;Lichtstrom&#039; reicht für eine Durchschaltung aus).&lt;br /&gt;
&lt;br /&gt;
[[Bild:PiF_CNY_BC_1.png|thumb|left|450px|Optokoppler mit Transistor]]&lt;br /&gt;
&lt;br /&gt;
b. Da immer mit einer gewissen Toleranz bei allen Komponenten zu rechnen ist, kann es sein, dass u.U. die Widerstände etwas größer oder kleiner gewählt werden müssen. Beim Ausprobieren sollte man hier in 10% Schritten variieren.&lt;br /&gt;
&lt;br /&gt;
c. Bei Austesten mit Emulator oder Script ist auch zu beachten, dass nun &#039;Output Pin 8&#039; genutzt wird, da dieser nicht mit den Relais verschaltet ist.&lt;br /&gt;
&lt;br /&gt;
== Umsetzung von 3 Schaltstufen mit Optokopplern ==&lt;br /&gt;
&lt;br /&gt;
a. Entsprechend dem Vorgehen beim Relais kann nun auch der kleine Widerstand zusätzlich beschaltet werden um seine gesteuerte Überbrückung zu ermöglichen. Da hier eine relativ geringe Spannung aufgeschaltet wird, kann zusätzlich eine Diode eingesetzt werden, die die Schaltstufe &#039;maximale Spannung&#039; anzeigt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:SmPiFu2ou2T.png|thumb|left|450px|Kombination von 2 Optokopplern]]&lt;br /&gt;
&lt;br /&gt;
b. Vor dem Testen ist wieder zu beachten, dass nun zusätzlich &#039;Output Pin 7&#039; genutzt wird (statt Output Pin 2).&lt;br /&gt;
&lt;br /&gt;
c. Eine mögliche Realisierung sieht so aus:...&lt;br /&gt;
&lt;br /&gt;
== Zusätzliche Erhöhung der Schaltstufen bei D/A-Wandlern ==&lt;br /&gt;
&lt;br /&gt;
[[Bild:Sm3ou3t2.png|thumb|right|450px|Erhöhung der Schaltstufen]]a. Zwar benötigen wir in unserem speziellen Beispiel eine &#039;Grundspannung&#039;, die sich dahingehend auswirkt, dass - wie unter 3.1.c. erwähnt - eine Signalkombination nicht ausgewertet wird, aber mit jeder weiteren Schaltstufe würde sich dieses Problem (theoretisch) relativieren, da bei geschickter Auswahl der Widerstände (z.B. im Verhältnis 1 zu 2) jeweils eine Verdoppelung der Kombinationsmöglichkeiten erreichbar ist.&lt;br /&gt;
&lt;br /&gt;
b. Wird hier der 50 Ohm Widerstand asymmetrisch geteilt (z.B. 15 + 35 Ohm, s.a. [[Spannungsteiler]]) um dort ein weiteres Signal umsetzen zu können, ergeben sich direkt folgende 5 Schaltstufen (aus, 50, 35, 15 und 0 Ohm) u.s.w.&lt;br /&gt;
&lt;br /&gt;
c. Zur Ansteuerung dieser Schaltstufen ist das Script so zu ändern, dass nun zwischen mehr als 2 Stufen gewechselt werden kann und im Array entsprechende Zusatzdaten vorgegeben und ausgelesen werden. Mehr als diese Stufen sind im konkreten Fall aber nicht sinnvoll, da die entstehende Verlustleistung in der Schaltung die maximal verfügbare Leistung reduziert.&lt;br /&gt;
&lt;br /&gt;
= Weiterführende Ideen =&lt;br /&gt;
&lt;br /&gt;
== Hardwareseitige Ausbauvarianten ==&lt;br /&gt;
&lt;br /&gt;
Dem Ausbau dieses Ansatzes sind kaum Grenzen gesetzt:&lt;br /&gt;
&lt;br /&gt;
- beispielhafte Umsetzung einer differenzierten Abstufung mittels mittels einer logarithmischen Einteilung oder eines möglichst oft durch 2 teilbaren Anfangswertes und der Teiler (640 Ohm, 320, 160...);&lt;br /&gt;
&lt;br /&gt;
- Nachbau des Projekts mit einem Microcontroller (ggf. mit LCD-Anzeige);&lt;br /&gt;
&lt;br /&gt;
- Umbau der Steuerung mit dem Ziel, sie direkt an die GPIO-Pins des RPi anzuschließen;&lt;br /&gt;
&lt;br /&gt;
- Ergänzung um eine Sensorik, die in diesem Beispiel eine Rückmeldung liefert, ob ein Verbraucher aktiv ist oder nicht (Fahrzeug noch auf der Strecke?);&lt;br /&gt;
&lt;br /&gt;
- Einsatz anderer Sensortechniken und/oder mehrerer Sensoren zur Optimierung der Schnelligkeit oder parallelen Steuerung eines 2. Fahrzeuges;&lt;br /&gt;
&lt;br /&gt;
== Softwareseitige Ausbauvarianten ==&lt;br /&gt;
&lt;br /&gt;
- Optimierung des Scripts, indem die Sensor-Abfrage über einen &#039;Listener&#039; umgesetzt wird;&lt;br /&gt;
&lt;br /&gt;
- Erweiterung des Scripts um eine GUI mit Hilfe der python-lib Tkinter, um einen Nutzerzugriff auf das Steuerarray und/oder eine &#039;Verwaltung&#039; mehrerer Fahrzeuge;&lt;br /&gt;
&lt;br /&gt;
- Einbindung eines Web-Interface um eine &#039;Fernsteuerung&#039; zu ermöglichen...&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [http://hackaday.com/2013/01/23/replacement-controllers-for-slot-car-racing/ ähnliches Projekt bei &#039;hackaday&#039;] &lt;br /&gt;
* [https://docs.google.com/folder/d/0B-UAZ9CyJCLGQjJ3RDlqa2pqaDg/edit?pli=1&amp;amp;docId=0B-UAZ9CyJCLGNmpMeVpyYlZJUWc Relaisschaltung mit pädagogischer Erweiterung d. Universität Manchester]&lt;br /&gt;
* [http://elinux.org/RPi_Projects/PiFace_controlling_a_slot-car parallele englischsp. Dokumentation dieses Projekts mit anderem Schwerpunkt] &lt;br /&gt;
* [http://elinux.org/RPi_Projects englischsp. Projektliste zum RPi]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Raspberry Pi]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Mknot9</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=RPi_als_D/A-Wandler&amp;diff=74092</id>
		<title>RPi als D/A-Wandler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=RPi_als_D/A-Wandler&amp;diff=74092"/>
		<updated>2013-03-07T18:05:44Z</updated>

		<summary type="html">&lt;p&gt;Mknot9: /* RPi in Kombination mit der &amp;#039;PiFace&amp;#039;-Karte als Bastelplattform */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von mknot9&#039;&#039; (in Arbeit)&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
Oft wird ein Computer &#039;nur&#039; genutzt um darauf Software ablaufen zu lassen. Dessen Möglichkeit zur Steuerung von elektrischen und mechanischen Geräten wird dabei leicht übersehen.&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel richtet sich daher an Einsteiger, die mit dem [[Raspberry Pi]] (&#039;RPi&#039;) Grundlagen der Computersteuerung von Relais und Spannungsteilern nachvollziehen möchten. Es wird schrittweise dargestellt, wie mittels eines D/A-Wandlers (Digital/Analog-Wandler = Umwandlung von digitalen 1/0 Signale) die Steuerung einer stufenweise veränderbaren Ausgangsspannung nachgebaut werden kann.&lt;br /&gt;
&lt;br /&gt;
= Verwendete Hardware =&lt;br /&gt;
&lt;br /&gt;
== RPi in Kombination mit der &#039;PiFace&#039;-Karte als Bastelplattform ==&lt;br /&gt;
&lt;br /&gt;
Dank der einfachen Bauweise bietet sich der RPi mit seinen frei zugänglichen GPIO-Pins als ideale Bastelplattform an. Trotzdem kann es beim Experimentieren mit Schaltungen öfters zu kleinen Fehlern kommen, die schlimmstenfalls die empfindliche Elektronik des RPi dauerhaft beschädigen können.&lt;br /&gt;
&lt;br /&gt;
Daher wird bei diesem Projekt zusätzlich mit der &#039;PiFace&#039;[http://elinux.org/RPi_Expansion_Boards#Piface]-Karte gearbeitet, die man auf die GPIO-Pins stecken kann. Diese Erweiterungskarte verschaltet die GPIO-Pins auf je 8 digitale Ein- und Ausgänge, sowie 2 Relais, die eine galvanische Trennung von Stromkreisen ermöglichen. Damit besteht auch für Einsteiger ein gewisser Schutz für die Steuerelektronik des RPi.&lt;br /&gt;
&lt;br /&gt;
Auch im weiteren Verlauf dieser Einführung soll noch auf eine Trennung der Stromkreise Wert gelegt werden, so dass für erste digitale Schaltexperimente ein Optokoppler genutzt wird. Die spätere Nutzung der &#039;Input Pins&#039; des PiFace um eine Steuerung der D/A-Wandlung durch bestimmte Ereignisse zu ermöglichen, erfolgt ebenfalls passiv.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Auch wenn mit vermeindlich &#039;sicheren&#039; Transformatoren gebastelt wird, muss stets bedacht werden, dass diese an einem 230V-Stromnetz betrieben werden und man eher einmal mehr als weniger prüfen sollte, ob man durch eventuelle Fehler mit lebensgefährlicher Spannung in Berührung kommt!&lt;br /&gt;
&lt;br /&gt;
== Auswahl eines Beispielprojektes ==&lt;br /&gt;
&lt;br /&gt;
Günstige Möglichkeiten ein Gerät zu finden, das mit analogen Spannungen arbeitet, bieten sich u.a. im Spielzeugbereich. Im Grunde eignet sich alles, was mit Batterien oder mit Gleichspannungen unter 24 V betrieben wird.&lt;br /&gt;
&lt;br /&gt;
Da jedoch ein Ziel das Steuern von analogen Spannungen ist, bietet sich insbesondere alles an, bei dem [[Potentiometer]] eingesetzt werden. Einen dieser &#039;Handregler&#039; sollte man übrig haben, da er von seinem Anschlusskabel abgetrennt werden muss, um den oft proprietären Steckanschluss nutzen zu können. In diesem Sinne wird hier eine handelsübliche Spielzeug-Autorennbahn mit Potentiometer-Handreglern genutzt.&lt;br /&gt;
&lt;br /&gt;
== Sonstige Bauteile ==&lt;br /&gt;
&lt;br /&gt;
Für die ersten Grundlagen (s. Teile 2 &amp;amp; 3) genügen bereits rund 2 m isolierter Draht, der nicht aus verdrillten feinen Adern (Litze) bestehen sollte, 50 cm nicht-isolierter Draht, einige niederohmige Widerstände (z.B. je 2 mal 100 Ohm, 80, 60, sowie 20) und ein &#039;Experimentierbrett&#039; (engl. [[Breadboard]]).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Grundlagen und Vorbereitung des Projekts =&lt;br /&gt;
&lt;br /&gt;
== Umwandlung von 1/0 zu Ein/Aus mit einem Relais ==&lt;br /&gt;
&lt;br /&gt;
Vom Prinzip her ist jede Umwandlung eines digitalen 0 oder 1 Signals (das über eine bestimmte Spannungsdifferenz festgelegt ist) in eine (nutzbare) Spannung bereits eine D/A-Wandlung. Dies wird schlicht so realisiert, dass mit einer Eingabe am RPi die Nutzspannung des &#039;Verbrauchers&#039; zunächst einfach an- und ausgeschaltet wird.&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung der zu steuernden Hardware ==&lt;br /&gt;
&lt;br /&gt;
a. Um Fehlerquellen auszuschliessen sollte zunächst (und ggf. auch später!) kurz getestet werden, ob der vorhandene Regler wie erwartet funktioniert.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pif_Con9.jpg|thumb|right|400px|Fixierung der Reglerkabel]]&lt;br /&gt;
b. Nach dem Trennen des Reglers von der Einspeisung (und ggf. Ziehen des Netzsteckers) muss das Regler-Kabel abgeschnitten werden (eher nahe beim Regler, da das Kabel bald bis zum Breadboard reichen soll). Die neuen Enden des Einspeiseteils werden abisoliert und auf dem Breadboard diagonal zueinander mit einigen Spalten Abstand fixiert. Auch können bereits die Drähte, die später zum RPi führen, jeweils in den passenden kontaktführenden Spalten eingesteckt werden, z. B. wie rechts zu sehen (die nicht beschrifteten Drähte können vorerst ignoriert werden):&lt;br /&gt;
&lt;br /&gt;
c. Nun bietet sich eine gute Gelegenheit die maximale Spannung am Nutzgerät zu messen. Man verbindet das Regler-Kabel (nun ohne Regler) wieder mit der Einspeisung und die offenen Enden der Drähte mit dem Messgerät, bei dem zunächst ein Messbereich von ca. 10-50 Volt gewählt werden sollte. Dies sollte dann z.B. 14,8 V anzeigen. Natürlich können auch die beiden offenen Enden einen kleinen Moment kurz geschlossen werden, man sollte aber bedenken, dass das zu regelnde Nutzgerät dann die maximal vorgesehene Spannung erhält (hier: maximales Tempo).&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung des RPi ==&lt;br /&gt;
&lt;br /&gt;
Es wird davon ausgegangen, dass entsprechend des zugehörigen &#039;manual&#039; das PiFace bereits auf den RPi gesteckt ist, die nötigen python-Bilbliotheken installiert sind und man sich im Terminal-Arbeitsverzeichnis &#039;pi&#039; befindet.&lt;br /&gt;
&lt;br /&gt;
a. Zunächst wird der PiFace-Emulator (im Terminal direkt aus dem Arbeitsverzeichnis) gestartet: &amp;lt;tt&amp;gt;piface/scripts/piface-emulator&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b. Wenn alles richtig installiert wurde, erscheint ein Fenster (unten links), bei dem die vorerst wichtigen blauen Signale am rechten Rand wie folgt angezeigt werden sollten: &lt;br /&gt;
 &lt;br /&gt;
[[Datei:RPi_PiF_em-scs.jpg|400px|Piface-Emulator im default-Zustand]] [[Datei:RPi_PiF_em_scs1.jpg|400px|Piface-Relais 1 auf &#039;1&#039; geschaltet]]&lt;br /&gt;
&lt;br /&gt;
c. Das rechte Fenster ergibt sich, wenn man nun im Fenster auf &amp;quot;Override Enable&amp;quot; und dann &amp;quot;Output Pin 1&amp;quot; klickt. Es müsste ein &amp;quot;Klack&amp;quot; vom Relais 1 zu hören sein sowie der Schaltzustand des unteren Relais 1 (das an den Output Pin 1 gekoppelt ist) auf die Verbindung der beiden unteren Anschlüsse wechseln. Zugleich wird das erste LED-Icon beim Output Pin 1 rot sowie das zugehörige LED-Icon blau.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pif_rel2.png|thumb|right|250px|Schema der Piface-Relais]]&lt;br /&gt;
d. Rechts ist der Schaltzustand der Relais, die zu Beginn genutzt werden, im Grundzustand dargestellt (jeweils der mittlere und obere Kontakt sind kurzgeschlossen, der jeweils untere Kontakt ist frei):&lt;br /&gt;
&lt;br /&gt;
e. Ein weiterer Klick auf &amp;quot;Output Pin 1&amp;quot; versetzt das Relais in den Ausgangszustand, der vor dem nächsten Schritt wieder eingestellt werden sollte.&lt;br /&gt;
&lt;br /&gt;
f. Das Relais läßt sich auch mittel eines Python-Scripts vom RPi aus ansteuern. Dazu wird folgende Textdatei &amp;quot;wandler.py&amp;quot; im Arbeitsverzeichnis abgespeichert und mit dem Befehl &amp;quot;&amp;lt;tt&amp;gt;python wandler.py&amp;lt;/tt&amp;gt;&amp;quot; gestartet:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler.py&lt;br /&gt;
&lt;br /&gt;
 from time import sleep&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
&lt;br /&gt;
 pfio.init()&lt;br /&gt;
&lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
 print &amp;quot;Strom an&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 sleep(2)&lt;br /&gt;
&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Strom aus&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Nach dem Absetzen des Befehls wechselt nun das blaue Signal an Relais 1 für 2 Sekunden und das Relais klackt entsprechend.&lt;br /&gt;
&lt;br /&gt;
== Einsatz eines Relais&#039; zur Umsetzung von Spannungsänderungen ==&lt;br /&gt;
&lt;br /&gt;
a. Ist das Relais wieder im Ausgangszustand, befestigt man nun einen der vom Breadboard führenden Drähte am unteren und einen am mittleren Relaiseingang (im Moment ist die Polarität noch egal). Zunächst sollte nichts passieren (das Relais hält diesen ja Stromkreis noch offen).&lt;br /&gt;
&lt;br /&gt;
b. Startet man aber das Script wieder (&amp;lt;tt&amp;gt;python wandler.py&amp;lt;/tt&amp;gt;) oder klickt auf &#039;Output Pin 1&#039; wird der Nutzstromkreis geschlossen. Nochmals aufgepasst: unser Nutzer erhält wieder die maximal vorgesehene Spannung - also besser vorher im Script &amp;quot;&amp;lt;tt&amp;gt;sleep(0.3)&amp;lt;/tt&amp;gt;&amp;quot; setzen und speichern.&lt;br /&gt;
&lt;br /&gt;
c. Im Prinzip ist damit die programmgesteuerte Umsetzung eines 0/1 Signals in z.B. eine 0V/15V Spannung erreicht.&lt;br /&gt;
&lt;br /&gt;
d. Da wir bald verschiedene Steuerspannungen schalten wollen, geht es jetzt darum herauszufinden, bei welcher Spannung unser Nutzgerät gerade noch bewegt wird. Dies probiert man aus - mit dem kleinsten Widerstand beginnend: indem einer der Drähte in eine freie Breadboardspalte gesteckt wird und aus dieser Spalte der Widerstand zu dem &#039;alten&#039; Steckplatz des Drahtes geführt wird. Nun startet man jeweils das Script bis der Widerstand so hoch ist, dass die Anlaufspannung beim Nutzgerätes gut ausreicht, eine Reaktion des Nutzgerät (Fahrzeug bewegt sich) zu bewirken (z.B. bei 50 Ohm beträgt der Strom ca. 130 mA während ohne 190 mA fliessen).&lt;br /&gt;
&lt;br /&gt;
= Ansteuerung von 3 Schaltstufen =&lt;br /&gt;
&lt;br /&gt;
== Kombination von 2 Relais ==&lt;br /&gt;
&lt;br /&gt;
[[Bild:ZrelMww2.png|thumb|right|250px|Beschaltung der Relais]] a. Die einfachste Stufe der weiteren Verschaltung erreicht man, indem der Widerstand mit einem 2. Relais überbrückt wird. Relais 1 kann dann als &#039;Hauptschalter&#039;, Relais 2 als Spannungsumschalter genutzt werden:&lt;br /&gt;
&lt;br /&gt;
b. Diese Beschaltung kann sogleich mit dem PiFace-Emulator ausprobiert werden. Damit können wir bereits 3 Schaltstufen steuern: keine, verminderte und volle Spannung.&lt;br /&gt;
&lt;br /&gt;
c. Theoretisch liesse sich auch noch eine 4. Spannungsstufe erzeugen, da mit 2 &#039;Bits&#039; (Ein/Aus bei 2 Relais) bereits 4 verschiedene Signale darstellbar sind. Beim jetzigen Aufbau werden aber lediglich die (pin1,pin2)-Signale (0,0), (1,0) und (1,1) &#039;genutzt&#039;, da Relais 1 als Hauptschalter vorgesehen ist und die Kombination (0,1) so nicht ausgewertet wird.&lt;br /&gt;
&lt;br /&gt;
== Programmgesteuerte Schaltung von 2 Relais ==&lt;br /&gt;
&lt;br /&gt;
a. Mit einem veränderten python-Script &amp;quot;wandler2.py&amp;quot; ist auch die programmgesteuerte Schaltung möglich. Dabei werden zusätzlich die Tasten 1 und 2 des PiFace genutzt, um nach dem Start des Scripts (&amp;lt;tt&amp;gt;python wandler2.py&amp;lt;/tt&amp;gt;) den Hauptschalter (Relais 1) zu steuern:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler2.py&lt;br /&gt;
 &lt;br /&gt;
 from time import sleep&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
 pfio.init()&lt;br /&gt;
 &lt;br /&gt;
 taste_1=0&lt;br /&gt;
 taste_2=0&lt;br /&gt;
 intervall_a=0.1&lt;br /&gt;
 intervall_b=0.5&lt;br /&gt;
 # Die Intervalle bestimmen die Schaltzeit für volle/verminderte Spannung&lt;br /&gt;
 &lt;br /&gt;
 print &amp;quot;Zum Start Taste 1 drücken, zum Stoppen Taste 2&amp;quot;&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 while taste_1 == 0:&lt;br /&gt;
   sleep(intervall_a)&lt;br /&gt;
   taste_1=pfio.digital_read(1)&lt;br /&gt;
&lt;br /&gt;
 # Der o.g. &#039;sleep&#039;-Befehl bestimmt die Abfragepausen für Taste 1&lt;br /&gt;
 &lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
 print &amp;quot;Strom an!&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 while taste_2 == 0:&lt;br /&gt;
   pfio.digital_write(2,1)&lt;br /&gt;
   sleep(intervall_a)&lt;br /&gt;
   pfio.digital_write(2,0)&lt;br /&gt;
   sleep(intervall_b)&lt;br /&gt;
   taste_2=pfio.digital_read(2)&lt;br /&gt;
 &lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Strom aus!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
b. Falls beim Ausprobieren von Script-Änderungen mal was schief geht, kann das Script stets auch mit der Tastenkombination (CNTRL-C) gestoppt werden. U.U. muss dann noch zusätzlich Relais 1 und/oder 2 via Emulator zurückgesetzt werden.&lt;br /&gt;
&lt;br /&gt;
c. Beim Verändern des Scripts fällt bald auf, dass die bisherige Programmsteuerung keine direkte Möglichkeit vorsieht, auf Ereignisse zu reagieren. Immerhin wird ein mechanisches Gerät gesteuert, bei dem mit Ausfällen, Fertigungstoleranzen, Umwelteinflüssen etc. zu rechnen ist (im Script wird dies bislang &#039;nur&#039; durch die Abbruchbedingung &#039;Taste 2&#039; berücksichtigt).&lt;br /&gt;
&lt;br /&gt;
== Einfache Sensor-Signale als steuernde Elemente eines Programms ==&lt;br /&gt;
&lt;br /&gt;
a. Eine wichtige Anwendung von D/A-Steuerungen ist die mögliche Reaktion dieser Steuerung auf &#039;äußere&#039; Ereignisse, die z.B. mit Hilfe von Sensoren leistbar ist.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Einf_Sens.jpg|thumb|right|250px|einfacher Sensor]]b. Für unsere Zwecke genügt zunächst ein sehr einfacher Sensor, der ein 0- oder 1-Signal liefert und idealerweise direkt am &#039;Input Pin 1&#039; des PiFace angeschlossen werden kann. So liegt beim Input Pin 1 das Signal &#039;1&#039; an, wenn eine Verbindung zu &#039;Input GND&#039; besteht.&lt;br /&gt;
Z.B. können 2 unisolierte Drähte so plaziert werden, dass ein vorbeifahrendes Fahrzeug einen von ihnen genügend bewegt um den Kontakt kurze Zeit zu öffnen. Genau dann liefert dieser &#039;Sensor&#039; das Signal &#039;0&#039;. Eine - die Schwerkraft nutzende - mögliche Bauform ist rechts abgebildet ;-)&lt;br /&gt;
&lt;br /&gt;
c. Natürlich werden zusätzlich 2 isolierte Drähte benötigt, um jeden der beiden offenen Drähte geschützt mit Input Pin 1 und Input GND zu verbinden.&lt;br /&gt;
&lt;br /&gt;
d. Bei jeder Durchfahrt liefert der Sensor nun ein &#039;0&#039;-Signal, was im Script sowohl für eine Zeitmessung als auch für ein &#039;Schaltintervall-Array&#039; genutzt werden kann. Dort können abwechselnd für beide Spannungen Zeiten (die in etwa zum jeweiligen Streckenabschnitt passen) &#039;programmiert&#039; werden. Statt Taste 1 wird nun der Sensor ausgewertet (wobei Taste 1 als Sensor-Ersatz insoweit genutzt werden kann, dass sie gedrückt bleiben bzw. kurz losgelassen werden muss). Zur genaueren Zeitmessung wird noch das modul &#039;clock&#039; benötigt. &amp;quot;&amp;lt;tt&amp;gt;wandler3.py&amp;lt;/tt&amp;gt;&amp;quot; könnte also so aussehen:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler3.py&lt;br /&gt;
 &lt;br /&gt;
 from time import clock&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
 sensor_1=1&lt;br /&gt;
 sensor_2=0&lt;br /&gt;
 rundenzahl=0&lt;br /&gt;
 v_wechsel=0&lt;br /&gt;
 vorrunde=0&lt;br /&gt;
 index_zaehler=1&lt;br /&gt;
 &lt;br /&gt;
 zeit_array=[0,0.2,0.4,0.2,0.4,0.2,0.4,0.2,5,0.2,6]&lt;br /&gt;
 # dieses array enthält die sek. bis zum Spannungswechsel&lt;br /&gt;
&lt;br /&gt;
 array_laenge=9&lt;br /&gt;
 # legt fest, wie viel Werte des arrays genutzt werden sollen&lt;br /&gt;
 &lt;br /&gt;
 sensor_aus=1.3&lt;br /&gt;
 # bis der Sensor sicher in die Ruhestellung kippt, wird er nicht ausgelesen&lt;br /&gt;
  &lt;br /&gt;
 pfio.init()&lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
&lt;br /&gt;
 # das Fahrzeug wird langsam zum Start (=Sensor) bewegt&lt;br /&gt;
 while sensor_1 == 1 :&lt;br /&gt;
   sensor_1=pfio.digital_read(1)&lt;br /&gt;
  &lt;br /&gt;
 print &amp;quot;fliegender Start... zum Beenden Taste 2 drücken&amp;quot;&lt;br /&gt;
 print &amp;quot;Runde Nr., Ges.Zeit, Rundenzeit, mittlere Rundenzeit&amp;quot;&lt;br /&gt;
 start_zeit=clock()&lt;br /&gt;
 runden_start=start_zeit&lt;br /&gt;
  &lt;br /&gt;
 while sensor_2 == 0 :&lt;br /&gt;
   sensor_2=pfio.digital_read(2)&lt;br /&gt;
   v_wechsel=1-v_wechsel&lt;br /&gt;
   pfio.digital_write(2,v_wechsel)&lt;br /&gt;
   sensor_zeit=clock()&lt;br /&gt;
  &lt;br /&gt;
   while zeit_array[index_zaehler]+sensor_zeit &amp;gt; clock() :&lt;br /&gt;
     if runden_start+sensor_aus &amp;lt; clock() :&lt;br /&gt;
 &lt;br /&gt;
       sensor_1=pfio.digital_read(1) &lt;br /&gt;
       if sensor_1 == 0 :&lt;br /&gt;
         rundenzahl=rundenzahl+1&lt;br /&gt;
         runden_start=clock()&lt;br /&gt;
         zeit=runden_start-start_zeit&lt;br /&gt;
         print rundenzahl, zeit, zeit-vorrunde, zeit/rundenzahl&lt;br /&gt;
         vorrunde=zeit&lt;br /&gt;
         sensor_zeit=0&lt;br /&gt;
         index_zaehler=0&lt;br /&gt;
         v_wechsel=0&lt;br /&gt;
  &lt;br /&gt;
   index_zaehler=index_zaehler+1&lt;br /&gt;
   if index_zaehler &amp;gt; array_laenge :&lt;br /&gt;
     sensor_2=1&lt;br /&gt;
     print &amp;quot;array-Ende erreicht!&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Outp 1 &amp;amp; 2 auf 0!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wird das Array-Ende erreicht, wurden entweder zu wenige Einträge vorgesehen oder es befindet sich kein Fahrzeug (mehr) auf der Strecke, das den Sensor und damit des Zurücksetzen des Arrays auslösen konnte.&lt;br /&gt;
&lt;br /&gt;
e. Das Array ist an die jeweilige Strecke anzupassen, wobei der vorderste Eintrag ungenutzt bleibt und dann mit der Dauer für maximale Spannung begonnen wird. Solange man mit Relais arbeitet, sollten die Schaltzeiten nicht zu kurz sein (&amp;gt;0.1 sek), da diese eine gewisse mechanische Trägheit besitzen.&lt;br /&gt;
&lt;br /&gt;
f. Eben diese mechanische Beschaffenheit der Relais (Verschleiß) ist auch ein guter Grund, auf &#039;volle&#039; digitale Signalumwandlung umzustellen.&lt;br /&gt;
&lt;br /&gt;
= Optokoppler als Ersatz für Relais =&lt;br /&gt;
&lt;br /&gt;
Ähnlich wie ein Relais dient ein [[Optokoppler]] dazu, eine Signalübertragung zwischen zwei getrennten Stromkreisen zu ermöglichen. Hier liegt der Einsatz von Optokopplern nahe, da sie schneller schalten und keine beweglichen Teile besitzen. Für unsere Zwecke benötigen wir nun als zusätzliche Elemente: Optokoppler (CNY 17-4), npn-[[Transistor]]en (BC 337-40) zur Signalverstärkung sowie einige Widerstände im Bereich von 2k und 400 Ohm. &lt;br /&gt;
&lt;br /&gt;
== Kaskadierung von Transistoren zur Signalverstärkung ==&lt;br /&gt;
&lt;br /&gt;
a. Entsprechend Schritt 2.4.d. (ein Relais bei 50 Ohm) wird zunächst ein Optokoppler eingesetzt, dessen Signal durch einen Transistor verstärkt wird, um die &#039;Grundspannung&#039; zu schalten (Pin 3 und 6 beim Optokoppler sollten unbeschaltet bleiben, allein der &#039;Lichtstrom&#039; reicht für eine Durchschaltung aus).&lt;br /&gt;
&lt;br /&gt;
[[Bild:PiF_CNY_BC_1.png|thumb|left|450px|Optokoppler mit Transistor]]&lt;br /&gt;
&lt;br /&gt;
b. Da immer mit einer gewissen Toleranz bei allen Komponenten zu rechnen ist, kann es sein, dass u.U. die Widerstände etwas größer oder kleiner gewählt werden müssen. Beim Ausprobieren sollte man hier in 10% Schritten variieren.&lt;br /&gt;
&lt;br /&gt;
c. Bei Austesten mit Emulator oder Script ist auch zu beachten, dass nun &#039;Output Pin 8&#039; genutzt wird, da dieser nicht mit den Relais verschaltet ist.&lt;br /&gt;
&lt;br /&gt;
== Umsetzung von 3 Schaltstufen mit Optokopplern ==&lt;br /&gt;
&lt;br /&gt;
a. Entsprechend dem Vorgehen beim Relais kann nun auch der kleine Widerstand zusätzlich beschaltet werden um seine gesteuerte Überbrückung zu ermöglichen. Da hier eine relativ geringe Spannung aufgeschaltet wird, kann zusätzlich eine Diode eingesetzt werden, die die Schaltstufe &#039;maximale Spannung&#039; anzeigt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:SmPiFu2ou2T.png|thumb|left|450px|Kombination von 2 Optokopplern]]&lt;br /&gt;
&lt;br /&gt;
b. Vor dem Testen ist wieder zu beachten, dass nun zusätzlich &#039;Output Pin 7&#039; genutzt wird (statt Output Pin 2).&lt;br /&gt;
&lt;br /&gt;
c. Eine mögliche Realisierung sieht so aus:...&lt;br /&gt;
&lt;br /&gt;
== Zusätzliche Erhöhung der Schaltstufen bei D/A-Wandlern ==&lt;br /&gt;
&lt;br /&gt;
[[Bild:Sm3ou3t2.png|thumb|right|450px|Erhöhung der Schaltstufen]]a. Zwar benötigen wir in unserem speziellen Beispiel eine &#039;Grundspannung&#039;, die sich dahingehend auswirkt, dass - wie unter 3.1.c. erwähnt - eine Signalkombination nicht ausgewertet wird, aber mit jeder weiteren Schaltstufe würde sich dieses Problem (theoretisch) relativieren, da bei geschickter Auswahl der Widerstände (z.B. im Verhältnis 1 zu 2) jeweils eine Verdoppelung der Kombinationsmöglichkeiten erreichbar ist.&lt;br /&gt;
&lt;br /&gt;
b. Wird hier der 50 Ohm Widerstand asymmetrisch geteilt (z.B. 15 + 35 Ohm, s.a. [[Spannungsteiler]]) um dort ein weiteres Signal umsetzen zu können, ergeben sich direkt folgende 5 Schaltstufen (aus, 50, 35, 15 und 0 Ohm) u.s.w.&lt;br /&gt;
&lt;br /&gt;
c. Zur Ansteuerung dieser Schaltstufen ist das Script so zu ändern, dass nun zwischen mehr als 2 Stufen gewechselt werden kann und im Array entsprechende Zusatzdaten vorgegeben und ausgelesen werden. Mehr als diese Stufen sind im konkreten Fall aber nicht sinnvoll, da die entstehende Verlustleistung in der Schaltung die maximal verfügbare Leistung reduziert.&lt;br /&gt;
&lt;br /&gt;
= Weiterführende Ideen =&lt;br /&gt;
&lt;br /&gt;
== Hardwareseitige Ausbauvarianten ==&lt;br /&gt;
&lt;br /&gt;
Dem Ausbau dieses Ansatzes sind kaum Grenzen gesetzt:&lt;br /&gt;
&lt;br /&gt;
- beispielhafte Umsetzung einer differenzierten Abstufung mittels mittels einer logarithmischen Einteilung oder eines möglichst oft durch 2 teilbaren Anfangswertes und der Teiler (640 Ohm, 320, 160...);&lt;br /&gt;
&lt;br /&gt;
- Nachbau des Projekts mit einem Microcontroller (ggf. mit LCD-Anzeige);&lt;br /&gt;
&lt;br /&gt;
- Umbau der Steuerung mit dem Ziel, sie direkt an die GPIO-Pins des RPi anzuschließen;&lt;br /&gt;
&lt;br /&gt;
- Ergänzung um eine Sensorik, die in diesem Beispiel eine Rückmeldung liefert, ob ein Verbraucher aktiv ist oder nicht (Fahrzeug noch auf der Strecke?);&lt;br /&gt;
&lt;br /&gt;
- Einsatz anderer Sensortechniken und/oder mehrerer Sensoren zur Optimierung der Schnelligkeit oder parallelen Steuerung eines 2. Fahrzeuges;&lt;br /&gt;
&lt;br /&gt;
== Softwareseitige Ausbauvarianten ==&lt;br /&gt;
&lt;br /&gt;
- Optimierung des Scripts, indem die Sensor-Abfrage über einen &#039;Listener&#039; umgesetzt wird;&lt;br /&gt;
&lt;br /&gt;
- Erweiterung des Scripts um eine GUI mit Hilfe der python-lib Tkinter, um einen Nutzerzugriff auf das Steuerarray und/oder eine &#039;Verwaltung&#039; mehrerer Fahrzeuge;&lt;br /&gt;
&lt;br /&gt;
- Einbindung eines Web-Interface um eine &#039;Fernsteuerung&#039; zu ermöglichen...&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [http://hackaday.com/2013/01/23/replacement-controllers-for-slot-car-racing/ ähnliches Projekt bei &#039;hackaday&#039;] &lt;br /&gt;
* [https://docs.google.com/folder/d/0B-UAZ9CyJCLGQjJ3RDlqa2pqaDg/edit?pli=1&amp;amp;docId=0B-UAZ9CyJCLGNmpMeVpyYlZJUWc Relaisschaltung mit pädagogischer Erweiterung d. Universität Manchester]&lt;br /&gt;
* [http://elinux.org/RPi_Projects/PiFace_controlling_a_slot-car parallele englischsp. Dokumentation dieses Projekts mit anderem Schwerpunkt] &lt;br /&gt;
* [http://elinux.org/RPi_Projects englischsp. Projektliste zum RPi]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Raspberry Pi]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Mknot9</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=RPi_als_D/A-Wandler&amp;diff=74091</id>
		<title>RPi als D/A-Wandler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=RPi_als_D/A-Wandler&amp;diff=74091"/>
		<updated>2013-03-07T18:02:12Z</updated>

		<summary type="html">&lt;p&gt;Mknot9: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von mknot9&#039;&#039; (in Arbeit)&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
Oft wird ein Computer &#039;nur&#039; genutzt um darauf Software ablaufen zu lassen. Dessen Möglichkeit zur Steuerung von elektrischen und mechanischen Geräten wird dabei leicht übersehen.&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel richtet sich daher an Einsteiger, die mit dem [[Raspberry Pi]] (&#039;RPi&#039;) Grundlagen der Computersteuerung von Relais und Spannungsteilern nachvollziehen möchten. Es wird schrittweise dargestellt, wie mittels eines D/A-Wandlers (Digital/Analog-Wandler = Umwandlung von digitalen 1/0 Signale) die Steuerung einer stufenweise veränderbaren Ausgangsspannung nachgebaut werden kann.&lt;br /&gt;
&lt;br /&gt;
= Verwendete Hardware =&lt;br /&gt;
&lt;br /&gt;
== RPi in Kombination mit der &#039;PiFace&#039;-Karte als Bastelplattform ==&lt;br /&gt;
&lt;br /&gt;
Dank der einfachen Bauweise bietet sich der RPi mit seinen frei zugänglichen GPIO-Pins als ideale Bastelplattform an. Trotzdem kann es beim Experimentieren mit Schaltungen öfters zu kleinen Fehlern kommen, die schlimmstenfalls die empfindliche Elektronik des RPi dauerhaft beschädigen können.&lt;br /&gt;
&lt;br /&gt;
Daher wird bei diesem Projekt zusätzlich mit der &#039;[[http://elinux.org/RPi_Expansion_Boards#Piface|PiFace]]&#039;-Karte gearbeitet, die man auf die GPIO-Pins stecken kann. Diese Erweiterungskarte verschaltet die GPIO-Pins auf je 8 digitale Ein- und Ausgänge, sowie 2 Relais, die eine galvanische Trennung von Stromkreisen ermöglichen. Damit besteht auch für Einsteiger ein gewisser Schutz für die Steuerelektronik des RPi.&lt;br /&gt;
&lt;br /&gt;
Auch im weiteren Verlauf dieser Einführung soll noch auf eine Trennung der Stromkreise Wert gelegt werden, so dass für erste digitale Schaltexperimente ein Optokoppler genutzt wird. Die spätere Nutzung der &#039;Input Pins&#039; des PiFace um eine Steuerung der D/A-Wandlung durch bestimmte Ereignisse zu ermöglichen, erfolgt ebenfalls passiv.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Auch wenn mit vermeindlich &#039;sicheren&#039; Transformatoren gebastelt wird, muss stets bedacht werden, dass diese an einem 230V-Stromnetz betrieben werden und man eher einmal mehr als weniger prüfen sollte, ob man durch eventuelle Fehler mit lebensgefährlicher Spannung in Berührung kommt!&lt;br /&gt;
&lt;br /&gt;
== Auswahl eines Beispielprojektes ==&lt;br /&gt;
&lt;br /&gt;
Günstige Möglichkeiten ein Gerät zu finden, das mit analogen Spannungen arbeitet, bieten sich u.a. im Spielzeugbereich. Im Grunde eignet sich alles, was mit Batterien oder mit Gleichspannungen unter 24 V betrieben wird.&lt;br /&gt;
&lt;br /&gt;
Da jedoch ein Ziel das Steuern von analogen Spannungen ist, bietet sich insbesondere alles an, bei dem [[Potentiometer]] eingesetzt werden. Einen dieser &#039;Handregler&#039; sollte man übrig haben, da er von seinem Anschlusskabel abgetrennt werden muss, um den oft proprietären Steckanschluss nutzen zu können. In diesem Sinne wird hier eine handelsübliche Spielzeug-Autorennbahn mit Potentiometer-Handreglern genutzt.&lt;br /&gt;
&lt;br /&gt;
== Sonstige Bauteile ==&lt;br /&gt;
&lt;br /&gt;
Für die ersten Grundlagen (s. Teile 2 &amp;amp; 3) genügen bereits rund 2 m isolierter Draht, der nicht aus verdrillten feinen Adern (Litze) bestehen sollte, 50 cm nicht-isolierter Draht, einige niederohmige Widerstände (z.B. je 2 mal 100 Ohm, 80, 60, sowie 20) und ein &#039;Experimentierbrett&#039; (engl. [[Breadboard]]).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Grundlagen und Vorbereitung des Projekts =&lt;br /&gt;
&lt;br /&gt;
== Umwandlung von 1/0 zu Ein/Aus mit einem Relais ==&lt;br /&gt;
&lt;br /&gt;
Vom Prinzip her ist jede Umwandlung eines digitalen 0 oder 1 Signals (das über eine bestimmte Spannungsdifferenz festgelegt ist) in eine (nutzbare) Spannung bereits eine D/A-Wandlung. Dies wird schlicht so realisiert, dass mit einer Eingabe am RPi die Nutzspannung des &#039;Verbrauchers&#039; zunächst einfach an- und ausgeschaltet wird.&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung der zu steuernden Hardware ==&lt;br /&gt;
&lt;br /&gt;
a. Um Fehlerquellen auszuschliessen sollte zunächst (und ggf. auch später!) kurz getestet werden, ob der vorhandene Regler wie erwartet funktioniert.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pif_Con9.jpg|thumb|right|400px|Fixierung der Reglerkabel]]&lt;br /&gt;
b. Nach dem Trennen des Reglers von der Einspeisung (und ggf. Ziehen des Netzsteckers) muss das Regler-Kabel abgeschnitten werden (eher nahe beim Regler, da das Kabel bald bis zum Breadboard reichen soll). Die neuen Enden des Einspeiseteils werden abisoliert und auf dem Breadboard diagonal zueinander mit einigen Spalten Abstand fixiert. Auch können bereits die Drähte, die später zum RPi führen, jeweils in den passenden kontaktführenden Spalten eingesteckt werden, z. B. wie rechts zu sehen (die nicht beschrifteten Drähte können vorerst ignoriert werden):&lt;br /&gt;
&lt;br /&gt;
c. Nun bietet sich eine gute Gelegenheit die maximale Spannung am Nutzgerät zu messen. Man verbindet das Regler-Kabel (nun ohne Regler) wieder mit der Einspeisung und die offenen Enden der Drähte mit dem Messgerät, bei dem zunächst ein Messbereich von ca. 10-50 Volt gewählt werden sollte. Dies sollte dann z.B. 14,8 V anzeigen. Natürlich können auch die beiden offenen Enden einen kleinen Moment kurz geschlossen werden, man sollte aber bedenken, dass das zu regelnde Nutzgerät dann die maximal vorgesehene Spannung erhält (hier: maximales Tempo).&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung des RPi ==&lt;br /&gt;
&lt;br /&gt;
Es wird davon ausgegangen, dass entsprechend des zugehörigen &#039;manual&#039; das PiFace bereits auf den RPi gesteckt ist, die nötigen python-Bilbliotheken installiert sind und man sich im Terminal-Arbeitsverzeichnis &#039;pi&#039; befindet.&lt;br /&gt;
&lt;br /&gt;
a. Zunächst wird der PiFace-Emulator (im Terminal direkt aus dem Arbeitsverzeichnis) gestartet: &amp;lt;tt&amp;gt;piface/scripts/piface-emulator&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b. Wenn alles richtig installiert wurde, erscheint ein Fenster (unten links), bei dem die vorerst wichtigen blauen Signale am rechten Rand wie folgt angezeigt werden sollten: &lt;br /&gt;
 &lt;br /&gt;
[[Datei:RPi_PiF_em-scs.jpg|400px|Piface-Emulator im default-Zustand]] [[Datei:RPi_PiF_em_scs1.jpg|400px|Piface-Relais 1 auf &#039;1&#039; geschaltet]]&lt;br /&gt;
&lt;br /&gt;
c. Das rechte Fenster ergibt sich, wenn man nun im Fenster auf &amp;quot;Override Enable&amp;quot; und dann &amp;quot;Output Pin 1&amp;quot; klickt. Es müsste ein &amp;quot;Klack&amp;quot; vom Relais 1 zu hören sein sowie der Schaltzustand des unteren Relais 1 (das an den Output Pin 1 gekoppelt ist) auf die Verbindung der beiden unteren Anschlüsse wechseln. Zugleich wird das erste LED-Icon beim Output Pin 1 rot sowie das zugehörige LED-Icon blau.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pif_rel2.png|thumb|right|250px|Schema der Piface-Relais]]&lt;br /&gt;
d. Rechts ist der Schaltzustand der Relais, die zu Beginn genutzt werden, im Grundzustand dargestellt (jeweils der mittlere und obere Kontakt sind kurzgeschlossen, der jeweils untere Kontakt ist frei):&lt;br /&gt;
&lt;br /&gt;
e. Ein weiterer Klick auf &amp;quot;Output Pin 1&amp;quot; versetzt das Relais in den Ausgangszustand, der vor dem nächsten Schritt wieder eingestellt werden sollte.&lt;br /&gt;
&lt;br /&gt;
f. Das Relais läßt sich auch mittel eines Python-Scripts vom RPi aus ansteuern. Dazu wird folgende Textdatei &amp;quot;wandler.py&amp;quot; im Arbeitsverzeichnis abgespeichert und mit dem Befehl &amp;quot;&amp;lt;tt&amp;gt;python wandler.py&amp;lt;/tt&amp;gt;&amp;quot; gestartet:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler.py&lt;br /&gt;
&lt;br /&gt;
 from time import sleep&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
&lt;br /&gt;
 pfio.init()&lt;br /&gt;
&lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
 print &amp;quot;Strom an&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 sleep(2)&lt;br /&gt;
&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Strom aus&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Nach dem Absetzen des Befehls wechselt nun das blaue Signal an Relais 1 für 2 Sekunden und das Relais klackt entsprechend.&lt;br /&gt;
&lt;br /&gt;
== Einsatz eines Relais&#039; zur Umsetzung von Spannungsänderungen ==&lt;br /&gt;
&lt;br /&gt;
a. Ist das Relais wieder im Ausgangszustand, befestigt man nun einen der vom Breadboard führenden Drähte am unteren und einen am mittleren Relaiseingang (im Moment ist die Polarität noch egal). Zunächst sollte nichts passieren (das Relais hält diesen ja Stromkreis noch offen).&lt;br /&gt;
&lt;br /&gt;
b. Startet man aber das Script wieder (&amp;lt;tt&amp;gt;python wandler.py&amp;lt;/tt&amp;gt;) oder klickt auf &#039;Output Pin 1&#039; wird der Nutzstromkreis geschlossen. Nochmals aufgepasst: unser Nutzer erhält wieder die maximal vorgesehene Spannung - also besser vorher im Script &amp;quot;&amp;lt;tt&amp;gt;sleep(0.3)&amp;lt;/tt&amp;gt;&amp;quot; setzen und speichern.&lt;br /&gt;
&lt;br /&gt;
c. Im Prinzip ist damit die programmgesteuerte Umsetzung eines 0/1 Signals in z.B. eine 0V/15V Spannung erreicht.&lt;br /&gt;
&lt;br /&gt;
d. Da wir bald verschiedene Steuerspannungen schalten wollen, geht es jetzt darum herauszufinden, bei welcher Spannung unser Nutzgerät gerade noch bewegt wird. Dies probiert man aus - mit dem kleinsten Widerstand beginnend: indem einer der Drähte in eine freie Breadboardspalte gesteckt wird und aus dieser Spalte der Widerstand zu dem &#039;alten&#039; Steckplatz des Drahtes geführt wird. Nun startet man jeweils das Script bis der Widerstand so hoch ist, dass die Anlaufspannung beim Nutzgerätes gut ausreicht, eine Reaktion des Nutzgerät (Fahrzeug bewegt sich) zu bewirken (z.B. bei 50 Ohm beträgt der Strom ca. 130 mA während ohne 190 mA fliessen).&lt;br /&gt;
&lt;br /&gt;
= Ansteuerung von 3 Schaltstufen =&lt;br /&gt;
&lt;br /&gt;
== Kombination von 2 Relais ==&lt;br /&gt;
&lt;br /&gt;
[[Bild:ZrelMww2.png|thumb|right|250px|Beschaltung der Relais]] a. Die einfachste Stufe der weiteren Verschaltung erreicht man, indem der Widerstand mit einem 2. Relais überbrückt wird. Relais 1 kann dann als &#039;Hauptschalter&#039;, Relais 2 als Spannungsumschalter genutzt werden:&lt;br /&gt;
&lt;br /&gt;
b. Diese Beschaltung kann sogleich mit dem PiFace-Emulator ausprobiert werden. Damit können wir bereits 3 Schaltstufen steuern: keine, verminderte und volle Spannung.&lt;br /&gt;
&lt;br /&gt;
c. Theoretisch liesse sich auch noch eine 4. Spannungsstufe erzeugen, da mit 2 &#039;Bits&#039; (Ein/Aus bei 2 Relais) bereits 4 verschiedene Signale darstellbar sind. Beim jetzigen Aufbau werden aber lediglich die (pin1,pin2)-Signale (0,0), (1,0) und (1,1) &#039;genutzt&#039;, da Relais 1 als Hauptschalter vorgesehen ist und die Kombination (0,1) so nicht ausgewertet wird.&lt;br /&gt;
&lt;br /&gt;
== Programmgesteuerte Schaltung von 2 Relais ==&lt;br /&gt;
&lt;br /&gt;
a. Mit einem veränderten python-Script &amp;quot;wandler2.py&amp;quot; ist auch die programmgesteuerte Schaltung möglich. Dabei werden zusätzlich die Tasten 1 und 2 des PiFace genutzt, um nach dem Start des Scripts (&amp;lt;tt&amp;gt;python wandler2.py&amp;lt;/tt&amp;gt;) den Hauptschalter (Relais 1) zu steuern:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler2.py&lt;br /&gt;
 &lt;br /&gt;
 from time import sleep&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
 pfio.init()&lt;br /&gt;
 &lt;br /&gt;
 taste_1=0&lt;br /&gt;
 taste_2=0&lt;br /&gt;
 intervall_a=0.1&lt;br /&gt;
 intervall_b=0.5&lt;br /&gt;
 # Die Intervalle bestimmen die Schaltzeit für volle/verminderte Spannung&lt;br /&gt;
 &lt;br /&gt;
 print &amp;quot;Zum Start Taste 1 drücken, zum Stoppen Taste 2&amp;quot;&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 while taste_1 == 0:&lt;br /&gt;
   sleep(intervall_a)&lt;br /&gt;
   taste_1=pfio.digital_read(1)&lt;br /&gt;
&lt;br /&gt;
 # Der o.g. &#039;sleep&#039;-Befehl bestimmt die Abfragepausen für Taste 1&lt;br /&gt;
 &lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
 print &amp;quot;Strom an!&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 while taste_2 == 0:&lt;br /&gt;
   pfio.digital_write(2,1)&lt;br /&gt;
   sleep(intervall_a)&lt;br /&gt;
   pfio.digital_write(2,0)&lt;br /&gt;
   sleep(intervall_b)&lt;br /&gt;
   taste_2=pfio.digital_read(2)&lt;br /&gt;
 &lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Strom aus!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
b. Falls beim Ausprobieren von Script-Änderungen mal was schief geht, kann das Script stets auch mit der Tastenkombination (CNTRL-C) gestoppt werden. U.U. muss dann noch zusätzlich Relais 1 und/oder 2 via Emulator zurückgesetzt werden.&lt;br /&gt;
&lt;br /&gt;
c. Beim Verändern des Scripts fällt bald auf, dass die bisherige Programmsteuerung keine direkte Möglichkeit vorsieht, auf Ereignisse zu reagieren. Immerhin wird ein mechanisches Gerät gesteuert, bei dem mit Ausfällen, Fertigungstoleranzen, Umwelteinflüssen etc. zu rechnen ist (im Script wird dies bislang &#039;nur&#039; durch die Abbruchbedingung &#039;Taste 2&#039; berücksichtigt).&lt;br /&gt;
&lt;br /&gt;
== Einfache Sensor-Signale als steuernde Elemente eines Programms ==&lt;br /&gt;
&lt;br /&gt;
a. Eine wichtige Anwendung von D/A-Steuerungen ist die mögliche Reaktion dieser Steuerung auf &#039;äußere&#039; Ereignisse, die z.B. mit Hilfe von Sensoren leistbar ist.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Einf_Sens.jpg|thumb|right|250px|einfacher Sensor]]b. Für unsere Zwecke genügt zunächst ein sehr einfacher Sensor, der ein 0- oder 1-Signal liefert und idealerweise direkt am &#039;Input Pin 1&#039; des PiFace angeschlossen werden kann. So liegt beim Input Pin 1 das Signal &#039;1&#039; an, wenn eine Verbindung zu &#039;Input GND&#039; besteht.&lt;br /&gt;
Z.B. können 2 unisolierte Drähte so plaziert werden, dass ein vorbeifahrendes Fahrzeug einen von ihnen genügend bewegt um den Kontakt kurze Zeit zu öffnen. Genau dann liefert dieser &#039;Sensor&#039; das Signal &#039;0&#039;. Eine - die Schwerkraft nutzende - mögliche Bauform ist rechts abgebildet ;-)&lt;br /&gt;
&lt;br /&gt;
c. Natürlich werden zusätzlich 2 isolierte Drähte benötigt, um jeden der beiden offenen Drähte geschützt mit Input Pin 1 und Input GND zu verbinden.&lt;br /&gt;
&lt;br /&gt;
d. Bei jeder Durchfahrt liefert der Sensor nun ein &#039;0&#039;-Signal, was im Script sowohl für eine Zeitmessung als auch für ein &#039;Schaltintervall-Array&#039; genutzt werden kann. Dort können abwechselnd für beide Spannungen Zeiten (die in etwa zum jeweiligen Streckenabschnitt passen) &#039;programmiert&#039; werden. Statt Taste 1 wird nun der Sensor ausgewertet (wobei Taste 1 als Sensor-Ersatz insoweit genutzt werden kann, dass sie gedrückt bleiben bzw. kurz losgelassen werden muss). Zur genaueren Zeitmessung wird noch das modul &#039;clock&#039; benötigt. &amp;quot;&amp;lt;tt&amp;gt;wandler3.py&amp;lt;/tt&amp;gt;&amp;quot; könnte also so aussehen:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler3.py&lt;br /&gt;
 &lt;br /&gt;
 from time import clock&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
 sensor_1=1&lt;br /&gt;
 sensor_2=0&lt;br /&gt;
 rundenzahl=0&lt;br /&gt;
 v_wechsel=0&lt;br /&gt;
 vorrunde=0&lt;br /&gt;
 index_zaehler=1&lt;br /&gt;
 &lt;br /&gt;
 zeit_array=[0,0.2,0.4,0.2,0.4,0.2,0.4,0.2,5,0.2,6]&lt;br /&gt;
 # dieses array enthält die sek. bis zum Spannungswechsel&lt;br /&gt;
&lt;br /&gt;
 array_laenge=9&lt;br /&gt;
 # legt fest, wie viel Werte des arrays genutzt werden sollen&lt;br /&gt;
 &lt;br /&gt;
 sensor_aus=1.3&lt;br /&gt;
 # bis der Sensor sicher in die Ruhestellung kippt, wird er nicht ausgelesen&lt;br /&gt;
  &lt;br /&gt;
 pfio.init()&lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
&lt;br /&gt;
 # das Fahrzeug wird langsam zum Start (=Sensor) bewegt&lt;br /&gt;
 while sensor_1 == 1 :&lt;br /&gt;
   sensor_1=pfio.digital_read(1)&lt;br /&gt;
  &lt;br /&gt;
 print &amp;quot;fliegender Start... zum Beenden Taste 2 drücken&amp;quot;&lt;br /&gt;
 print &amp;quot;Runde Nr., Ges.Zeit, Rundenzeit, mittlere Rundenzeit&amp;quot;&lt;br /&gt;
 start_zeit=clock()&lt;br /&gt;
 runden_start=start_zeit&lt;br /&gt;
  &lt;br /&gt;
 while sensor_2 == 0 :&lt;br /&gt;
   sensor_2=pfio.digital_read(2)&lt;br /&gt;
   v_wechsel=1-v_wechsel&lt;br /&gt;
   pfio.digital_write(2,v_wechsel)&lt;br /&gt;
   sensor_zeit=clock()&lt;br /&gt;
  &lt;br /&gt;
   while zeit_array[index_zaehler]+sensor_zeit &amp;gt; clock() :&lt;br /&gt;
     if runden_start+sensor_aus &amp;lt; clock() :&lt;br /&gt;
 &lt;br /&gt;
       sensor_1=pfio.digital_read(1) &lt;br /&gt;
       if sensor_1 == 0 :&lt;br /&gt;
         rundenzahl=rundenzahl+1&lt;br /&gt;
         runden_start=clock()&lt;br /&gt;
         zeit=runden_start-start_zeit&lt;br /&gt;
         print rundenzahl, zeit, zeit-vorrunde, zeit/rundenzahl&lt;br /&gt;
         vorrunde=zeit&lt;br /&gt;
         sensor_zeit=0&lt;br /&gt;
         index_zaehler=0&lt;br /&gt;
         v_wechsel=0&lt;br /&gt;
  &lt;br /&gt;
   index_zaehler=index_zaehler+1&lt;br /&gt;
   if index_zaehler &amp;gt; array_laenge :&lt;br /&gt;
     sensor_2=1&lt;br /&gt;
     print &amp;quot;array-Ende erreicht!&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Outp 1 &amp;amp; 2 auf 0!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wird das Array-Ende erreicht, wurden entweder zu wenige Einträge vorgesehen oder es befindet sich kein Fahrzeug (mehr) auf der Strecke, das den Sensor und damit des Zurücksetzen des Arrays auslösen konnte.&lt;br /&gt;
&lt;br /&gt;
e. Das Array ist an die jeweilige Strecke anzupassen, wobei der vorderste Eintrag ungenutzt bleibt und dann mit der Dauer für maximale Spannung begonnen wird. Solange man mit Relais arbeitet, sollten die Schaltzeiten nicht zu kurz sein (&amp;gt;0.1 sek), da diese eine gewisse mechanische Trägheit besitzen.&lt;br /&gt;
&lt;br /&gt;
f. Eben diese mechanische Beschaffenheit der Relais (Verschleiß) ist auch ein guter Grund, auf &#039;volle&#039; digitale Signalumwandlung umzustellen.&lt;br /&gt;
&lt;br /&gt;
= Optokoppler als Ersatz für Relais =&lt;br /&gt;
&lt;br /&gt;
Ähnlich wie ein Relais dient ein [[Optokoppler]] dazu, eine Signalübertragung zwischen zwei getrennten Stromkreisen zu ermöglichen. Hier liegt der Einsatz von Optokopplern nahe, da sie schneller schalten und keine beweglichen Teile besitzen. Für unsere Zwecke benötigen wir nun als zusätzliche Elemente: Optokoppler (CNY 17-4), npn-[[Transistor]]en (BC 337-40) zur Signalverstärkung sowie einige Widerstände im Bereich von 2k und 400 Ohm. &lt;br /&gt;
&lt;br /&gt;
== Kaskadierung von Transistoren zur Signalverstärkung ==&lt;br /&gt;
&lt;br /&gt;
a. Entsprechend Schritt 2.4.d. (ein Relais bei 50 Ohm) wird zunächst ein Optokoppler eingesetzt, dessen Signal durch einen Transistor verstärkt wird, um die &#039;Grundspannung&#039; zu schalten (Pin 3 und 6 beim Optokoppler sollten unbeschaltet bleiben, allein der &#039;Lichtstrom&#039; reicht für eine Durchschaltung aus).&lt;br /&gt;
&lt;br /&gt;
[[Bild:PiF_CNY_BC_1.png|thumb|left|450px|Optokoppler mit Transistor]]&lt;br /&gt;
&lt;br /&gt;
b. Da immer mit einer gewissen Toleranz bei allen Komponenten zu rechnen ist, kann es sein, dass u.U. die Widerstände etwas größer oder kleiner gewählt werden müssen. Beim Ausprobieren sollte man hier in 10% Schritten variieren.&lt;br /&gt;
&lt;br /&gt;
c. Bei Austesten mit Emulator oder Script ist auch zu beachten, dass nun &#039;Output Pin 8&#039; genutzt wird, da dieser nicht mit den Relais verschaltet ist.&lt;br /&gt;
&lt;br /&gt;
== Umsetzung von 3 Schaltstufen mit Optokopplern ==&lt;br /&gt;
&lt;br /&gt;
a. Entsprechend dem Vorgehen beim Relais kann nun auch der kleine Widerstand zusätzlich beschaltet werden um seine gesteuerte Überbrückung zu ermöglichen. Da hier eine relativ geringe Spannung aufgeschaltet wird, kann zusätzlich eine Diode eingesetzt werden, die die Schaltstufe &#039;maximale Spannung&#039; anzeigt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:SmPiFu2ou2T.png|thumb|left|450px|Kombination von 2 Optokopplern]]&lt;br /&gt;
&lt;br /&gt;
b. Vor dem Testen ist wieder zu beachten, dass nun zusätzlich &#039;Output Pin 7&#039; genutzt wird (statt Output Pin 2).&lt;br /&gt;
&lt;br /&gt;
c. Eine mögliche Realisierung sieht so aus:...&lt;br /&gt;
&lt;br /&gt;
== Zusätzliche Erhöhung der Schaltstufen bei D/A-Wandlern ==&lt;br /&gt;
&lt;br /&gt;
[[Bild:Sm3ou3t2.png|thumb|right|450px|Erhöhung der Schaltstufen]]a. Zwar benötigen wir in unserem speziellen Beispiel eine &#039;Grundspannung&#039;, die sich dahingehend auswirkt, dass - wie unter 3.1.c. erwähnt - eine Signalkombination nicht ausgewertet wird, aber mit jeder weiteren Schaltstufe würde sich dieses Problem (theoretisch) relativieren, da bei geschickter Auswahl der Widerstände (z.B. im Verhältnis 1 zu 2) jeweils eine Verdoppelung der Kombinationsmöglichkeiten erreichbar ist.&lt;br /&gt;
&lt;br /&gt;
b. Wird hier der 50 Ohm Widerstand asymmetrisch geteilt (z.B. 15 + 35 Ohm, s.a. [[Spannungsteiler]]) um dort ein weiteres Signal umsetzen zu können, ergeben sich direkt folgende 5 Schaltstufen (aus, 50, 35, 15 und 0 Ohm) u.s.w.&lt;br /&gt;
&lt;br /&gt;
c. Zur Ansteuerung dieser Schaltstufen ist das Script so zu ändern, dass nun zwischen mehr als 2 Stufen gewechselt werden kann und im Array entsprechende Zusatzdaten vorgegeben und ausgelesen werden. Mehr als diese Stufen sind im konkreten Fall aber nicht sinnvoll, da die entstehende Verlustleistung in der Schaltung die maximal verfügbare Leistung reduziert.&lt;br /&gt;
&lt;br /&gt;
= Weiterführende Ideen =&lt;br /&gt;
&lt;br /&gt;
== Hardwareseitige Ausbauvarianten ==&lt;br /&gt;
&lt;br /&gt;
Dem Ausbau dieses Ansatzes sind kaum Grenzen gesetzt:&lt;br /&gt;
&lt;br /&gt;
- beispielhafte Umsetzung einer differenzierten Abstufung mittels mittels einer logarithmischen Einteilung oder eines möglichst oft durch 2 teilbaren Anfangswertes und der Teiler (640 Ohm, 320, 160...);&lt;br /&gt;
&lt;br /&gt;
- Nachbau des Projekts mit einem Microcontroller (ggf. mit LCD-Anzeige);&lt;br /&gt;
&lt;br /&gt;
- Umbau der Steuerung mit dem Ziel, sie direkt an die GPIO-Pins des RPi anzuschließen;&lt;br /&gt;
&lt;br /&gt;
- Ergänzung um eine Sensorik, die in diesem Beispiel eine Rückmeldung liefert, ob ein Verbraucher aktiv ist oder nicht (Fahrzeug noch auf der Strecke?);&lt;br /&gt;
&lt;br /&gt;
- Einsatz anderer Sensortechniken und/oder mehrerer Sensoren zur Optimierung der Schnelligkeit oder parallelen Steuerung eines 2. Fahrzeuges;&lt;br /&gt;
&lt;br /&gt;
== Softwareseitige Ausbauvarianten ==&lt;br /&gt;
&lt;br /&gt;
- Optimierung des Scripts, indem die Sensor-Abfrage über einen &#039;Listener&#039; umgesetzt wird;&lt;br /&gt;
&lt;br /&gt;
- Erweiterung des Scripts um eine GUI mit Hilfe der python-lib Tkinter, um einen Nutzerzugriff auf das Steuerarray und/oder eine &#039;Verwaltung&#039; mehrerer Fahrzeuge;&lt;br /&gt;
&lt;br /&gt;
- Einbindung eines Web-Interface um eine &#039;Fernsteuerung&#039; zu ermöglichen...&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [http://hackaday.com/2013/01/23/replacement-controllers-for-slot-car-racing/ ähnliches Projekt bei &#039;hackaday&#039;] &lt;br /&gt;
* [https://docs.google.com/folder/d/0B-UAZ9CyJCLGQjJ3RDlqa2pqaDg/edit?pli=1&amp;amp;docId=0B-UAZ9CyJCLGNmpMeVpyYlZJUWc Relaisschaltung mit pädagogischer Erweiterung d. Universität Manchester]&lt;br /&gt;
* [http://elinux.org/RPi_Projects/PiFace_controlling_a_slot-car parallele englischsp. Dokumentation dieses Projekts mit anderem Schwerpunkt] &lt;br /&gt;
* [http://elinux.org/RPi_Projects englischsp. Projektliste zum RPi]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Raspberry Pi]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Mknot9</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=RPi_als_D/A-Wandler&amp;diff=74083</id>
		<title>RPi als D/A-Wandler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=RPi_als_D/A-Wandler&amp;diff=74083"/>
		<updated>2013-03-07T16:32:04Z</updated>

		<summary type="html">&lt;p&gt;Mknot9: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von mknot9&#039;&#039; (in Arbeit)&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
Oft wird ein Computer &#039;nur&#039; genutzt um darauf Software ablaufen zu lassen. Dessen Möglichkeit zur Steuerung von elektrischen und mechanischen Geräten wird dabei leicht übersehen.&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel richtet sich daher an Einsteiger, die mit dem [[Raspberry Pi]] (&#039;RPi&#039;) Grundlagen der Computersteuerung von Relais und Spannungsteilern nachvollziehen möchten. Es wird schrittweise dargestellt, wie mittels eines D/A-Wandlers (Digital/Analog-Wandler = Umwandlung von digitalen 1/0 Signale) die Steuerung einer stufenweise veränderbaren Ausgangsspannung nachgebaut werden kann.&lt;br /&gt;
&lt;br /&gt;
= Verwendete Hardware =&lt;br /&gt;
&lt;br /&gt;
== RPi in Kombination mit der &#039;PiFace&#039;-Karte als Bastelplattform ==&lt;br /&gt;
&lt;br /&gt;
Dank der einfachen Bauweise bietet sich der RPi mit seinen frei zugänglichen GPIO-Pins als ideale Bastelplattform an. Trotzdem kann es beim Experimentieren mit Schaltungen öfters zu kleinen Fehlern kommen, die schlimmstenfalls die empfindliche Elektronik des RPi dauerhaft beschädigen können.&lt;br /&gt;
&lt;br /&gt;
Daher wird bei diesem Projekt zusätzlich mit der &#039;[http://elinux.org/RPi_Expansion_Boards#Piface|PiFace]&#039;-Karte gearbeitet, die man auf die GPIO-Pins stecken kann. Diese Erweiterungskarte verschaltet die GPIO-Pins auf je 8 digitale Ein- und Ausgänge, sowie 2 Relais, die eine galvanische Trennung von Stromkreisen ermöglichen. Damit besteht auch für Einsteiger ein gewisser Schutz für die Steuerelektronik des RPi.&lt;br /&gt;
&lt;br /&gt;
Auch im weiteren Verlauf dieser Einführung soll noch auf eine Trennung der Stromkreise Wert gelegt werden, so dass für erste digitale Schaltexperimente ein Optokoppler genutzt wird. Die spätere Nutzung der &#039;Input Pins&#039; des PiFace um eine Steuerung der D/A-Wandlung durch bestimmte Ereignisse zu ermöglichen, erfolgt ebenfalls passiv.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Auch wenn mit vermeindlich &#039;sicheren&#039; Transformatoren gebastelt wird, muss stets bedacht werden, dass diese an einem 230V-Stromnetz betrieben werden und man eher einmal mehr als weniger prüfen sollte, ob man durch eventuelle Fehler mit lebensgefährlicher Spannung in Berührung kommt!&lt;br /&gt;
&lt;br /&gt;
== Auswahl eines Beispielprojektes ==&lt;br /&gt;
&lt;br /&gt;
Günstige Möglichkeiten ein Gerät zu finden, das mit analogen Spannungen arbeitet, bieten sich u.a. im Spielzeugbereich. Im Grunde eignet sich alles, was mit Batterien oder mit Gleichspannungen unter 24 V betrieben wird.&lt;br /&gt;
&lt;br /&gt;
Da jedoch ein Ziel das Steuern von analogen Spannungen ist, bietet sich insbesondere alles an, bei dem [[Potentiometer]] eingesetzt werden. Einen dieser &#039;Handregler&#039; sollte man übrig haben, da er von seinem Anschlusskabel abgetrennt werden muss, um den oft proprietären Steckanschluss nutzen zu können. In diesem Sinne wird hier eine handelsübliche Spielzeug-Autorennbahn mit Potentiometer-Handreglern genutzt.&lt;br /&gt;
&lt;br /&gt;
== Sonstige Bauteile ==&lt;br /&gt;
&lt;br /&gt;
Für die ersten Grundlagen (s. Teile 2 &amp;amp; 3) genügen bereits rund 2 m isolierter Draht, der nicht aus verdrillten feinen Adern (Litze) bestehen sollte, 50 cm nicht-isolierter Draht, einige niederohmige Widerstände (z.B. je 2 mal 100 Ohm, 80, 60, sowie 20) und ein &#039;Experimentierbrett&#039; (engl. [[Breadboard]]).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Grundlagen und Vorbereitung des Projekts =&lt;br /&gt;
&lt;br /&gt;
== Umwandlung von 1/0 zu Ein/Aus mit einem Relais ==&lt;br /&gt;
&lt;br /&gt;
Vom Prinzip her ist jede Umwandlung eines digitalen 0 oder 1 Signals (das über eine bestimmte Spannungsdifferenz festgelegt ist) in eine (nutzbare) Spannung bereits eine D/A-Wandlung. Dies wird schlicht so realisiert, dass mit einer Eingabe am RPi die Nutzspannung des &#039;Verbrauchers&#039; zunächst einfach an- und ausgeschaltet wird.&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung der zu steuernden Hardware ==&lt;br /&gt;
&lt;br /&gt;
a. Um Fehlerquellen auszuschliessen sollte zunächst (und ggf. auch später!) kurz getestet werden, ob der vorhandene Regler wie erwartet funktioniert.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pif_Con9.jpg|thumb|right|400px|Fixierung der Reglerkabel]]&lt;br /&gt;
b. Nach dem Trennen des Reglers von der Einspeisung (und ggf. Ziehen des Netzsteckers) muss das Regler-Kabel abgeschnitten werden (eher nahe beim Regler, da das Kabel bald bis zum Breadboard reichen soll). Die neuen Enden des Einspeiseteils werden abisoliert und auf dem Breadboard diagonal zueinander mit einigen Spalten Abstand fixiert. Auch können bereits die Drähte, die später zum RPi führen, jeweils in den passenden kontaktführenden Spalten eingesteckt werden, z. B. wie rechts zu sehen (die nicht beschrifteten Drähte können vorerst ignoriert werden):&lt;br /&gt;
&lt;br /&gt;
c. Nun bietet sich eine gute Gelegenheit die maximale Spannung am Nutzgerät zu messen. Man verbindet das Regler-Kabel (nun ohne Regler) wieder mit der Einspeisung und die offenen Enden der Drähte mit dem Messgerät, bei dem zunächst ein Messbereich von ca. 10-50 Volt gewählt werden sollte. Dies sollte dann z.B. 14,8 V anzeigen. Natürlich können auch die beiden offenen Enden einen kleinen Moment kurz geschlossen werden, man sollte aber bedenken, dass das zu regelnde Nutzgerät dann die maximal vorgesehene Spannung erhält (hier: maximales Tempo).&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung des RPi ==&lt;br /&gt;
&lt;br /&gt;
Es wird davon ausgegangen, dass entsprechend des zugehörigen &#039;manual&#039; das PiFace bereits auf den RPi gesteckt ist, die nötigen python-Bilbliotheken installiert sind und man sich im Terminal-Arbeitsverzeichnis &#039;pi&#039; befindet.&lt;br /&gt;
&lt;br /&gt;
a. Zunächst wird der PiFace-Emulator (im Terminal direkt aus dem Arbeitsverzeichnis) gestartet: &amp;lt;tt&amp;gt;piface/scripts/piface-emulator&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b. Wenn alles richtig installiert wurde, erscheint ein Fenster (unten links), bei dem die vorerst wichtigen blauen Signale am rechten Rand wie folgt angezeigt werden sollten: &lt;br /&gt;
 &lt;br /&gt;
[[Datei:RPi_PiF_em-scs.jpg|400px|Piface-Emulator im default-Zustand]] [[Datei:RPi_PiF_em_scs1.jpg|400px|Piface-Relais 1 auf &#039;1&#039; geschaltet]]&lt;br /&gt;
&lt;br /&gt;
c. Das rechte Fenster ergibt sich, wenn man nun im Fenster auf &amp;quot;Override Enable&amp;quot; und dann &amp;quot;Output Pin 1&amp;quot; klickt. Es müsste ein &amp;quot;Klack&amp;quot; vom Relais 1 zu hören sein sowie der Schaltzustand des unteren Relais 1 (das an den Output Pin 1 gekoppelt ist) auf die Verbindung der beiden unteren Anschlüsse wechseln. Zugleich wird das erste LED-Icon beim Output Pin 1 rot sowie das zugehörige LED-Icon blau.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pif_rel2.png|thumb|right|250px|Schema der Piface-Relais]]&lt;br /&gt;
d. Rechts ist der Schaltzustand der Relais, die zu Beginn genutzt werden, im Grundzustand dargestellt (jeweils der mittlere und obere Kontakt sind kurzgeschlossen, der jeweils untere Kontakt ist frei):&lt;br /&gt;
&lt;br /&gt;
e. Ein weiterer Klick auf &amp;quot;Output Pin 1&amp;quot; versetzt das Relais in den Ausgangszustand, der vor dem nächsten Schritt wieder eingestellt werden sollte.&lt;br /&gt;
&lt;br /&gt;
f. Das Relais läßt sich auch mittel eines Python-Scripts vom RPi aus ansteuern. Dazu wird folgende Textdatei &amp;quot;wandler.py&amp;quot; im Arbeitsverzeichnis abgespeichert und mit dem Befehl &amp;quot;&amp;lt;tt&amp;gt;python wandler.py&amp;lt;/tt&amp;gt;&amp;quot; gestartet:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler.py&lt;br /&gt;
&lt;br /&gt;
 from time import sleep&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
&lt;br /&gt;
 pfio.init()&lt;br /&gt;
&lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
 print &amp;quot;Strom an&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 sleep(2)&lt;br /&gt;
&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Strom aus&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Nach dem Absetzen des Befehls wechselt nun das blaue Signal an Relais 1 für 2 Sekunden und das Relais klackt entsprechend.&lt;br /&gt;
&lt;br /&gt;
== Einsatz eines Relais&#039; zur Umsetzung von Spannungsänderungen ==&lt;br /&gt;
&lt;br /&gt;
a. Ist das Relais wieder im Ausgangszustand, befestigt man nun einen der vom Breadboard führenden Drähte am unteren und einen am mittleren Relaiseingang (im Moment ist die Polarität noch egal). Zunächst sollte nichts passieren (das Relais hält diesen ja Stromkreis noch offen).&lt;br /&gt;
&lt;br /&gt;
b. Startet man aber das Script wieder (&amp;lt;tt&amp;gt;python wandler.py&amp;lt;/tt&amp;gt;) oder klickt auf &#039;Output Pin 1&#039; wird der Nutzstromkreis geschlossen. Nochmals aufgepasst: unser Nutzer erhält wieder die maximal vorgesehene Spannung - also besser vorher im Script &amp;quot;&amp;lt;tt&amp;gt;sleep(0.3)&amp;lt;/tt&amp;gt;&amp;quot; setzen und speichern.&lt;br /&gt;
&lt;br /&gt;
c. Im Prinzip ist damit die programmgesteuerte Umsetzung eines 0/1 Signals in z.B. eine 0V/15V Spannung erreicht.&lt;br /&gt;
&lt;br /&gt;
d. Da wir bald verschiedene Steuerspannungen schalten wollen, geht es jetzt darum herauszufinden, bei welcher Spannung unser Nutzgerät gerade noch bewegt wird. Dies probiert man aus - mit dem kleinsten Widerstand beginnend: indem einer der Drähte in eine freie Breadboardspalte gesteckt wird und aus dieser Spalte der Widerstand zu dem &#039;alten&#039; Steckplatz des Drahtes geführt wird. Nun startet man jeweils das Script bis der Widerstand so hoch ist, dass die Anlaufspannung beim Nutzgerätes gut ausreicht, eine Reaktion des Nutzgerät (Fahrzeug bewegt sich) zu bewirken (z.B. bei 50 Ohm beträgt der Strom ca. 130 mA während ohne 190 mA fliessen).&lt;br /&gt;
&lt;br /&gt;
= Ansteuerung von 3 Schaltstufen =&lt;br /&gt;
&lt;br /&gt;
== Kombination von 2 Relais ==&lt;br /&gt;
&lt;br /&gt;
[[Bild:ZrelMww2.png|thumb|right|250px|Beschaltung der Relais]] a. Die einfachste Stufe der weiteren Verschaltung erreicht man, indem der Widerstand mit einem 2. Relais überbrückt wird. Relais 1 kann dann als &#039;Hauptschalter&#039;, Relais 2 als Spannungsumschalter genutzt werden:&lt;br /&gt;
&lt;br /&gt;
b. Diese Beschaltung kann sogleich mit dem PiFace-Emulator ausprobiert werden. Damit können wir bereits 3 Schaltstufen steuern: keine, verminderte und volle Spannung.&lt;br /&gt;
&lt;br /&gt;
c. Theoretisch liesse sich auch noch eine 4. Spannungsstufe erzeugen, da mit 2 &#039;Bits&#039; (Ein/Aus bei 2 Relais) bereits 4 verschiedene Signale darstellbar sind. Beim jetzigen Aufbau werden aber lediglich die (pin1,pin2)-Signale (0,0), (1,0) und (1,1) &#039;genutzt&#039;, da Relais 1 als Hauptschalter vorgesehen ist und die Kombination (0,1) so nicht ausgewertet wird.&lt;br /&gt;
&lt;br /&gt;
== Programmgesteuerte Schaltung von 2 Relais ==&lt;br /&gt;
&lt;br /&gt;
a. Mit einem veränderten python-Script &amp;quot;wandler2.py&amp;quot; ist auch die programmgesteuerte Schaltung möglich. Dabei werden direkt zusätzlich die Tasten 1 und 2 des PiFace genutzt, um nach dem Start des Scripts (&amp;lt;tt&amp;gt;python wandler2.py&amp;lt;/tt&amp;gt;) den Hauptschalter (Relais 1) zu steuern:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler2.py&lt;br /&gt;
 &lt;br /&gt;
 from time import sleep&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
 pfio.init()&lt;br /&gt;
 &lt;br /&gt;
 taste_1=0&lt;br /&gt;
 taste_2=0&lt;br /&gt;
 intervall_a=0.1&lt;br /&gt;
 intervall_b=0.5&lt;br /&gt;
 # Die Intervalle bestimmen die Schaltzeit für volle/verminderte Spannung&lt;br /&gt;
 &lt;br /&gt;
 print &amp;quot;Zum Start Taste 1 drücken, zum Stoppen Taste 2&amp;quot;&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 while taste_1 == 0:&lt;br /&gt;
   sleep(intervall_a)&lt;br /&gt;
   taste_1=pfio.digital_read(1)&lt;br /&gt;
&lt;br /&gt;
 # Der o.g. &#039;sleep&#039;-Befehl bestimmt die Abfragepausen für Taste 1&lt;br /&gt;
 &lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
 print &amp;quot;Strom an!&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 while taste_2 == 0:&lt;br /&gt;
   pfio.digital_write(2,1)&lt;br /&gt;
   sleep(intervall_a)&lt;br /&gt;
   pfio.digital_write(2,0)&lt;br /&gt;
   sleep(intervall_b)&lt;br /&gt;
   taste_2=pfio.digital_read(2)&lt;br /&gt;
 &lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Strom aus!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
b. Falls beim Ausprobieren von Script-Änderungen mal was schief geht, kann das Script stets auch mit der Tastenkombination (CNTRL-C) gestoppt werden. U.U. muss dann noch zusätzlich Relais 1 und/oder 2 via Emulator zurückgesetzt werden.&lt;br /&gt;
&lt;br /&gt;
c. Beim Verändern des Scripts fällt bald auf, dass die bisherige Programmsteuerung keine direkte Möglichkeit vorsieht, auf Ereignisse zu reagieren. Immerhin wird ein mechanisches Gerät gesteuert, bei dem mit Ausfällen, Fertigungstoleranzen, Umwelteinflüssen o.Ä. zu rechnen ist (im Script wird dies bislang &#039;nur&#039; durch die Abbruchbedingung Taste 2 berücksichtigt).&lt;br /&gt;
&lt;br /&gt;
== Einfache Sensor-Signale als steuernde Elemente eines Programms ==&lt;br /&gt;
&lt;br /&gt;
a. Eine wichtige Anwendung von D/A-Steuerungen ist die mögliche Reaktion dieser Steuerung auf &#039;äußere&#039; Ereignisse, die z.B. mit Hilfe von Sensoren leistbar ist.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Einf_Sens.jpg|thumb|right|250px|einfacher Sensor]]b. Für unsere Zwecke genügt zunächst ein sehr einfacher Sensor, der ein 0- oder 1-Signal liefert und idealerweise direkt am &#039;Input Pin 1&#039; des PiFace angeschlossen werden kann. So liegt beim Input Pin 1 das Signal &#039;1&#039; an, wenn eine Verbindung zu &#039;Input GND&#039; besteht.&lt;br /&gt;
Z.B. können 2 unisolierte Drähte so plaziert werden, dass ein vorbeifahrendes Fahrzeug einen von ihnen genügend bewegt um den Kontakt kurze Zeit zu öffnen. Genau dann liefert dieser &#039;Sensor&#039; das Signal &#039;0&#039;. Eine - die Schwerkraft nutzende - mögliche Bauform ist rechts abgebildet ;-)&lt;br /&gt;
&lt;br /&gt;
c. Natürlich werden zusätzlich 2 isolierte Drähte benötigt, um jeden der beiden offenen Drähte geschützt mit Input Pin 1 und Input GND zu verbinden.&lt;br /&gt;
&lt;br /&gt;
d. Bei jeder Durchfahrt liefert der Sensor nun ein &#039;0&#039;-Signal, was im Script sowohl für eine Zeitmessung als auch für ein &#039;Schaltintervall-Array&#039; genutzt werden kann. Dort können abwechselnd für beide Spannungen Zeiten (die in etwa zum jeweiligen Streckenabschnitt passt) &#039;programmiert&#039; werden. Statt Taste 1 wird nun der Sensor ausgewertet (wobei Taste 1 als Sensor-Ersatz insoweit genutzt werden kann, dass sie gedrückt bleiben bzw. kurz losgelassen werden muss). Zur genaueren Zeitmessung wird noch das modul &#039;clock&#039; benötigt. &amp;quot;&amp;lt;tt&amp;gt;wandler3.py&amp;lt;/tt&amp;gt;&amp;quot; könnte also so aussehen:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler3.py&lt;br /&gt;
 &lt;br /&gt;
 from time import clock&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
 sensor_1=1&lt;br /&gt;
 sensor_2=0&lt;br /&gt;
 rundenzahl=0&lt;br /&gt;
 v_wechsel=0&lt;br /&gt;
 vorrunde=0&lt;br /&gt;
 index_zaehler=1&lt;br /&gt;
 &lt;br /&gt;
 zeit_array=[0,0.2,0.4,0.2,0.4,0.2,0.4,0.2,5,0.2,6]&lt;br /&gt;
 # dieses array enthält die sek. bis zum Spannungswechsel&lt;br /&gt;
&lt;br /&gt;
 array_laenge=9&lt;br /&gt;
 # legt fest, wie viel Werte des arrays genutzt werden sollen&lt;br /&gt;
 &lt;br /&gt;
 sensor_aus=1.3&lt;br /&gt;
 # bis der Sensor sicher in die Ruhestellung kippt, wird er nicht ausgelesen&lt;br /&gt;
  &lt;br /&gt;
 pfio.init()&lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
&lt;br /&gt;
 # das Fahrzeug wird langsam zum Start (=Sensor) bewegt&lt;br /&gt;
 while sensor_1 == 1 :&lt;br /&gt;
   sensor_1=pfio.digital_read(1)&lt;br /&gt;
  &lt;br /&gt;
 print &amp;quot;fliegender Start... zum Beenden Taste 2 drücken&amp;quot;&lt;br /&gt;
 print &amp;quot;Runde Nr., Ges.Zeit, Rundenzeit, mittlere Rundenzeit&amp;quot;&lt;br /&gt;
 start_zeit=clock()&lt;br /&gt;
 runden_start=start_zeit&lt;br /&gt;
  &lt;br /&gt;
 while sensor_2 == 0 :&lt;br /&gt;
   sensor_2=pfio.digital_read(2)&lt;br /&gt;
   v_wechsel=1-v_wechsel&lt;br /&gt;
   pfio.digital_write(2,v_wechsel)&lt;br /&gt;
   sensor_zeit=clock()&lt;br /&gt;
  &lt;br /&gt;
   while zeit_array[index_zaehler]+sensor_zeit &amp;gt; clock() :&lt;br /&gt;
     if runden_start+sensor_aus &amp;lt; clock() :&lt;br /&gt;
 &lt;br /&gt;
       sensor_1=pfio.digital_read(1) &lt;br /&gt;
       if sensor_1 == 0 :&lt;br /&gt;
         rundenzahl=rundenzahl+1&lt;br /&gt;
         runden_start=clock()&lt;br /&gt;
         zeit=runden_start-start_zeit&lt;br /&gt;
         print rundenzahl, zeit, zeit-vorrunde, zeit/rundenzahl&lt;br /&gt;
         vorrunde=zeit&lt;br /&gt;
         sensor_zeit=0&lt;br /&gt;
         index_zaehler=0&lt;br /&gt;
         v_wechsel=0&lt;br /&gt;
  &lt;br /&gt;
   index_zaehler=index_zaehler+1&lt;br /&gt;
   if index_zaehler &amp;gt; array_laenge :&lt;br /&gt;
     sensor_2=1&lt;br /&gt;
     print &amp;quot;array-Ende erreicht!&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Outp 1 &amp;amp; 2 auf 0!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wird das Array-Ende erreicht, wurden entweder zu wenige Einträge vorgesehen oder es befindet sich kein Fahrzeug (mehr) auf der Strecke, das den Sensor und damit des Zurücksetzen des Arrays auslösen konnte.&lt;br /&gt;
&lt;br /&gt;
e. Das Array ist an die jeweilige Strecke anzupassen, wobei der vorderste Eintrag ungenutzt bleibt und dann mit der Dauer für maximale Spannung begonnen wird. Solange man mit Relais arbeitet, sollten die Schaltzeiten nicht zu kurz sein (&amp;gt;0.1 sek), da diese eine gewisse mechanische Trägheit besitzen.&lt;br /&gt;
&lt;br /&gt;
f. Eben diese mechanische Beschaffenheit der Relais (Verschleiß) ist auch ein guter Grund, auf &#039;volle&#039; digitale Signalumwandlung umzustellen.&lt;br /&gt;
&lt;br /&gt;
= Optokoppler als Ersatz für Relais =&lt;br /&gt;
&lt;br /&gt;
Ähnlich wie ein Relais dient ein [[Optokoppler]] dazu, eine Signalübertragung zwischen zwei getrennten Stromkreisen zu ermöglichen. Hier liegt der Einsatz von Optokopplern nahe, da sie schneller schalten und keine beweglichen Teile besitzen. Für unsere Zwecke benötigen wir nun als zusätzliche Elemente: Optokoppler (CNY 17-4), npn-[[Transistor]]en (BC 337-40) zur Signalverstärkung sowie einige Widerstände im Bereich von 2k und 400 Ohm. &lt;br /&gt;
&lt;br /&gt;
== Kaskadierung von Transistoren zur Signalverstärkung ==&lt;br /&gt;
&lt;br /&gt;
[[Bild:PiF_CNY_BC_1.png|thumb|right|450px|Optokoppler mit Transistor]]a. Entsprechend Schritt 2.4.d. (ein Relais bei 50 Ohm) wird zunächst ein Optokoppler eingesetzt, dessen Signal durch einen Transistor verstärkt wird, um die &#039;Grundspannung&#039; zu schalten (Pin 3 und 6 beim Optokoppler sollten unbeschaltet bleiben, allein der &#039;Lichtstrom&#039; reicht für eine Durchschaltung aus).&lt;br /&gt;
&lt;br /&gt;
b. Da immer mit einer gewissen Toleranz bei allen Komponenten zu rechnen ist, kann es sein, dass u.U. die Widerstände etwas größer oder kleiner gewählt werden müssen. Beim Ausprobieren sollte man hier in 10% Schritten variieren.&lt;br /&gt;
&lt;br /&gt;
c. Bei Austesten mit Emulator oder Script ist auch zu beachten, dass nun &#039;Output Pin 8&#039; genutzt wird, da dieser nicht mit den Relais verschaltet ist.&lt;br /&gt;
&lt;br /&gt;
== Umsetzung von 3 Schaltstufen mit Optokopplern ==&lt;br /&gt;
&lt;br /&gt;
[[Bild:SmPiFu2ou2T.png|thumb|right|450px|Kombination von 2 Optokopplern]]a. Entsprechend dem Vorgehen beim Relais kann nun auch der kleine Widerstand zusätzlich beschaltet werden um seine gesteuerte Überbrückung zu ermöglichen. Da hier eine relativ geringe Spannung aufgeschaltet wird, kann zusätzlich eine Diode eingesetzt werden, die die Schaltstufe &#039;maximale Spannung&#039; anzeigt.&lt;br /&gt;
&lt;br /&gt;
b. Vor dem Testen ist wieder zu beachten, dass nun zusätzlich &#039;Output Pin 7&#039; genutzt wird (statt Output Pin 2).&lt;br /&gt;
&lt;br /&gt;
c. Eine mögliche Realisierung sieht so aus:...&lt;br /&gt;
&lt;br /&gt;
== Zusätzliche Erhöhung der Schaltstufen bei D/A-Wandlern ==&lt;br /&gt;
&lt;br /&gt;
[[Bild:Sm3ou3t2.png|thumb|right|450px|Erhöhung der Schaltstufen]]a. Zwar benötigen wir in unserem speziellen Beispiel eine &#039;Grundspannung&#039;, die sich dahingehend auswirkt, dass - wie unter 3.1.c. erwähnt - eine Signalkombination nicht ausgewertet wird, aber mit jeder weiteren Schaltstufe würde sich dieses Problem (theoretisch relativieren), da bei geschickter Auswahl der Widerstände (z.B. im Verhältnis 1 zu 2) jeweils eine Verdoppelung der Kombinationsmöglichkeiten erreichbar ist.&lt;br /&gt;
&lt;br /&gt;
b. Wird hier der 50 Ohm Widerstand asymmetrisch geteilt (z.B. 15 + 35 Ohm, s.a. [[Spannungsteiler]]) um dort ein weiteres Signal umsetzen zu können, ergeben sich direkt folgende 5 Schaltstufen (aus, 50, 35, 15 und 0 Ohm) u.s.w.&lt;br /&gt;
&lt;br /&gt;
c. Zur Ansteuerung dieser Schaltstufen ist das Script so zu ändern, dass nun zwischen mehr als 2 Stufen gewechselt werden kann und im Array entsprechende Zusatzdaten vorgegeben und ausgelesen werden. Mehr als diese Stufen sind im konkreten Fall aber nicht sinnvoll, da die entstehende Verlustleistung in der Schaltung die maximal verfügbare Leistung reduziert.&lt;br /&gt;
&lt;br /&gt;
= Weiterführende Ideen =&lt;br /&gt;
&lt;br /&gt;
== Hardwareseitige Ausbauvarianten ==&lt;br /&gt;
&lt;br /&gt;
Dem Ausbau dieses Ansatzes sind kaum Grenzen gesetzt:&lt;br /&gt;
&lt;br /&gt;
- beispielhafte Umsetzung einer differenzierten Abstufung mittels mittels einer logarithmischen Einteilung oder eines möglichst oft durch 2 teilbaren Anfangswertes und der Teiler (640 Ohm, 320, 160...);&lt;br /&gt;
&lt;br /&gt;
- Nachbau des Projekts mit einem Microcontroller (ggf. mit LCD-Anzeige);&lt;br /&gt;
&lt;br /&gt;
- Umbau der Steuerung mit dem Ziel, sie direkt an die GPIO-Pins des RPi anzuschließen;&lt;br /&gt;
&lt;br /&gt;
- Ergänzung um eine Sensorik, die in diesem Beispiel eine Rückmeldung liefert, ob ein Verbraucher aktiv ist oder nicht (Fahrzeug noch auf der Strecke?);&lt;br /&gt;
&lt;br /&gt;
- Einsatz anderer Sensortechniken und/oder mehrerer Sensoren zur Optimierung der Schnelligkeit oder parallelen Steuerung eines 2. Fahrzeuges;&lt;br /&gt;
&lt;br /&gt;
== Softwareseitige Ausbauvarianten ==&lt;br /&gt;
&lt;br /&gt;
- Optimierung des Scripts, indem die Sensor-Abfrage über einen &#039;Listener&#039; umgesetzt wird;&lt;br /&gt;
&lt;br /&gt;
- Erweiterung des Scripts um eine GUI mit Hilfe der python-lib Tkinter, um einen Nutzerzugriff auf das Steuerarray und/oder eine &#039;Verwaltung&#039; mehrerer Fahrzeuge;&lt;br /&gt;
&lt;br /&gt;
- Einbindung eines Web-Interface um eine &#039;Fernsteuerung&#039; zu ermöglichen...&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [http://hackaday.com/2013/01/23/replacement-controllers-for-slot-car-racing/ ähnliches Projekt bei &#039;hackaday&#039;] &lt;br /&gt;
* [https://docs.google.com/folder/d/0B-UAZ9CyJCLGQjJ3RDlqa2pqaDg/edit?pli=1&amp;amp;docId=0B-UAZ9CyJCLGNmpMeVpyYlZJUWc Relaisschaltung mit pädagogischer Erweiterung d. Universität Manchester]&lt;br /&gt;
* [http://elinux.org/RPi_Projects/PiFace_controlling_a_slot-car parallele englischsp. Dokumentation dieses Projekts mit anderem Schwerpunkt] &lt;br /&gt;
* [http://elinux.org/RPi_Projects englischsp. Projektliste zum RPi]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Raspberry Pi]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Mknot9</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=RPi_als_D/A-Wandler&amp;diff=74082</id>
		<title>RPi als D/A-Wandler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=RPi_als_D/A-Wandler&amp;diff=74082"/>
		<updated>2013-03-07T16:31:10Z</updated>

		<summary type="html">&lt;p&gt;Mknot9: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von mknot9&#039;&#039; (in Arbeit)&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
Oft wird ein Computer &#039;nur&#039; genutzt um darauf Software ablaufen zu lassen. Deren Möglichkeit zur Steuerung von elektrischen und mechanischen Geräten werden dabei leicht übersehen.&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel richtet sich daher an Einsteiger, die mit dem [[Raspberry Pi]] (&#039;RPi&#039;) Grundlagen der Computersteuerung von Relais und Spannungsteilern nachvollziehen möchten. Es wird schrittweise dargestellt, wie mittels eines D/A-Wandlers (Digital/Analog-Wandler = Umwandlung von digitalen 1/0 Signale) die Steuerung einer stufenweise veränderbaren Ausgangsspannung nachgebaut werden kann.&lt;br /&gt;
&lt;br /&gt;
= Verwendete Hardware =&lt;br /&gt;
&lt;br /&gt;
== RPi in Kombination mit der &#039;PiFace&#039;-Karte als Bastelplattform ==&lt;br /&gt;
&lt;br /&gt;
Dank der einfachen Bauweise bietet sich der RPi mit seinen frei zugänglichen GPIO-Pins als ideale Bastelplattform an. Trotzdem kann es beim Experimentieren mit Schaltungen öfters zu kleinen Fehlern kommen, die schlimmstenfalls die empfindliche Elektronik des RPi dauerhaft beschädigen können.&lt;br /&gt;
&lt;br /&gt;
Daher wird bei diesem Projekt zusätzlich mit der &#039;[http://elinux.org/RPi_Expansion_Boards#Piface|PiFace]&#039;-Karte gearbeitet, die man auf die GPIO-Pins stecken kann. Diese Erweiterungskarte verschaltet die GPIO-Pins auf je 8 digitale Ein- und Ausgänge, sowie 2 Relais, die eine galvanische Trennung von Stromkreisen ermöglichen. Damit besteht auch für Einsteiger ein gewisser Schutz für die Steuerelektronik des RPi.&lt;br /&gt;
&lt;br /&gt;
Auch im weiteren Verlauf dieser Einführung soll noch auf eine Trennung der Stromkreise Wert gelegt werden, so dass für erste digitale Schaltexperimente ein Optokoppler genutzt wird. Die spätere Nutzung der &#039;Input Pins&#039; des PiFace um eine Steuerung der D/A-Wandlung durch bestimmte Ereignisse zu ermöglichen, erfolgt ebenfalls passiv.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Auch wenn mit vermeindlich &#039;sicheren&#039; Transformatoren gebastelt wird, muss stets bedacht werden, dass diese an einem 230V-Stromnetz betrieben werden und man eher einmal mehr als weniger prüfen sollte, ob man durch eventuelle Fehler mit lebensgefährlicher Spannung in Berührung kommt!&lt;br /&gt;
&lt;br /&gt;
== Auswahl eines Beispielprojektes ==&lt;br /&gt;
&lt;br /&gt;
Günstige Möglichkeiten ein Gerät zu finden, das mit analogen Spannungen arbeitet, bieten sich u.a. im Spielzeugbereich. Im Grunde eignet sich alles, was mit Batterien oder mit Gleichspannungen unter 24 V betrieben wird.&lt;br /&gt;
&lt;br /&gt;
Da jedoch ein Ziel das Steuern von analogen Spannungen ist, bietet sich insbesondere alles an, bei dem [[Potentiometer]] eingesetzt werden. Einen dieser &#039;Handregler&#039; sollte man übrig haben, da er von seinem Anschlusskabel abgetrennt werden muss, um den oft proprietären Steckanschluss nutzen zu können. In diesem Sinne wird hier eine handelsübliche Spielzeug-Autorennbahn mit Potentiometer-Handreglern genutzt.&lt;br /&gt;
&lt;br /&gt;
== Sonstige Bauteile ==&lt;br /&gt;
&lt;br /&gt;
Für die ersten Grundlagen (s. Teile 2 &amp;amp; 3) genügen bereits rund 2 m isolierter Draht, der nicht aus verdrillten feinen Adern (Litze) bestehen sollte, 50 cm nicht-isolierter Draht, einige niederohmige Widerstände (z.B. je 2 mal 100 Ohm, 80, 60, sowie 20) und ein &#039;Experimentierbrett&#039; (engl. [[Breadboard]]).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Grundlagen und Vorbereitung des Projekts =&lt;br /&gt;
&lt;br /&gt;
== Umwandlung von 1/0 zu Ein/Aus mit einem Relais ==&lt;br /&gt;
&lt;br /&gt;
Vom Prinzip her ist jede Umwandlung eines digitalen 0 oder 1 Signals (das über eine bestimmte Spannungsdifferenz festgelegt ist) in eine (nutzbare) Spannung bereits eine D/A-Wandlung. Dies wird schlicht so realisiert, dass mit einer Eingabe am RPi die Nutzspannung des &#039;Verbrauchers&#039; zunächst einfach an- und ausgeschaltet wird.&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung der zu steuernden Hardware ==&lt;br /&gt;
&lt;br /&gt;
a. Um Fehlerquellen auszuschliessen sollte zunächst (und ggf. auch später!) kurz getestet werden, ob der vorhandene Regler wie erwartet funktioniert.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pif_Con9.jpg|thumb|right|400px|Fixierung der Reglerkabel]]&lt;br /&gt;
b. Nach dem Trennen des Reglers von der Einspeisung (und ggf. Ziehen des Netzsteckers) muss das Regler-Kabel abgeschnitten werden (eher nahe beim Regler, da das Kabel bald bis zum Breadboard reichen soll). Die neuen Enden des Einspeiseteils werden abisoliert und auf dem Breadboard diagonal zueinander mit einigen Spalten Abstand fixiert. Auch können bereits die Drähte, die später zum RPi führen, jeweils in den passenden kontaktführenden Spalten eingesteckt werden, z. B. wie rechts zu sehen (die nicht beschrifteten Drähte können vorerst ignoriert werden):&lt;br /&gt;
&lt;br /&gt;
c. Nun bietet sich eine gute Gelegenheit die maximale Spannung am Nutzgerät zu messen. Man verbindet das Regler-Kabel (nun ohne Regler) wieder mit der Einspeisung und die offenen Enden der Drähte mit dem Messgerät, bei dem zunächst ein Messbereich von ca. 10-50 Volt gewählt werden sollte. Dies sollte dann z.B. 14,8 V anzeigen. Natürlich können auch die beiden offenen Enden einen kleinen Moment kurz geschlossen werden, man sollte aber bedenken, dass das zu regelnde Nutzgerät dann die maximal vorgesehene Spannung erhält (hier: maximales Tempo).&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung des RPi ==&lt;br /&gt;
&lt;br /&gt;
Es wird davon ausgegangen, dass entsprechend des zugehörigen &#039;manual&#039; das PiFace bereits auf den RPi gesteckt ist, die nötigen python-Bilbliotheken installiert sind und man sich im Terminal-Arbeitsverzeichnis &#039;pi&#039; befindet.&lt;br /&gt;
&lt;br /&gt;
a. Zunächst wird der PiFace-Emulator (im Terminal direkt aus dem Arbeitsverzeichnis) gestartet: &amp;lt;tt&amp;gt;piface/scripts/piface-emulator&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b. Wenn alles richtig installiert wurde, erscheint ein Fenster (unten links), bei dem die vorerst wichtigen blauen Signale am rechten Rand wie folgt angezeigt werden sollten: &lt;br /&gt;
 &lt;br /&gt;
[[Datei:RPi_PiF_em-scs.jpg|400px|Piface-Emulator im default-Zustand]] [[Datei:RPi_PiF_em_scs1.jpg|400px|Piface-Relais 1 auf &#039;1&#039; geschaltet]]&lt;br /&gt;
&lt;br /&gt;
c. Das rechte Fenster ergibt sich, wenn man nun im Fenster auf &amp;quot;Override Enable&amp;quot; und dann &amp;quot;Output Pin 1&amp;quot; klickt. Es müsste ein &amp;quot;Klack&amp;quot; vom Relais 1 zu hören sein sowie der Schaltzustand des unteren Relais 1 (das an den Output Pin 1 gekoppelt ist) auf die Verbindung der beiden unteren Anschlüsse wechseln. Zugleich wird das erste LED-Icon beim Output Pin 1 rot sowie das zugehörige LED-Icon blau.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pif_rel2.png|thumb|right|250px|Schema der Piface-Relais]]&lt;br /&gt;
d. Rechts ist der Schaltzustand der Relais, die zu Beginn genutzt werden, im Grundzustand dargestellt (jeweils der mittlere und obere Kontakt sind kurzgeschlossen, der jeweils untere Kontakt ist frei):&lt;br /&gt;
&lt;br /&gt;
e. Ein weiterer Klick auf &amp;quot;Output Pin 1&amp;quot; versetzt das Relais in den Ausgangszustand, der vor dem nächsten Schritt wieder eingestellt werden sollte.&lt;br /&gt;
&lt;br /&gt;
f. Das Relais läßt sich auch mittel eines Python-Scripts vom RPi aus ansteuern. Dazu wird folgende Textdatei &amp;quot;wandler.py&amp;quot; im Arbeitsverzeichnis abgespeichert und mit dem Befehl &amp;quot;&amp;lt;tt&amp;gt;python wandler.py&amp;lt;/tt&amp;gt;&amp;quot; gestartet:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler.py&lt;br /&gt;
&lt;br /&gt;
 from time import sleep&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
&lt;br /&gt;
 pfio.init()&lt;br /&gt;
&lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
 print &amp;quot;Strom an&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 sleep(2)&lt;br /&gt;
&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Strom aus&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Nach dem Absetzen des Befehls wechselt nun das blaue Signal an Relais 1 für 2 Sekunden und das Relais klackt entsprechend.&lt;br /&gt;
&lt;br /&gt;
== Einsatz eines Relais&#039; zur Umsetzung von Spannungsänderungen ==&lt;br /&gt;
&lt;br /&gt;
a. Ist das Relais wieder im Ausgangszustand, befestigt man nun einen der vom Breadboard führenden Drähte am unteren und einen am mittleren Relaiseingang (im Moment ist die Polarität noch egal). Zunächst sollte nichts passieren (das Relais hält diesen ja Stromkreis noch offen).&lt;br /&gt;
&lt;br /&gt;
b. Startet man aber das Script wieder (&amp;lt;tt&amp;gt;python wandler.py&amp;lt;/tt&amp;gt;) oder klickt auf &#039;Output Pin 1&#039; wird der Nutzstromkreis geschlossen. Nochmals aufgepasst: unser Nutzer erhält wieder die maximal vorgesehene Spannung - also besser vorher im Script &amp;quot;&amp;lt;tt&amp;gt;sleep(0.3)&amp;lt;/tt&amp;gt;&amp;quot; setzen und speichern.&lt;br /&gt;
&lt;br /&gt;
c. Im Prinzip ist damit die programmgesteuerte Umsetzung eines 0/1 Signals in z.B. eine 0V/15V Spannung erreicht.&lt;br /&gt;
&lt;br /&gt;
d. Da wir bald verschiedene Steuerspannungen schalten wollen, geht es jetzt darum herauszufinden, bei welcher Spannung unser Nutzgerät gerade noch bewegt wird. Dies probiert man aus - mit dem kleinsten Widerstand beginnend: indem einer der Drähte in eine freie Breadboardspalte gesteckt wird und aus dieser Spalte der Widerstand zu dem &#039;alten&#039; Steckplatz des Drahtes geführt wird. Nun startet man jeweils das Script bis der Widerstand so hoch ist, dass die Anlaufspannung beim Nutzgerätes gut ausreicht, eine Reaktion des Nutzgerät (Fahrzeug bewegt sich) zu bewirken (z.B. bei 50 Ohm beträgt der Strom ca. 130 mA während ohne 190 mA fliessen).&lt;br /&gt;
&lt;br /&gt;
= Ansteuerung von 3 Schaltstufen =&lt;br /&gt;
&lt;br /&gt;
== Kombination von 2 Relais ==&lt;br /&gt;
&lt;br /&gt;
[[Bild:ZrelMww2.png|thumb|right|250px|Beschaltung der Relais]] a. Die einfachste Stufe der weiteren Verschaltung erreicht man, indem der Widerstand mit einem 2. Relais überbrückt wird. Relais 1 kann dann als &#039;Hauptschalter&#039;, Relais 2 als Spannungsumschalter genutzt werden:&lt;br /&gt;
&lt;br /&gt;
b. Diese Beschaltung kann sogleich mit dem PiFace-Emulator ausprobiert werden. Damit können wir bereits 3 Schaltstufen steuern: keine, verminderte und volle Spannung.&lt;br /&gt;
&lt;br /&gt;
c. Theoretisch liesse sich auch noch eine 4. Spannungsstufe erzeugen, da mit 2 &#039;Bits&#039; (Ein/Aus bei 2 Relais) bereits 4 verschiedene Signale darstellbar sind. Beim jetzigen Aufbau werden aber lediglich die (pin1,pin2)-Signale (0,0), (1,0) und (1,1) &#039;genutzt&#039;, da Relais 1 als Hauptschalter vorgesehen ist und die Kombination (0,1) so nicht ausgewertet wird.&lt;br /&gt;
&lt;br /&gt;
== Programmgesteuerte Schaltung von 2 Relais ==&lt;br /&gt;
&lt;br /&gt;
a. Mit einem veränderten python-Script &amp;quot;wandler2.py&amp;quot; ist auch die programmgesteuerte Schaltung möglich. Dabei werden direkt zusätzlich die Tasten 1 und 2 des PiFace genutzt, um nach dem Start des Scripts (&amp;lt;tt&amp;gt;python wandler2.py&amp;lt;/tt&amp;gt;) den Hauptschalter (Relais 1) zu steuern:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler2.py&lt;br /&gt;
 &lt;br /&gt;
 from time import sleep&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
 pfio.init()&lt;br /&gt;
 &lt;br /&gt;
 taste_1=0&lt;br /&gt;
 taste_2=0&lt;br /&gt;
 intervall_a=0.1&lt;br /&gt;
 intervall_b=0.5&lt;br /&gt;
 # Die Intervalle bestimmen die Schaltzeit für volle/verminderte Spannung&lt;br /&gt;
 &lt;br /&gt;
 print &amp;quot;Zum Start Taste 1 drücken, zum Stoppen Taste 2&amp;quot;&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 while taste_1 == 0:&lt;br /&gt;
   sleep(intervall_a)&lt;br /&gt;
   taste_1=pfio.digital_read(1)&lt;br /&gt;
&lt;br /&gt;
 # Der o.g. &#039;sleep&#039;-Befehl bestimmt die Abfragepausen für Taste 1&lt;br /&gt;
 &lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
 print &amp;quot;Strom an!&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 while taste_2 == 0:&lt;br /&gt;
   pfio.digital_write(2,1)&lt;br /&gt;
   sleep(intervall_a)&lt;br /&gt;
   pfio.digital_write(2,0)&lt;br /&gt;
   sleep(intervall_b)&lt;br /&gt;
   taste_2=pfio.digital_read(2)&lt;br /&gt;
 &lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Strom aus!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
b. Falls beim Ausprobieren von Script-Änderungen mal was schief geht, kann das Script stets auch mit der Tastenkombination (CNTRL-C) gestoppt werden. U.U. muss dann noch zusätzlich Relais 1 und/oder 2 via Emulator zurückgesetzt werden.&lt;br /&gt;
&lt;br /&gt;
c. Beim Verändern des Scripts fällt bald auf, dass die bisherige Programmsteuerung keine direkte Möglichkeit vorsieht, auf Ereignisse zu reagieren. Immerhin wird ein mechanisches Gerät gesteuert, bei dem mit Ausfällen, Fertigungstoleranzen, Umwelteinflüssen o.Ä. zu rechnen ist (im Script wird dies bislang &#039;nur&#039; durch die Abbruchbedingung Taste 2 berücksichtigt).&lt;br /&gt;
&lt;br /&gt;
== Einfache Sensor-Signale als steuernde Elemente eines Programms ==&lt;br /&gt;
&lt;br /&gt;
a. Eine wichtige Anwendung von D/A-Steuerungen ist die mögliche Reaktion dieser Steuerung auf &#039;äußere&#039; Ereignisse, die z.B. mit Hilfe von Sensoren leistbar ist.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Einf_Sens.jpg|thumb|right|250px|einfacher Sensor]]b. Für unsere Zwecke genügt zunächst ein sehr einfacher Sensor, der ein 0- oder 1-Signal liefert und idealerweise direkt am &#039;Input Pin 1&#039; des PiFace angeschlossen werden kann. So liegt beim Input Pin 1 das Signal &#039;1&#039; an, wenn eine Verbindung zu &#039;Input GND&#039; besteht.&lt;br /&gt;
Z.B. können 2 unisolierte Drähte so plaziert werden, dass ein vorbeifahrendes Fahrzeug einen von ihnen genügend bewegt um den Kontakt kurze Zeit zu öffnen. Genau dann liefert dieser &#039;Sensor&#039; das Signal &#039;0&#039;. Eine - die Schwerkraft nutzende - mögliche Bauform ist rechts abgebildet ;-)&lt;br /&gt;
&lt;br /&gt;
c. Natürlich werden zusätzlich 2 isolierte Drähte benötigt, um jeden der beiden offenen Drähte geschützt mit Input Pin 1 und Input GND zu verbinden.&lt;br /&gt;
&lt;br /&gt;
d. Bei jeder Durchfahrt liefert der Sensor nun ein &#039;0&#039;-Signal, was im Script sowohl für eine Zeitmessung als auch für ein &#039;Schaltintervall-Array&#039; genutzt werden kann. Dort können abwechselnd für beide Spannungen Zeiten (die in etwa zum jeweiligen Streckenabschnitt passt) &#039;programmiert&#039; werden. Statt Taste 1 wird nun der Sensor ausgewertet (wobei Taste 1 als Sensor-Ersatz insoweit genutzt werden kann, dass sie gedrückt bleiben bzw. kurz losgelassen werden muss). Zur genaueren Zeitmessung wird noch das modul &#039;clock&#039; benötigt. &amp;quot;&amp;lt;tt&amp;gt;wandler3.py&amp;lt;/tt&amp;gt;&amp;quot; könnte also so aussehen:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler3.py&lt;br /&gt;
 &lt;br /&gt;
 from time import clock&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
 sensor_1=1&lt;br /&gt;
 sensor_2=0&lt;br /&gt;
 rundenzahl=0&lt;br /&gt;
 v_wechsel=0&lt;br /&gt;
 vorrunde=0&lt;br /&gt;
 index_zaehler=1&lt;br /&gt;
 &lt;br /&gt;
 zeit_array=[0,0.2,0.4,0.2,0.4,0.2,0.4,0.2,5,0.2,6]&lt;br /&gt;
 # dieses array enthält die sek. bis zum Spannungswechsel&lt;br /&gt;
&lt;br /&gt;
 array_laenge=9&lt;br /&gt;
 # legt fest, wie viel Werte des arrays genutzt werden sollen&lt;br /&gt;
 &lt;br /&gt;
 sensor_aus=1.3&lt;br /&gt;
 # bis der Sensor sicher in die Ruhestellung kippt, wird er nicht ausgelesen&lt;br /&gt;
  &lt;br /&gt;
 pfio.init()&lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
&lt;br /&gt;
 # das Fahrzeug wird langsam zum Start (=Sensor) bewegt&lt;br /&gt;
 while sensor_1 == 1 :&lt;br /&gt;
   sensor_1=pfio.digital_read(1)&lt;br /&gt;
  &lt;br /&gt;
 print &amp;quot;fliegender Start... zum Beenden Taste 2 drücken&amp;quot;&lt;br /&gt;
 print &amp;quot;Runde Nr., Ges.Zeit, Rundenzeit, mittlere Rundenzeit&amp;quot;&lt;br /&gt;
 start_zeit=clock()&lt;br /&gt;
 runden_start=start_zeit&lt;br /&gt;
  &lt;br /&gt;
 while sensor_2 == 0 :&lt;br /&gt;
   sensor_2=pfio.digital_read(2)&lt;br /&gt;
   v_wechsel=1-v_wechsel&lt;br /&gt;
   pfio.digital_write(2,v_wechsel)&lt;br /&gt;
   sensor_zeit=clock()&lt;br /&gt;
  &lt;br /&gt;
   while zeit_array[index_zaehler]+sensor_zeit &amp;gt; clock() :&lt;br /&gt;
     if runden_start+sensor_aus &amp;lt; clock() :&lt;br /&gt;
 &lt;br /&gt;
       sensor_1=pfio.digital_read(1) &lt;br /&gt;
       if sensor_1 == 0 :&lt;br /&gt;
         rundenzahl=rundenzahl+1&lt;br /&gt;
         runden_start=clock()&lt;br /&gt;
         zeit=runden_start-start_zeit&lt;br /&gt;
         print rundenzahl, zeit, zeit-vorrunde, zeit/rundenzahl&lt;br /&gt;
         vorrunde=zeit&lt;br /&gt;
         sensor_zeit=0&lt;br /&gt;
         index_zaehler=0&lt;br /&gt;
         v_wechsel=0&lt;br /&gt;
  &lt;br /&gt;
   index_zaehler=index_zaehler+1&lt;br /&gt;
   if index_zaehler &amp;gt; array_laenge :&lt;br /&gt;
     sensor_2=1&lt;br /&gt;
     print &amp;quot;array-Ende erreicht!&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Outp 1 &amp;amp; 2 auf 0!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wird das Array-Ende erreicht, wurden entweder zu wenige Einträge vorgesehen oder es befindet sich kein Fahrzeug (mehr) auf der Strecke, das den Sensor und damit des Zurücksetzen des Arrays auslösen konnte.&lt;br /&gt;
&lt;br /&gt;
e. Das Array ist an die jeweilige Strecke anzupassen, wobei der vorderste Eintrag ungenutzt bleibt und dann mit der Dauer für maximale Spannung begonnen wird. Solange man mit Relais arbeitet, sollten die Schaltzeiten nicht zu kurz sein (&amp;gt;0.1 sek), da diese eine gewisse mechanische Trägheit besitzen.&lt;br /&gt;
&lt;br /&gt;
f. Eben diese mechanische Beschaffenheit der Relais (Verschleiß) ist auch ein guter Grund, auf &#039;volle&#039; digitale Signalumwandlung umzustellen.&lt;br /&gt;
&lt;br /&gt;
= Optokoppler als Ersatz für Relais =&lt;br /&gt;
&lt;br /&gt;
Ähnlich wie ein Relais dient ein [[Optokoppler]] dazu, eine Signalübertragung zwischen zwei getrennten Stromkreisen zu ermöglichen. Hier liegt der Einsatz von Optokopplern nahe, da sie schneller schalten und keine beweglichen Teile besitzen. Für unsere Zwecke benötigen wir nun als zusätzliche Elemente: Optokoppler (CNY 17-4), npn-[[Transistor]]en (BC 337-40) zur Signalverstärkung sowie einige Widerstände im Bereich von 2k und 400 Ohm. &lt;br /&gt;
&lt;br /&gt;
== Kaskadierung von Transistoren zur Signalverstärkung ==&lt;br /&gt;
&lt;br /&gt;
[[Bild:PiF_CNY_BC_1.png|thumb|right|450px|Optokoppler mit Transistor]]a. Entsprechend Schritt 2.4.d. (ein Relais bei 50 Ohm) wird zunächst ein Optokoppler eingesetzt, dessen Signal durch einen Transistor verstärkt wird, um die &#039;Grundspannung&#039; zu schalten (Pin 3 und 6 beim Optokoppler sollten unbeschaltet bleiben, allein der &#039;Lichtstrom&#039; reicht für eine Durchschaltung aus).&lt;br /&gt;
&lt;br /&gt;
b. Da immer mit einer gewissen Toleranz bei allen Komponenten zu rechnen ist, kann es sein, dass u.U. die Widerstände etwas größer oder kleiner gewählt werden müssen. Beim Ausprobieren sollte man hier in 10% Schritten variieren.&lt;br /&gt;
&lt;br /&gt;
c. Bei Austesten mit Emulator oder Script ist auch zu beachten, dass nun &#039;Output Pin 8&#039; genutzt wird, da dieser nicht mit den Relais verschaltet ist.&lt;br /&gt;
&lt;br /&gt;
== Umsetzung von 3 Schaltstufen mit Optokopplern ==&lt;br /&gt;
&lt;br /&gt;
[[Bild:SmPiFu2ou2T.png|thumb|right|450px|Kombination von 2 Optokopplern]]a. Entsprechend dem Vorgehen beim Relais kann nun auch der kleine Widerstand zusätzlich beschaltet werden um seine gesteuerte Überbrückung zu ermöglichen. Da hier eine relativ geringe Spannung aufgeschaltet wird, kann zusätzlich eine Diode eingesetzt werden, die die Schaltstufe &#039;maximale Spannung&#039; anzeigt.&lt;br /&gt;
&lt;br /&gt;
b. Vor dem Testen ist wieder zu beachten, dass nun zusätzlich &#039;Output Pin 7&#039; genutzt wird (statt Output Pin 2).&lt;br /&gt;
&lt;br /&gt;
c. Eine mögliche Realisierung sieht so aus:...&lt;br /&gt;
&lt;br /&gt;
== Zusätzliche Erhöhung der Schaltstufen bei D/A-Wandlern ==&lt;br /&gt;
&lt;br /&gt;
[[Bild:Sm3ou3t2.png|thumb|right|450px|Erhöhung der Schaltstufen]]a. Zwar benötigen wir in unserem speziellen Beispiel eine &#039;Grundspannung&#039;, die sich dahingehend auswirkt, dass - wie unter 3.1.c. erwähnt - eine Signalkombination nicht ausgewertet wird, aber mit jeder weiteren Schaltstufe würde sich dieses Problem (theoretisch relativieren), da bei geschickter Auswahl der Widerstände (z.B. im Verhältnis 1 zu 2) jeweils eine Verdoppelung der Kombinationsmöglichkeiten erreichbar ist.&lt;br /&gt;
&lt;br /&gt;
b. Wird hier der 50 Ohm Widerstand asymmetrisch geteilt (z.B. 15 + 35 Ohm, s.a. [[Spannungsteiler]]) um dort ein weiteres Signal umsetzen zu können, ergeben sich direkt folgende 5 Schaltstufen (aus, 50, 35, 15 und 0 Ohm) u.s.w.&lt;br /&gt;
&lt;br /&gt;
c. Zur Ansteuerung dieser Schaltstufen ist das Script so zu ändern, dass nun zwischen mehr als 2 Stufen gewechselt werden kann und im Array entsprechende Zusatzdaten vorgegeben und ausgelesen werden. Mehr als diese Stufen sind im konkreten Fall aber nicht sinnvoll, da die entstehende Verlustleistung in der Schaltung die maximal verfügbare Leistung reduziert.&lt;br /&gt;
&lt;br /&gt;
= Weiterführende Ideen =&lt;br /&gt;
&lt;br /&gt;
== Hardwareseitige Ausbauvarianten ==&lt;br /&gt;
&lt;br /&gt;
Dem Ausbau dieses Ansatzes sind kaum Grenzen gesetzt:&lt;br /&gt;
&lt;br /&gt;
- beispielhafte Umsetzung einer differenzierten Abstufung mittels mittels einer logarithmischen Einteilung oder eines möglichst oft durch 2 teilbaren Anfangswertes und der Teiler (640 Ohm, 320, 160...);&lt;br /&gt;
&lt;br /&gt;
- Nachbau des Projekts mit einem Microcontroller (ggf. mit LCD-Anzeige);&lt;br /&gt;
&lt;br /&gt;
- Umbau der Steuerung mit dem Ziel, sie direkt an die GPIO-Pins des RPi anzuschließen;&lt;br /&gt;
&lt;br /&gt;
- Ergänzung um eine Sensorik, die in diesem Beispiel eine Rückmeldung liefert, ob ein Verbraucher aktiv ist oder nicht (Fahrzeug noch auf der Strecke?);&lt;br /&gt;
&lt;br /&gt;
- Einsatz anderer Sensortechniken und/oder mehrerer Sensoren zur Optimierung der Schnelligkeit oder parallelen Steuerung eines 2. Fahrzeuges;&lt;br /&gt;
&lt;br /&gt;
== Softwareseitige Ausbauvarianten ==&lt;br /&gt;
&lt;br /&gt;
- Optimierung des Scripts, indem die Sensor-Abfrage über einen &#039;Listener&#039; umgesetzt wird;&lt;br /&gt;
&lt;br /&gt;
- Erweiterung des Scripts um eine GUI mit Hilfe der python-lib Tkinter, um einen Nutzerzugriff auf das Steuerarray und/oder eine &#039;Verwaltung&#039; mehrerer Fahrzeuge;&lt;br /&gt;
&lt;br /&gt;
- Einbindung eines Web-Interface um eine &#039;Fernsteuerung&#039; zu ermöglichen...&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [http://hackaday.com/2013/01/23/replacement-controllers-for-slot-car-racing/ ähnliches Projekt bei &#039;hackaday&#039;] &lt;br /&gt;
* [https://docs.google.com/folder/d/0B-UAZ9CyJCLGQjJ3RDlqa2pqaDg/edit?pli=1&amp;amp;docId=0B-UAZ9CyJCLGNmpMeVpyYlZJUWc Relaisschaltung mit pädagogischer Erweiterung d. Universität Manchester]&lt;br /&gt;
* [http://elinux.org/RPi_Projects/PiFace_controlling_a_slot-car parallele englischsp. Dokumentation dieses Projekts mit anderem Schwerpunkt] &lt;br /&gt;
* [http://elinux.org/RPi_Projects englischsp. Projektliste zum RPi]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Raspberry Pi]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Mknot9</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=RPi_als_D/A-Wandler&amp;diff=74081</id>
		<title>RPi als D/A-Wandler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=RPi_als_D/A-Wandler&amp;diff=74081"/>
		<updated>2013-03-07T16:29:48Z</updated>

		<summary type="html">&lt;p&gt;Mknot9: /* Kombination von 2 Relais */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von mknot9&#039;&#039; (in Arbeit)&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
Oft wird ein Computer &#039;nur&#039; genutzt um darauf Software ablaufen zu lassen. Deren Möglichkeit zur Steuerung von elektrischen und mechanischen Geräten werden dabei leicht übersehen.&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel richtet sich daher an Einsteiger, die mit dem [[Raspberry Pi]] (&#039;RPi&#039;) Grundlagen der Computersteuerung von Relais und Spannungsteilern nachvollziehen möchten. Es wird schrittweise dargestellt, wie mittels eines D/A-Wandlers (Digital/Analog-Wandler = Umwandlung von digitalen 1/0 Signale) die Steuerung einer stufenweise veränderbaren Ausgangsspannung nachgebaut werden kann.&lt;br /&gt;
&lt;br /&gt;
= Verwendete Hardware =&lt;br /&gt;
&lt;br /&gt;
== RPi in Kombination mit der &#039;PiFace&#039;-Karte als Bastelplattform ==&lt;br /&gt;
&lt;br /&gt;
Dank der einfachen Bauweise bietet sich der RPi mit seinen frei zugänglichen GPIO-Pins als ideale Bastelplattform an. Trotzdem kann es beim Experimentieren mit Schaltungen öfters zu kleinen Fehlern kommen, die schlimmstenfalls die empfindliche Elektronik des RPi dauerhaft beschädigen können.&lt;br /&gt;
&lt;br /&gt;
Daher wird bei diesem Projekt zusätzlich mit der &#039;[http://elinux.org/RPi_Expansion_Boards#Piface|PiFace]&#039;-Karte gearbeitet, die man auf die GPIO-Pins stecken kann. Diese Erweiterungskarte verschaltet die GPIO-Pins auf je 8 digitale Ein- und Ausgänge, sowie 2 Relais, die eine galvanische Trennung von Stromkreisen ermöglichen. Damit besteht auch für Einsteiger ein gewisser Schutz für die Steuerelektronik des RPi.&lt;br /&gt;
&lt;br /&gt;
Auch im weiteren Verlauf dieser Einführung soll noch auf eine Trennung der Stromkreise Wert gelegt werden, so dass für erste digitale Schaltexperimente ein Optokoppler genutzt wird. Die spätere Nutzung der &#039;Input Pins&#039; des PiFace um eine Steuerung der D/A-Wandlung durch bestimmte Ereignisse zu ermöglichen, erfolgt ebenfalls passiv.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Auch wenn mit vermeindlich &#039;sicheren&#039; Transformatoren gebastelt wird, muss stets bedacht werden, dass diese an einem 230V-Stromnetz betrieben werden und man eher einmal mehr als weniger prüfen sollte, ob man durch eventuelle Fehler mit lebensgefährlicher Spannung in Berührung kommt!&lt;br /&gt;
&lt;br /&gt;
== Auswahl eines Beispielprojektes ==&lt;br /&gt;
&lt;br /&gt;
Günstige Möglichkeiten ein Gerät zu finden, das mit analogen Spannungen arbeitet, bieten sich u.a. im Spielzeugbereich. Im Grunde eignet sich alles, was mit Batterien oder mit Gleichspannungen unter 24 V betrieben wird.&lt;br /&gt;
&lt;br /&gt;
Da jedoch ein Ziel das Steuern von analogen Spannungen ist, bietet sich insbesondere alles an, bei dem [[Potentiometer]] eingesetzt werden. Einen dieser &#039;Handregler&#039; sollte man übrig haben, da er von seinem Anschlusskabel abgetrennt werden muss, um den oft proprietären Steckanschluss nutzen zu können. In diesem Sinne wird hier eine handelsübliche Spielzeug-Autorennbahn mit Potentiometer-Handreglern genutzt.&lt;br /&gt;
&lt;br /&gt;
== Sonstige Bauteile ==&lt;br /&gt;
&lt;br /&gt;
Für die ersten Grundlagen (s. Teile 2 &amp;amp; 3) genügen bereits rund 2 m isolierter Draht, der nicht aus verdrillten feinen Adern (Litze) bestehen sollte, 50 cm nicht-isolierter Draht, einige niederohmige Widerstände (z.B. je 2 mal 100 Ohm, 80, 60, sowie 20) und ein &#039;Experimentierbrett&#039; (engl. [[Breadboard]]).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Grundlagen und Vorbereitung des Projekts =&lt;br /&gt;
&lt;br /&gt;
== Umwandlung von 1/0 zu Ein/Aus mit einem Relais ==&lt;br /&gt;
&lt;br /&gt;
Vom Prinzip her ist jede Umwandlung eines digitalen 0 oder 1 Signals (das über eine bestimmte Spannungsdifferenz festgelegt ist) in eine (nutzbare) Spannung bereits eine D/A-Wandlung. Dies wird schlicht so realisiert, dass mit einer Eingabe am RPi die Nutzspannung des &#039;Verbrauchers&#039; zunächst einfach an- und ausgeschaltet wird.&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung der zu steuernden Hardware ==&lt;br /&gt;
&lt;br /&gt;
a. Um Fehlerquellen auszuschliessen sollte zunächst (und ggf. auch später!) kurz getestet werden, ob der vorhandene Regler wie erwartet funktioniert.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pif_Con9.jpg|thumb|right|400px|Fixierung der Reglerkabel]]&lt;br /&gt;
b. Nach dem Trennen des Reglers von der Einspeisung (und ggf. Ziehen des Netzsteckers) muss das Regler-Kabel abgeschnitten werden (eher nahe beim Regler, da das Kabel bald bis zum Breadboard reichen soll). Die neuen Enden des Einspeiseteils werden abisoliert und auf dem Breadboard diagonal zueinander mit einigen Spalten Abstand fixiert. Auch können bereits die Drähte, die später zum RPi führen, jeweils in den passenden kontaktführenden Spalten eingesteckt werden, z. B. wie rechts zu sehen (die nicht beschrifteten Drähte können vorerst ignoriert werden):&lt;br /&gt;
&lt;br /&gt;
c. Nun bietet sich eine gute Gelegenheit die maximale Spannung am Nutzgerät zu messen. Man verbindet das Regler-Kabel (nun ohne Regler) wieder mit der Einspeisung und die offenen Enden der Drähte mit dem Messgerät, bei dem zunächst ein Messbereich von ca. 10-50 Volt gewählt werden sollte. Dies sollte dann z.B. 14,8 V anzeigen. Natürlich können auch die beiden offenen Enden einen kleinen Moment kurz geschlossen werden, man sollte aber bedenken, dass das zu regelnde Nutzgerät dann die maximal vorgesehene Spannung erhält (hier: maximales Tempo).&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung des RPi ==&lt;br /&gt;
&lt;br /&gt;
Es wird davon ausgegangen, dass entsprechend des zugehörigen &#039;manual&#039; das PiFace bereits auf den RPi gesteckt ist, die nötigen python-Bilbliotheken installiert sind und man sich im Terminal-Arbeitsverzeichnis &#039;pi&#039; befindet.&lt;br /&gt;
&lt;br /&gt;
a. Zunächst wird der PiFace-Emulator (im Terminal direkt aus dem Arbeitsverzeichnis) gestartet: &amp;lt;tt&amp;gt;piface/scripts/piface-emulator&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b. Wenn alles richtig installiert wurde, erscheint ein Fenster (unten links), bei dem die vorerst wichtigen blauen Signale am rechten Rand wie folgt angezeigt werden sollten: &lt;br /&gt;
 &lt;br /&gt;
[[Datei:RPi_PiF_em-scs.jpg|400px|Piface-Emulator im default-Zustand]] [[Datei:RPi_PiF_em_scs1.jpg|400px|Piface-Relais 1 auf &#039;1&#039; geschaltet]]&lt;br /&gt;
&lt;br /&gt;
c. Das rechte Fenster ergibt sich, wenn man nun im Fenster auf &amp;quot;Override Enable&amp;quot; und dann &amp;quot;Output Pin 1&amp;quot; klickt. Es müsste ein &amp;quot;Klack&amp;quot; vom Relais 1 zu hören sein sowie der Schaltzustand des unteren Relais 1 (das an den Output Pin 1 gekoppelt ist) auf die Verbindung der beiden unteren Anschlüsse wechseln. Zugleich wird das erste LED-Icon beim Output Pin 1 rot sowie das zugehörige LED-Icon blau.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pif_rel2.png|thumb|right|250px|Schema der Piface-Relais]]&lt;br /&gt;
d. Rechts ist der Schaltzustand der Relais, die zu Beginn genutzt werden, im Grundzustand dargestellt (jeweils der mittlere und obere Kontakt sind kurzgeschlossen, der jeweils untere Kontakt ist frei):&lt;br /&gt;
&lt;br /&gt;
e. Ein weiterer Klick auf &amp;quot;Output Pin 1&amp;quot; versetzt das Relais in den Ausgangszustand, der vor dem nächsten Schritt wieder eingestellt werden sollte.&lt;br /&gt;
&lt;br /&gt;
f. Das Relais läßt sich auch mittel eines Python-Scripts vom RPi aus ansteuern. Dazu wird folgende Textdatei &amp;quot;wandler.py&amp;quot; im Arbeitsverzeichnis abgespeichert und mit dem Befehl &amp;quot;&amp;lt;tt&amp;gt;python wandler.py&amp;lt;/tt&amp;gt;&amp;quot; gestartet:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler.py&lt;br /&gt;
&lt;br /&gt;
 from time import sleep&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
&lt;br /&gt;
 pfio.init()&lt;br /&gt;
&lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
 print &amp;quot;Strom an&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 sleep(2)&lt;br /&gt;
&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Strom aus&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Nach dem Absetzen des Befehls wechselt nun das blaue Signal an Relais 1 für 2 Sekunden und das Relais klackt entsprechend.&lt;br /&gt;
&lt;br /&gt;
== Einsatz eines Relais&#039; zur Umsetzung von Spannungsänderungen ==&lt;br /&gt;
&lt;br /&gt;
a. Ist das Relais wieder im Ausgangszustand, befestigt man nun einen der vom Breadboard führenden Drähte am unteren und einen am mittleren Relaiseingang (im Moment ist die Polarität noch egal). Zunächst sollte nichts passieren (das Relais hält diesen ja Stromkreis noch offen).&lt;br /&gt;
&lt;br /&gt;
b. Startet man aber das Script wieder (&amp;lt;tt&amp;gt;python wandler.py&amp;lt;/tt&amp;gt;) oder klickt auf &#039;Output Pin 1&#039; wird der Nutzstromkreis geschlossen. Nochmals aufgepasst: unser Nutzer erhält wieder die maximal vorgesehene Spannung - also besser vorher im Script &amp;quot;&amp;lt;tt&amp;gt;sleep(0.3)&amp;lt;/tt&amp;gt;&amp;quot; setzen und speichern.&lt;br /&gt;
&lt;br /&gt;
c. Im Prinzip ist damit die programmgesteuerte Umsetzung eines 0/1 Signals in z.B. eine 0V/15V Spannung erreicht.&lt;br /&gt;
&lt;br /&gt;
d. Da wir bald verschiedene Steuerspannungen schalten wollen, geht es jetzt darum herauszufinden, bei welcher Spannung unser Nutzgerät gerade noch bewegt wird. Dies probiert man aus - mit dem kleinsten Widerstand beginnend: indem einer der Drähte in eine freie Breadboardspalte gesteckt wird und aus dieser Spalte der Widerstand zu dem &#039;alten&#039; Steckplatz des Drahtes geführt wird. Nun startet man jeweils das Script bis der Widerstand so hoch ist, dass die Anlaufspannung beim Nutzgerätes gut ausreicht, eine Reaktion des Nutzgerät (Fahrzeug bewegt sich) zu bewirken (z.B. bei 50 Ohm beträgt der Strom ca. 130 mA während ohne 190 mA fliessen).&lt;br /&gt;
&lt;br /&gt;
= Ansteuerung von 3 Schaltstufen =&lt;br /&gt;
&lt;br /&gt;
== Kombination von 2 Relais ==&lt;br /&gt;
&lt;br /&gt;
[[Bild:ZrelMww2.png|thumb|right|300px|Beschaltung der Relais]] a. Die einfachste Stufe der weiteren Verschaltung erreicht man, indem der Widerstand mit einem 2. Relais überbrückt wird. Relais 1 kann dann als &#039;Hauptschalter&#039;, Relais 2 als Spannungsumschalter genutzt werden:&lt;br /&gt;
&lt;br /&gt;
b. Diese Beschaltung kann sogleich mit dem PiFace-Emulator ausprobiert werden. Damit können wir bereits 3 Schaltstufen steuern: keine, verminderte und volle Spannung.&lt;br /&gt;
&lt;br /&gt;
c. Theoretisch liesse sich auch noch eine 4. Spannungsstufe erzeugen, da mit 2 &#039;Bits&#039; (Ein/Aus bei 2 Relais) bereits 4 verschiedene Signale darstellbar sind. Beim jetzigen Aufbau werden aber lediglich die (pin1,pin2)-Signale (0,0), (1,0) und (1,1) &#039;genutzt&#039;, da Relais 1 als Hauptschalter vorgesehen ist und die Kombination (0,1) so nicht ausgewertet wird.&lt;br /&gt;
&lt;br /&gt;
== Programmgesteuerte Schaltung von 2 Relais ==&lt;br /&gt;
&lt;br /&gt;
a. Mit einem veränderten python-Script &amp;quot;wandler2.py&amp;quot; ist auch die programmgesteuerte Schaltung möglich. Dabei werden direkt zusätzlich die Tasten 1 und 2 des PiFace genutzt, um nach dem Start des Scripts (&amp;lt;tt&amp;gt;python wandler2.py&amp;lt;/tt&amp;gt;) den Hauptschalter (Relais 1) zu steuern:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler2.py&lt;br /&gt;
 &lt;br /&gt;
 from time import sleep&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
 pfio.init()&lt;br /&gt;
 &lt;br /&gt;
 taste_1=0&lt;br /&gt;
 taste_2=0&lt;br /&gt;
 intervall_a=0.1&lt;br /&gt;
 intervall_b=0.5&lt;br /&gt;
 # Die Intervalle bestimmen die Schaltzeit für volle/verminderte Spannung&lt;br /&gt;
 &lt;br /&gt;
 print &amp;quot;Zum Start Taste 1 drücken, zum Stoppen Taste 2&amp;quot;&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 while taste_1 == 0:&lt;br /&gt;
   sleep(intervall_a)&lt;br /&gt;
   taste_1=pfio.digital_read(1)&lt;br /&gt;
&lt;br /&gt;
 # Der o.g. &#039;sleep&#039;-Befehl bestimmt die Abfragepausen für Taste 1&lt;br /&gt;
 &lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
 print &amp;quot;Strom an!&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 while taste_2 == 0:&lt;br /&gt;
   pfio.digital_write(2,1)&lt;br /&gt;
   sleep(intervall_a)&lt;br /&gt;
   pfio.digital_write(2,0)&lt;br /&gt;
   sleep(intervall_b)&lt;br /&gt;
   taste_2=pfio.digital_read(2)&lt;br /&gt;
 &lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Strom aus!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
b. Falls beim Ausprobieren von Script-Änderungen mal was schief geht, kann das Script stets auch mit der Tastenkombination (CNTRL-C) gestoppt werden. U.U. muss dann noch zusätzlich Relais 1 und/oder 2 via Emulator zurückgesetzt werden.&lt;br /&gt;
&lt;br /&gt;
c. Beim Verändern des Scripts fällt bald auf, dass die bisherige Programmsteuerung keine direkte Möglichkeit vorsieht, auf Ereignisse zu reagieren. Immerhin wird ein mechanisches Gerät gesteuert, bei dem mit Ausfällen, Fertigungstoleranzen, Umwelteinflüssen o.Ä. zu rechnen ist (im Script wird dies bislang &#039;nur&#039; durch die Abbruchbedingung Taste 2 berücksichtigt).&lt;br /&gt;
&lt;br /&gt;
== Einfache Sensor-Signale als steuernde Elemente eines Programms ==&lt;br /&gt;
&lt;br /&gt;
a. Eine wichtige Anwendung von D/A-Steuerungen ist die mögliche Reaktion dieser Steuerung auf &#039;äußere&#039; Ereignisse, die z.B. mit Hilfe von Sensoren leistbar ist.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Einf_Sens.jpg|thumb|right|250px|einfacher Sensor]]b. Für unsere Zwecke genügt zunächst ein sehr einfacher Sensor, der ein 0- oder 1-Signal liefert und idealerweise direkt am &#039;Input Pin 1&#039; des PiFace angeschlossen werden kann. So liegt beim Input Pin 1 das Signal &#039;1&#039; an, wenn eine Verbindung zu &#039;Input GND&#039; besteht.&lt;br /&gt;
Z.B. können 2 unisolierte Drähte so plaziert werden, dass ein vorbeifahrendes Fahrzeug einen von ihnen genügend bewegt um den Kontakt kurze Zeit zu öffnen. Genau dann liefert dieser &#039;Sensor&#039; das Signal &#039;0&#039;. Eine - die Schwerkraft nutzende - mögliche Bauform ist rechts abgebildet ;-)&lt;br /&gt;
&lt;br /&gt;
c. Natürlich werden zusätzlich 2 isolierte Drähte benötigt, um jeden der beiden offenen Drähte geschützt mit Input Pin 1 und Input GND zu verbinden.&lt;br /&gt;
&lt;br /&gt;
d. Bei jeder Durchfahrt liefert der Sensor nun ein &#039;0&#039;-Signal, was im Script sowohl für eine Zeitmessung als auch für ein &#039;Schaltintervall-Array&#039; genutzt werden kann. Dort können abwechselnd für beide Spannungen Zeiten (die in etwa zum jeweiligen Streckenabschnitt passt) &#039;programmiert&#039; werden. Statt Taste 1 wird nun der Sensor ausgewertet (wobei Taste 1 als Sensor-Ersatz insoweit genutzt werden kann, dass sie gedrückt bleiben bzw. kurz losgelassen werden muss). Zur genaueren Zeitmessung wird noch das modul &#039;clock&#039; benötigt. &amp;quot;&amp;lt;tt&amp;gt;wandler3.py&amp;lt;/tt&amp;gt;&amp;quot; könnte also so aussehen:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler3.py&lt;br /&gt;
 &lt;br /&gt;
 from time import clock&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
 sensor_1=1&lt;br /&gt;
 sensor_2=0&lt;br /&gt;
 rundenzahl=0&lt;br /&gt;
 v_wechsel=0&lt;br /&gt;
 vorrunde=0&lt;br /&gt;
 index_zaehler=1&lt;br /&gt;
 &lt;br /&gt;
 zeit_array=[0,0.2,0.4,0.2,0.4,0.2,0.4,0.2,5,0.2,6]&lt;br /&gt;
 # dieses array enthält die sek. bis zum Spannungswechsel&lt;br /&gt;
&lt;br /&gt;
 array_laenge=9&lt;br /&gt;
 # legt fest, wie viel Werte des arrays genutzt werden sollen&lt;br /&gt;
 &lt;br /&gt;
 sensor_aus=1.3&lt;br /&gt;
 # bis der Sensor sicher in die Ruhestellung kippt, wird er nicht ausgelesen&lt;br /&gt;
  &lt;br /&gt;
 pfio.init()&lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
&lt;br /&gt;
 # das Fahrzeug wird langsam zum Start (=Sensor) bewegt&lt;br /&gt;
 while sensor_1 == 1 :&lt;br /&gt;
   sensor_1=pfio.digital_read(1)&lt;br /&gt;
  &lt;br /&gt;
 print &amp;quot;fliegender Start... zum Beenden Taste 2 drücken&amp;quot;&lt;br /&gt;
 print &amp;quot;Runde Nr., Ges.Zeit, Rundenzeit, mittlere Rundenzeit&amp;quot;&lt;br /&gt;
 start_zeit=clock()&lt;br /&gt;
 runden_start=start_zeit&lt;br /&gt;
  &lt;br /&gt;
 while sensor_2 == 0 :&lt;br /&gt;
   sensor_2=pfio.digital_read(2)&lt;br /&gt;
   v_wechsel=1-v_wechsel&lt;br /&gt;
   pfio.digital_write(2,v_wechsel)&lt;br /&gt;
   sensor_zeit=clock()&lt;br /&gt;
  &lt;br /&gt;
   while zeit_array[index_zaehler]+sensor_zeit &amp;gt; clock() :&lt;br /&gt;
     if runden_start+sensor_aus &amp;lt; clock() :&lt;br /&gt;
 &lt;br /&gt;
       sensor_1=pfio.digital_read(1) &lt;br /&gt;
       if sensor_1 == 0 :&lt;br /&gt;
         rundenzahl=rundenzahl+1&lt;br /&gt;
         runden_start=clock()&lt;br /&gt;
         zeit=runden_start-start_zeit&lt;br /&gt;
         print rundenzahl, zeit, zeit-vorrunde, zeit/rundenzahl&lt;br /&gt;
         vorrunde=zeit&lt;br /&gt;
         sensor_zeit=0&lt;br /&gt;
         index_zaehler=0&lt;br /&gt;
         v_wechsel=0&lt;br /&gt;
  &lt;br /&gt;
   index_zaehler=index_zaehler+1&lt;br /&gt;
   if index_zaehler &amp;gt; array_laenge :&lt;br /&gt;
     sensor_2=1&lt;br /&gt;
     print &amp;quot;array-Ende erreicht!&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Outp 1 &amp;amp; 2 auf 0!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wird das Array-Ende erreicht, wurden entweder zu wenige Einträge vorgesehen oder es befindet sich kein Fahrzeug (mehr) auf der Strecke, das den Sensor und damit des Zurücksetzen des Arrays auslösen konnte.&lt;br /&gt;
&lt;br /&gt;
e. Das Array ist an die jeweilige Strecke anzupassen, wobei der vorderste Eintrag ungenutzt bleibt und dann mit der Dauer für maximale Spannung begonnen wird. Solange man mit Relais arbeitet, sollten die Schaltzeiten nicht zu kurz sein (&amp;gt;0.1 sek), da diese eine gewisse mechanische Trägheit besitzen.&lt;br /&gt;
&lt;br /&gt;
f. Eben diese mechanische Beschaffenheit der Relais (Verschleiß) ist auch ein guter Grund, auf &#039;volle&#039; digitale Signalumwandlung umzustellen.&lt;br /&gt;
&lt;br /&gt;
= Optokoppler als Ersatz für Relais =&lt;br /&gt;
&lt;br /&gt;
Ähnlich wie ein Relais dient ein [[Optokoppler]] dazu, eine Signalübertragung zwischen zwei getrennten Stromkreisen zu ermöglichen. Hier liegt der Einsatz von Optokopplern nahe, da sie schneller schalten und keine beweglichen Teile besitzen. Für unsere Zwecke benötigen wir nun als zusätzliche Elemente: Optokoppler (CNY 17-4), npn-[[Transistor]]en (BC 337-40) zur Signalverstärkung sowie einige Widerstände im Bereich von 2k und 400 Ohm. &lt;br /&gt;
&lt;br /&gt;
== Kaskadierung von Transistoren zur Signalverstärkung ==&lt;br /&gt;
&lt;br /&gt;
[[Bild:PiF_CNY_BC_1.png|thumb|right|450px|Optokoppler mit Transistor]]a. Entsprechend Schritt 2.4.d. (ein Relais bei 50 Ohm) wird zunächst ein Optokoppler eingesetzt, dessen Signal durch einen Transistor verstärkt wird, um die &#039;Grundspannung&#039; zu schalten (Pin 3 und 6 beim Optokoppler sollten unbeschaltet bleiben, allein der &#039;Lichtstrom&#039; reicht für eine Durchschaltung aus).&lt;br /&gt;
&lt;br /&gt;
b. Da immer mit einer gewissen Toleranz bei allen Komponenten zu rechnen ist, kann es sein, dass u.U. die Widerstände etwas größer oder kleiner gewählt werden müssen. Beim Ausprobieren sollte man hier in 10% Schritten variieren.&lt;br /&gt;
&lt;br /&gt;
c. Bei Austesten mit Emulator oder Script ist auch zu beachten, dass nun &#039;Output Pin 8&#039; genutzt wird, da dieser nicht mit den Relais verschaltet ist.&lt;br /&gt;
&lt;br /&gt;
== Umsetzung von 3 Schaltstufen mit Optokopplern ==&lt;br /&gt;
&lt;br /&gt;
[[Bild:SmPiFu2ou2T.png|thumb|right|450px|Kombination von 2 Optokopplern]]a. Entsprechend dem Vorgehen beim Relais kann nun auch der kleine Widerstand zusätzlich beschaltet werden um seine gesteuerte Überbrückung zu ermöglichen. Da hier eine relativ geringe Spannung aufgeschaltet wird, kann zusätzlich eine Diode eingesetzt werden, die die Schaltstufe &#039;maximale Spannung&#039; anzeigt.&lt;br /&gt;
&lt;br /&gt;
b. Vor dem Testen ist wieder zu beachten, dass nun zusätzlich &#039;Output Pin 7&#039; genutzt wird (statt Output Pin 2).&lt;br /&gt;
&lt;br /&gt;
c. Eine mögliche Realisierung sieht so aus:...&lt;br /&gt;
&lt;br /&gt;
== Zusätzliche Erhöhung der Schaltstufen bei D/A-Wandlern ==&lt;br /&gt;
&lt;br /&gt;
[[Bild:Sm3ou3t2.png|thumb|right|450px|Erhöhung der Schaltstufen]]a. Zwar benötigen wir in unserem speziellen Beispiel eine &#039;Grundspannung&#039;, die sich dahingehend auswirkt, dass - wie unter 3.1.c. erwähnt - eine Signalkombination nicht ausgewertet wird, aber mit jeder weiteren Schaltstufe würde sich dieses Problem (theoretisch relativieren), da bei geschickter Auswahl der Widerstände (z.B. im Verhältnis 1 zu 2) jeweils eine Verdoppelung der Kombinationsmöglichkeiten erreichbar ist.&lt;br /&gt;
&lt;br /&gt;
b. Wird hier der 50 Ohm Widerstand asymmetrisch geteilt (z.B. 15 + 35 Ohm, s.a. [[Spannungsteiler]]) um dort ein weiteres Signal umsetzen zu können, ergeben sich direkt folgende 5 Schaltstufen (aus, 50, 35, 15 und 0 Ohm) u.s.w.&lt;br /&gt;
&lt;br /&gt;
c. Zur Ansteuerung dieser Schaltstufen ist das Script so zu ändern, dass nun zwischen mehr als 2 Stufen gewechselt werden kann und im Array entsprechende Zusatzdaten vorgegeben und ausgelesen werden. Mehr als diese Stufen sind im konkreten Fall aber nicht sinnvoll, da die entstehende Verlustleistung in der Schaltung die maximal verfügbare Leistung reduziert.&lt;br /&gt;
&lt;br /&gt;
= Weiterführende Ideen =&lt;br /&gt;
&lt;br /&gt;
== Hardwareseitige Ausbauvarianten ==&lt;br /&gt;
&lt;br /&gt;
Dem Ausbau dieses Ansatzes sind kaum Grenzen gesetzt:&lt;br /&gt;
&lt;br /&gt;
- beispielhafte Umsetzung einer differenzierten Abstufung mittels mittels einer logarithmischen Einteilung oder eines möglichst oft durch 2 teilbaren Anfangswertes und der Teiler (640 Ohm, 320, 160...);&lt;br /&gt;
&lt;br /&gt;
- Nachbau des Projekts mit einem Microcontroller (ggf. mit LCD-Anzeige);&lt;br /&gt;
&lt;br /&gt;
- Umbau der Steuerung mit dem Ziel, sie direkt an die GPIO-Pins des RPi anzuschließen;&lt;br /&gt;
&lt;br /&gt;
- Ergänzung um eine Sensorik, die in diesem Beispiel eine Rückmeldung liefert, ob ein Verbraucher aktiv ist oder nicht (Fahrzeug noch auf der Strecke?);&lt;br /&gt;
&lt;br /&gt;
- Einsatz anderer Sensortechniken und/oder mehrerer Sensoren zur Optimierung der Schnelligkeit oder parallelen Steuerung eines 2. Fahrzeuges;&lt;br /&gt;
&lt;br /&gt;
== Softwareseitige Ausbauvarianten ==&lt;br /&gt;
&lt;br /&gt;
- Optimierung des Scripts, indem die Sensor-Abfrage über einen &#039;Listener&#039; umgesetzt wird;&lt;br /&gt;
&lt;br /&gt;
- Erweiterung des Scripts um eine GUI mit Hilfe der python-lib Tkinter, um einen Nutzerzugriff auf das Steuerarray und/oder eine &#039;Verwaltung&#039; mehrerer Fahrzeuge;&lt;br /&gt;
&lt;br /&gt;
- Einbindung eines Web-Interface um eine &#039;Fernsteuerung&#039; zu ermöglichen...&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [http://hackaday.com/2013/01/23/replacement-controllers-for-slot-car-racing/ ähnliches Projekt bei &#039;hackaday&#039;] &lt;br /&gt;
* [https://docs.google.com/folder/d/0B-UAZ9CyJCLGQjJ3RDlqa2pqaDg/edit?pli=1&amp;amp;docId=0B-UAZ9CyJCLGNmpMeVpyYlZJUWc Relaisschaltung mit pädagogischer Erweiterung d. Universität Manchester]&lt;br /&gt;
* [http://elinux.org/RPi_Projects/PiFace_controlling_a_slot-car parallele englischsp. Dokumentation dieses Projekts mit anderem Schwerpunkt] &lt;br /&gt;
* [http://elinux.org/RPi_Projects englischsp. Projektliste zum RPi]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Raspberry Pi]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Mknot9</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:ZrelMww2.png&amp;diff=74079</id>
		<title>Datei:ZrelMww2.png</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:ZrelMww2.png&amp;diff=74079"/>
		<updated>2013-03-07T16:27:52Z</updated>

		<summary type="html">&lt;p&gt;Mknot9: Brückenschaltung zu Widerstand&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Brückenschaltung zu Widerstand&lt;/div&gt;</summary>
		<author><name>Mknot9</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=RPi_als_D/A-Wandler&amp;diff=74074</id>
		<title>RPi als D/A-Wandler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=RPi_als_D/A-Wandler&amp;diff=74074"/>
		<updated>2013-03-07T15:48:52Z</updated>

		<summary type="html">&lt;p&gt;Mknot9: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von mknot9&#039;&#039; (in Arbeit)&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
Oft wird ein Computer &#039;nur&#039; genutzt um darauf Software ablaufen zu lassen. Deren Möglichkeit zur Steuerung von elektrischen und mechanischen Geräten werden dabei leicht übersehen.&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel richtet sich daher an Einsteiger, die mit dem [[Raspberry Pi]] (&#039;RPi&#039;) Grundlagen der Computersteuerung von Relais und Spannungsteilern nachvollziehen möchten. Es wird schrittweise dargestellt, wie mittels eines D/A-Wandlers (Digital/Analog-Wandler = Umwandlung von digitalen 1/0 Signale) die Steuerung einer stufenweise veränderbaren Ausgangsspannung nachgebaut werden kann.&lt;br /&gt;
&lt;br /&gt;
= Verwendete Hardware =&lt;br /&gt;
&lt;br /&gt;
== RPi in Kombination mit der &#039;PiFace&#039;-Karte als Bastelplattform ==&lt;br /&gt;
&lt;br /&gt;
Dank der einfachen Bauweise bietet sich der RPi mit seinen frei zugänglichen GPIO-Pins als ideale Bastelplattform an. Trotzdem kann es beim Experimentieren mit Schaltungen öfters zu kleinen Fehlern kommen, die schlimmstenfalls die empfindliche Elektronik des RPi dauerhaft beschädigen können.&lt;br /&gt;
&lt;br /&gt;
Daher wird bei diesem Projekt zusätzlich mit der &#039;[http://elinux.org/RPi_Expansion_Boards#Piface|PiFace]&#039;-Karte gearbeitet, die man auf die GPIO-Pins stecken kann. Diese Erweiterungskarte verschaltet die GPIO-Pins auf je 8 digitale Ein- und Ausgänge, sowie 2 Relais, die eine galvanische Trennung von Stromkreisen ermöglichen. Damit besteht auch für Einsteiger ein gewisser Schutz für die Steuerelektronik des RPi.&lt;br /&gt;
&lt;br /&gt;
Auch im weiteren Verlauf dieser Einführung soll noch auf eine Trennung der Stromkreise Wert gelegt werden, so dass für erste digitale Schaltexperimente ein Optokoppler genutzt wird. Die spätere Nutzung der &#039;Input Pins&#039; des PiFace um eine Steuerung der D/A-Wandlung durch bestimmte Ereignisse zu ermöglichen, erfolgt ebenfalls passiv.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Auch wenn mit vermeindlich &#039;sicheren&#039; Transformatoren gebastelt wird, muss stets bedacht werden, dass diese an einem 230V-Stromnetz betrieben werden und man eher einmal mehr als weniger prüfen sollte, ob man durch eventuelle Fehler mit lebensgefährlicher Spannung in Berührung kommt!&lt;br /&gt;
&lt;br /&gt;
== Auswahl eines Beispielprojektes ==&lt;br /&gt;
&lt;br /&gt;
Günstige Möglichkeiten ein Gerät zu finden, das mit analogen Spannungen arbeitet, bieten sich u.a. im Spielzeugbereich. Im Grunde eignet sich alles, was mit Batterien oder mit Gleichspannungen unter 24 V betrieben wird.&lt;br /&gt;
&lt;br /&gt;
Da jedoch ein Ziel das Steuern von analogen Spannungen ist, bietet sich insbesondere alles an, bei dem [[Potentiometer]] eingesetzt werden. Einen dieser &#039;Handregler&#039; sollte man übrig haben, da er von seinem Anschlusskabel abgetrennt werden muss, um den oft proprietären Steckanschluss nutzen zu können. In diesem Sinne wird hier eine handelsübliche Spielzeug-Autorennbahn mit Potentiometer-Handreglern genutzt.&lt;br /&gt;
&lt;br /&gt;
== Sonstige Bauteile ==&lt;br /&gt;
&lt;br /&gt;
Für die ersten Grundlagen (s. Teile 2 &amp;amp; 3) genügen bereits rund 2 m isolierter Draht, der nicht aus verdrillten feinen Adern (Litze) bestehen sollte, 50 cm nicht-isolierter Draht, einige niederohmige Widerstände (z.B. je 2 mal 100 Ohm, 80, 60, sowie 20) und ein &#039;Experimentierbrett&#039; (engl. [[Breadboard]]).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Grundlagen und Vorbereitung des Projekts =&lt;br /&gt;
&lt;br /&gt;
== Umwandlung von 1/0 zu Ein/Aus mit einem Relais ==&lt;br /&gt;
&lt;br /&gt;
Vom Prinzip her ist jede Umwandlung eines digitalen 0 oder 1 Signals (das über eine bestimmte Spannungsdifferenz festgelegt ist) in eine (nutzbare) Spannung bereits eine D/A-Wandlung. Dies wird schlicht so realisiert, dass mit einer Eingabe am RPi die Nutzspannung des &#039;Verbrauchers&#039; zunächst einfach an- und ausgeschaltet wird.&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung der zu steuernden Hardware ==&lt;br /&gt;
&lt;br /&gt;
a. Um Fehlerquellen auszuschliessen sollte zunächst (und ggf. auch später!) kurz getestet werden, ob der vorhandene Regler wie erwartet funktioniert.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pif_Con9.jpg|thumb|right|400px|Fixierung der Reglerkabel]]&lt;br /&gt;
b. Nach dem Trennen des Reglers von der Einspeisung (und ggf. Ziehen des Netzsteckers) muss das Regler-Kabel abgeschnitten werden (eher nahe beim Regler, da das Kabel bald bis zum Breadboard reichen soll). Die neuen Enden des Einspeiseteils werden abisoliert und auf dem Breadboard diagonal zueinander mit einigen Spalten Abstand fixiert. Auch können bereits die Drähte, die später zum RPi führen, jeweils in den passenden kontaktführenden Spalten eingesteckt werden, z. B. wie rechts zu sehen (die nicht beschrifteten Drähte können vorerst ignoriert werden):&lt;br /&gt;
&lt;br /&gt;
c. Nun bietet sich eine gute Gelegenheit die maximale Spannung am Nutzgerät zu messen. Man verbindet das Regler-Kabel (nun ohne Regler) wieder mit der Einspeisung und die offenen Enden der Drähte mit dem Messgerät, bei dem zunächst ein Messbereich von ca. 10-50 Volt gewählt werden sollte. Dies sollte dann z.B. 14,8 V anzeigen. Natürlich können auch die beiden offenen Enden einen kleinen Moment kurz geschlossen werden, man sollte aber bedenken, dass das zu regelnde Nutzgerät dann die maximal vorgesehene Spannung erhält (hier: maximales Tempo).&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung des RPi ==&lt;br /&gt;
&lt;br /&gt;
Es wird davon ausgegangen, dass entsprechend des zugehörigen &#039;manual&#039; das PiFace bereits auf den RPi gesteckt ist, die nötigen python-Bilbliotheken installiert sind und man sich im Terminal-Arbeitsverzeichnis &#039;pi&#039; befindet.&lt;br /&gt;
&lt;br /&gt;
a. Zunächst wird der PiFace-Emulator (im Terminal direkt aus dem Arbeitsverzeichnis) gestartet: &amp;lt;tt&amp;gt;piface/scripts/piface-emulator&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b. Wenn alles richtig installiert wurde, erscheint ein Fenster (unten links), bei dem die vorerst wichtigen blauen Signale am rechten Rand wie folgt angezeigt werden sollten: &lt;br /&gt;
 &lt;br /&gt;
[[Datei:RPi_PiF_em-scs.jpg|400px|Piface-Emulator im default-Zustand]] [[Datei:RPi_PiF_em_scs1.jpg|400px|Piface-Relais 1 auf &#039;1&#039; geschaltet]]&lt;br /&gt;
&lt;br /&gt;
c. Das rechte Fenster ergibt sich, wenn man nun im Fenster auf &amp;quot;Override Enable&amp;quot; und dann &amp;quot;Output Pin 1&amp;quot; klickt. Es müsste ein &amp;quot;Klack&amp;quot; vom Relais 1 zu hören sein sowie der Schaltzustand des unteren Relais 1 (das an den Output Pin 1 gekoppelt ist) auf die Verbindung der beiden unteren Anschlüsse wechseln. Zugleich wird das erste LED-Icon beim Output Pin 1 rot sowie das zugehörige LED-Icon blau.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pif_rel2.png|thumb|right|250px|Schema der Piface-Relais]]&lt;br /&gt;
d. Rechts ist der Schaltzustand der Relais, die zu Beginn genutzt werden, im Grundzustand dargestellt (jeweils der mittlere und obere Kontakt sind kurzgeschlossen, der jeweils untere Kontakt ist frei):&lt;br /&gt;
&lt;br /&gt;
e. Ein weiterer Klick auf &amp;quot;Output Pin 1&amp;quot; versetzt das Relais in den Ausgangszustand, der vor dem nächsten Schritt wieder eingestellt werden sollte.&lt;br /&gt;
&lt;br /&gt;
f. Das Relais läßt sich auch mittel eines Python-Scripts vom RPi aus ansteuern. Dazu wird folgende Textdatei &amp;quot;wandler.py&amp;quot; im Arbeitsverzeichnis abgespeichert und mit dem Befehl &amp;quot;&amp;lt;tt&amp;gt;python wandler.py&amp;lt;/tt&amp;gt;&amp;quot; gestartet:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler.py&lt;br /&gt;
&lt;br /&gt;
 from time import sleep&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
&lt;br /&gt;
 pfio.init()&lt;br /&gt;
&lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
 print &amp;quot;Strom an&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 sleep(2)&lt;br /&gt;
&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Strom aus&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Nach dem Absetzen des Befehls wechselt nun das blaue Signal an Relais 1 für 2 Sekunden und das Relais klackt entsprechend.&lt;br /&gt;
&lt;br /&gt;
== Einsatz eines Relais&#039; zur Umsetzung von Spannungsänderungen ==&lt;br /&gt;
&lt;br /&gt;
a. Ist das Relais wieder im Ausgangszustand, befestigt man nun einen der vom Breadboard führenden Drähte am unteren und einen am mittleren Relaiseingang (im Moment ist die Polarität noch egal). Zunächst sollte nichts passieren (das Relais hält diesen ja Stromkreis noch offen).&lt;br /&gt;
&lt;br /&gt;
b. Startet man aber das Script wieder (&amp;lt;tt&amp;gt;python wandler.py&amp;lt;/tt&amp;gt;) oder klickt auf &#039;Output Pin 1&#039; wird der Nutzstromkreis geschlossen. Nochmals aufgepasst: unser Nutzer erhält wieder die maximal vorgesehene Spannung - also besser vorher im Script &amp;quot;&amp;lt;tt&amp;gt;sleep(0.3)&amp;lt;/tt&amp;gt;&amp;quot; setzen und speichern.&lt;br /&gt;
&lt;br /&gt;
c. Im Prinzip ist damit die programmgesteuerte Umsetzung eines 0/1 Signals in z.B. eine 0V/15V Spannung erreicht.&lt;br /&gt;
&lt;br /&gt;
d. Da wir bald verschiedene Steuerspannungen schalten wollen, geht es jetzt darum herauszufinden, bei welcher Spannung unser Nutzgerät gerade noch bewegt wird. Dies probiert man aus - mit dem kleinsten Widerstand beginnend: indem einer der Drähte in eine freie Breadboardspalte gesteckt wird und aus dieser Spalte der Widerstand zu dem &#039;alten&#039; Steckplatz des Drahtes geführt wird. Nun startet man jeweils das Script bis der Widerstand so hoch ist, dass die Anlaufspannung beim Nutzgerätes gut ausreicht, eine Reaktion des Nutzgerät (Fahrzeug bewegt sich) zu bewirken (z.B. bei 50 Ohm beträgt der Strom ca. 130 mA während ohne 190 mA fliessen).&lt;br /&gt;
&lt;br /&gt;
= Ansteuerung von 3 Schaltstufen =&lt;br /&gt;
&lt;br /&gt;
== Kombination von 2 Relais ==&lt;br /&gt;
&lt;br /&gt;
[[Bild:sm1ru50o.png|thumb|right|300px|Beschaltung der Relais]] a. Die einfachste Stufe der weiteren Verschaltung erreicht man, indem der Widerstand mit einem 2. Relais überbrückt wird. Relais 1 kann dann als &#039;Hauptschalter&#039;, Relais 2 als Spannungsumschalter genutzt werden:&lt;br /&gt;
&lt;br /&gt;
b. Diese Beschaltung kann sogleich mit dem PiFace-Emulator ausprobiert werden. Damit können wir bereits 3 Schaltstufen steuern: keine, verminderte und volle Spannung.&lt;br /&gt;
&lt;br /&gt;
c. Theoretisch liesse sich auch noch eine 4. Spannungsstufe erzeugen, da mit 2 &#039;Bits&#039; (Ein/Aus bei 2 Relais) bereits 4 verschiedene Signale darstellbar sind. Beim jetzigen Aufbau werden aber lediglich die (pin1,pin2)-Signale (0,0), (1,0) und (1,1) &#039;genutzt&#039;, da Relais 1 als Hauptschalter vorgesehen ist und die Kombination (0,1) so nicht ausgewertet wird.&lt;br /&gt;
&lt;br /&gt;
== Programmgesteuerte Schaltung von 2 Relais ==&lt;br /&gt;
&lt;br /&gt;
a. Mit einem veränderten python-Script &amp;quot;wandler2.py&amp;quot; ist auch die programmgesteuerte Schaltung möglich. Dabei werden direkt zusätzlich die Tasten 1 und 2 des PiFace genutzt, um nach dem Start des Scripts (&amp;lt;tt&amp;gt;python wandler2.py&amp;lt;/tt&amp;gt;) den Hauptschalter (Relais 1) zu steuern:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler2.py&lt;br /&gt;
 &lt;br /&gt;
 from time import sleep&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
 pfio.init()&lt;br /&gt;
 &lt;br /&gt;
 taste_1=0&lt;br /&gt;
 taste_2=0&lt;br /&gt;
 intervall_a=0.1&lt;br /&gt;
 intervall_b=0.5&lt;br /&gt;
 # Die Intervalle bestimmen die Schaltzeit für volle/verminderte Spannung&lt;br /&gt;
 &lt;br /&gt;
 print &amp;quot;Zum Start Taste 1 drücken, zum Stoppen Taste 2&amp;quot;&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 while taste_1 == 0:&lt;br /&gt;
   sleep(intervall_a)&lt;br /&gt;
   taste_1=pfio.digital_read(1)&lt;br /&gt;
&lt;br /&gt;
 # Der o.g. &#039;sleep&#039;-Befehl bestimmt die Abfragepausen für Taste 1&lt;br /&gt;
 &lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
 print &amp;quot;Strom an!&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 while taste_2 == 0:&lt;br /&gt;
   pfio.digital_write(2,1)&lt;br /&gt;
   sleep(intervall_a)&lt;br /&gt;
   pfio.digital_write(2,0)&lt;br /&gt;
   sleep(intervall_b)&lt;br /&gt;
   taste_2=pfio.digital_read(2)&lt;br /&gt;
 &lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Strom aus!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
b. Falls beim Ausprobieren von Script-Änderungen mal was schief geht, kann das Script stets auch mit der Tastenkombination (CNTRL-C) gestoppt werden. U.U. muss dann noch zusätzlich Relais 1 und/oder 2 via Emulator zurückgesetzt werden.&lt;br /&gt;
&lt;br /&gt;
c. Beim Verändern des Scripts fällt bald auf, dass die bisherige Programmsteuerung keine direkte Möglichkeit vorsieht, auf Ereignisse zu reagieren. Immerhin wird ein mechanisches Gerät gesteuert, bei dem mit Ausfällen, Fertigungstoleranzen, Umwelteinflüssen o.Ä. zu rechnen ist (im Script wird dies bislang &#039;nur&#039; durch die Abbruchbedingung Taste 2 berücksichtigt).&lt;br /&gt;
&lt;br /&gt;
== Einfache Sensor-Signale als steuernde Elemente eines Programms ==&lt;br /&gt;
&lt;br /&gt;
a. Eine wichtige Anwendung von D/A-Steuerungen ist die mögliche Reaktion dieser Steuerung auf &#039;äußere&#039; Ereignisse, die z.B. mit Hilfe von Sensoren leistbar ist.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Einf_Sens.jpg|thumb|right|250px|einfacher Sensor]]b. Für unsere Zwecke genügt zunächst ein sehr einfacher Sensor, der ein 0- oder 1-Signal liefert und idealerweise direkt am &#039;Input Pin 1&#039; des PiFace angeschlossen werden kann. So liegt beim Input Pin 1 das Signal &#039;1&#039; an, wenn eine Verbindung zu &#039;Input GND&#039; besteht.&lt;br /&gt;
Z.B. können 2 unisolierte Drähte so plaziert werden, dass ein vorbeifahrendes Fahrzeug einen von ihnen genügend bewegt um den Kontakt kurze Zeit zu öffnen. Genau dann liefert dieser &#039;Sensor&#039; das Signal &#039;0&#039;. Eine - die Schwerkraft nutzende - mögliche Bauform ist rechts abgebildet ;-)&lt;br /&gt;
&lt;br /&gt;
c. Natürlich werden zusätzlich 2 isolierte Drähte benötigt, um jeden der beiden offenen Drähte geschützt mit Input Pin 1 und Input GND zu verbinden.&lt;br /&gt;
&lt;br /&gt;
d. Bei jeder Durchfahrt liefert der Sensor nun ein &#039;0&#039;-Signal, was im Script sowohl für eine Zeitmessung als auch für ein &#039;Schaltintervall-Array&#039; genutzt werden kann. Dort können abwechselnd für beide Spannungen Zeiten (die in etwa zum jeweiligen Streckenabschnitt passt) &#039;programmiert&#039; werden. Statt Taste 1 wird nun der Sensor ausgewertet (wobei Taste 1 als Sensor-Ersatz insoweit genutzt werden kann, dass sie gedrückt bleiben bzw. kurz losgelassen werden muss). Zur genaueren Zeitmessung wird noch das modul &#039;clock&#039; benötigt. &amp;quot;&amp;lt;tt&amp;gt;wandler3.py&amp;lt;/tt&amp;gt;&amp;quot; könnte also so aussehen:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler3.py&lt;br /&gt;
 &lt;br /&gt;
 from time import clock&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
 sensor_1=1&lt;br /&gt;
 sensor_2=0&lt;br /&gt;
 rundenzahl=0&lt;br /&gt;
 v_wechsel=0&lt;br /&gt;
 vorrunde=0&lt;br /&gt;
 index_zaehler=1&lt;br /&gt;
 &lt;br /&gt;
 zeit_array=[0,0.2,0.4,0.2,0.4,0.2,0.4,0.2,5,0.2,6]&lt;br /&gt;
 # dieses array enthält die sek. bis zum Spannungswechsel&lt;br /&gt;
&lt;br /&gt;
 array_laenge=9&lt;br /&gt;
 # legt fest, wie viel Werte des arrays genutzt werden sollen&lt;br /&gt;
 &lt;br /&gt;
 sensor_aus=1.3&lt;br /&gt;
 # bis der Sensor sicher in die Ruhestellung kippt, wird er nicht ausgelesen&lt;br /&gt;
  &lt;br /&gt;
 pfio.init()&lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
&lt;br /&gt;
 # das Fahrzeug wird langsam zum Start (=Sensor) bewegt&lt;br /&gt;
 while sensor_1 == 1 :&lt;br /&gt;
   sensor_1=pfio.digital_read(1)&lt;br /&gt;
  &lt;br /&gt;
 print &amp;quot;fliegender Start... zum Beenden Taste 2 drücken&amp;quot;&lt;br /&gt;
 print &amp;quot;Runde Nr., Ges.Zeit, Rundenzeit, mittlere Rundenzeit&amp;quot;&lt;br /&gt;
 start_zeit=clock()&lt;br /&gt;
 runden_start=start_zeit&lt;br /&gt;
  &lt;br /&gt;
 while sensor_2 == 0 :&lt;br /&gt;
   sensor_2=pfio.digital_read(2)&lt;br /&gt;
   v_wechsel=1-v_wechsel&lt;br /&gt;
   pfio.digital_write(2,v_wechsel)&lt;br /&gt;
   sensor_zeit=clock()&lt;br /&gt;
  &lt;br /&gt;
   while zeit_array[index_zaehler]+sensor_zeit &amp;gt; clock() :&lt;br /&gt;
     if runden_start+sensor_aus &amp;lt; clock() :&lt;br /&gt;
 &lt;br /&gt;
       sensor_1=pfio.digital_read(1) &lt;br /&gt;
       if sensor_1 == 0 :&lt;br /&gt;
         rundenzahl=rundenzahl+1&lt;br /&gt;
         runden_start=clock()&lt;br /&gt;
         zeit=runden_start-start_zeit&lt;br /&gt;
         print rundenzahl, zeit, zeit-vorrunde, zeit/rundenzahl&lt;br /&gt;
         vorrunde=zeit&lt;br /&gt;
         sensor_zeit=0&lt;br /&gt;
         index_zaehler=0&lt;br /&gt;
         v_wechsel=0&lt;br /&gt;
  &lt;br /&gt;
   index_zaehler=index_zaehler+1&lt;br /&gt;
   if index_zaehler &amp;gt; array_laenge :&lt;br /&gt;
     sensor_2=1&lt;br /&gt;
     print &amp;quot;array-Ende erreicht!&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Outp 1 &amp;amp; 2 auf 0!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wird das Array-Ende erreicht, wurden entweder zu wenige Einträge vorgesehen oder es befindet sich kein Fahrzeug (mehr) auf der Strecke, das den Sensor und damit des Zurücksetzen des Arrays auslösen konnte.&lt;br /&gt;
&lt;br /&gt;
e. Das Array ist an die jeweilige Strecke anzupassen, wobei der vorderste Eintrag ungenutzt bleibt und dann mit der Dauer für maximale Spannung begonnen wird. Solange man mit Relais arbeitet, sollten die Schaltzeiten nicht zu kurz sein (&amp;gt;0.1 sek), da diese eine gewisse mechanische Trägheit besitzen.&lt;br /&gt;
&lt;br /&gt;
f. Eben diese mechanische Beschaffenheit der Relais (Verschleiß) ist auch ein guter Grund, auf &#039;volle&#039; digitale Signalumwandlung umzustellen.&lt;br /&gt;
&lt;br /&gt;
= Optokoppler als Ersatz für Relais =&lt;br /&gt;
&lt;br /&gt;
Ähnlich wie ein Relais dient ein [[Optokoppler]] dazu, eine Signalübertragung zwischen zwei getrennten Stromkreisen zu ermöglichen. Hier liegt der Einsatz von Optokopplern nahe, da sie schneller schalten und keine beweglichen Teile besitzen. Für unsere Zwecke benötigen wir nun als zusätzliche Elemente: Optokoppler (CNY 17-4), npn-[[Transistor]]en (BC 337-40) zur Signalverstärkung sowie einige Widerstände im Bereich von 2k und 400 Ohm. &lt;br /&gt;
&lt;br /&gt;
== Kaskadierung von Transistoren zur Signalverstärkung ==&lt;br /&gt;
&lt;br /&gt;
[[Bild:PiF_CNY_BC_1.png|thumb|right|450px|Optokoppler mit Transistor]]a. Entsprechend Schritt 2.4.d. (ein Relais bei 50 Ohm) wird zunächst ein Optokoppler eingesetzt, dessen Signal durch einen Transistor verstärkt wird, um die &#039;Grundspannung&#039; zu schalten (Pin 3 und 6 beim Optokoppler sollten unbeschaltet bleiben, allein der &#039;Lichtstrom&#039; reicht für eine Durchschaltung aus).&lt;br /&gt;
&lt;br /&gt;
b. Da immer mit einer gewissen Toleranz bei allen Komponenten zu rechnen ist, kann es sein, dass u.U. die Widerstände etwas größer oder kleiner gewählt werden müssen. Beim Ausprobieren sollte man hier in 10% Schritten variieren.&lt;br /&gt;
&lt;br /&gt;
c. Bei Austesten mit Emulator oder Script ist auch zu beachten, dass nun &#039;Output Pin 8&#039; genutzt wird, da dieser nicht mit den Relais verschaltet ist.&lt;br /&gt;
&lt;br /&gt;
== Umsetzung von 3 Schaltstufen mit Optokopplern ==&lt;br /&gt;
&lt;br /&gt;
[[Bild:SmPiFu2ou2T.png|thumb|right|450px|Kombination von 2 Optokopplern]]a. Entsprechend dem Vorgehen beim Relais kann nun auch der kleine Widerstand zusätzlich beschaltet werden um seine gesteuerte Überbrückung zu ermöglichen. Da hier eine relativ geringe Spannung aufgeschaltet wird, kann zusätzlich eine Diode eingesetzt werden, die die Schaltstufe &#039;maximale Spannung&#039; anzeigt.&lt;br /&gt;
&lt;br /&gt;
b. Vor dem Testen ist wieder zu beachten, dass nun zusätzlich &#039;Output Pin 7&#039; genutzt wird (statt Output Pin 2).&lt;br /&gt;
&lt;br /&gt;
c. Eine mögliche Realisierung sieht so aus:...&lt;br /&gt;
&lt;br /&gt;
== Zusätzliche Erhöhung der Schaltstufen bei D/A-Wandlern ==&lt;br /&gt;
&lt;br /&gt;
[[Bild:Sm3ou3t2.png|thumb|right|450px|Erhöhung der Schaltstufen]]a. Zwar benötigen wir in unserem speziellen Beispiel eine &#039;Grundspannung&#039;, die sich dahingehend auswirkt, dass - wie unter 3.1.c. erwähnt - eine Signalkombination nicht ausgewertet wird, aber mit jeder weiteren Schaltstufe würde sich dieses Problem (theoretisch relativieren), da bei geschickter Auswahl der Widerstände (z.B. im Verhältnis 1 zu 2) jeweils eine Verdoppelung der Kombinationsmöglichkeiten erreichbar ist.&lt;br /&gt;
&lt;br /&gt;
b. Wird hier der 50 Ohm Widerstand asymmetrisch geteilt (z.B. 15 + 35 Ohm, s.a. [[Spannungsteiler]]) um dort ein weiteres Signal umsetzen zu können, ergeben sich direkt folgende 5 Schaltstufen (aus, 50, 35, 15 und 0 Ohm) u.s.w.&lt;br /&gt;
&lt;br /&gt;
c. Zur Ansteuerung dieser Schaltstufen ist das Script so zu ändern, dass nun zwischen mehr als 2 Stufen gewechselt werden kann und im Array entsprechende Zusatzdaten vorgegeben und ausgelesen werden. Mehr als diese Stufen sind im konkreten Fall aber nicht sinnvoll, da die entstehende Verlustleistung in der Schaltung die maximal verfügbare Leistung reduziert.&lt;br /&gt;
&lt;br /&gt;
= Weiterführende Ideen =&lt;br /&gt;
&lt;br /&gt;
== Hardwareseitige Ausbauvarianten ==&lt;br /&gt;
&lt;br /&gt;
Dem Ausbau dieses Ansatzes sind kaum Grenzen gesetzt:&lt;br /&gt;
&lt;br /&gt;
- beispielhafte Umsetzung einer differenzierten Abstufung mittels mittels einer logarithmischen Einteilung oder eines möglichst oft durch 2 teilbaren Anfangswertes und der Teiler (640 Ohm, 320, 160...);&lt;br /&gt;
&lt;br /&gt;
- Nachbau des Projekts mit einem Microcontroller (ggf. mit LCD-Anzeige);&lt;br /&gt;
&lt;br /&gt;
- Umbau der Steuerung mit dem Ziel, sie direkt an die GPIO-Pins des RPi anzuschließen;&lt;br /&gt;
&lt;br /&gt;
- Ergänzung um eine Sensorik, die in diesem Beispiel eine Rückmeldung liefert, ob ein Verbraucher aktiv ist oder nicht (Fahrzeug noch auf der Strecke?);&lt;br /&gt;
&lt;br /&gt;
- Einsatz anderer Sensortechniken und/oder mehrerer Sensoren zur Optimierung der Schnelligkeit oder parallelen Steuerung eines 2. Fahrzeuges;&lt;br /&gt;
&lt;br /&gt;
== Softwareseitige Ausbauvarianten ==&lt;br /&gt;
&lt;br /&gt;
- Optimierung des Scripts, indem die Sensor-Abfrage über einen &#039;Listener&#039; umgesetzt wird;&lt;br /&gt;
&lt;br /&gt;
- Erweiterung des Scripts um eine GUI mit Hilfe der python-lib Tkinter, um einen Nutzerzugriff auf das Steuerarray und/oder eine &#039;Verwaltung&#039; mehrerer Fahrzeuge;&lt;br /&gt;
&lt;br /&gt;
- Einbindung eines Web-Interface um eine &#039;Fernsteuerung&#039; zu ermöglichen...&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [http://hackaday.com/2013/01/23/replacement-controllers-for-slot-car-racing/ ähnliches Projekt bei &#039;hackaday&#039;] &lt;br /&gt;
* [https://docs.google.com/folder/d/0B-UAZ9CyJCLGQjJ3RDlqa2pqaDg/edit?pli=1&amp;amp;docId=0B-UAZ9CyJCLGNmpMeVpyYlZJUWc Relaisschaltung mit pädagogischer Erweiterung d. Universität Manchester]&lt;br /&gt;
* [http://elinux.org/RPi_Projects/PiFace_controlling_a_slot-car parallele englischsp. Dokumentation dieses Projekts mit anderem Schwerpunkt] &lt;br /&gt;
* [http://elinux.org/RPi_Projects englischsp. Projektliste zum RPi]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Raspberry Pi]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Mknot9</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=RPi_als_D/A-Wandler&amp;diff=74073</id>
		<title>RPi als D/A-Wandler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=RPi_als_D/A-Wandler&amp;diff=74073"/>
		<updated>2013-03-07T15:46:57Z</updated>

		<summary type="html">&lt;p&gt;Mknot9: /* Zusätzliche Erhöhung der Schaltstufen bei D/A-Wandlern */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von mknot9&#039;&#039; (in Arbeit)&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
Oft wird ein Computer &#039;nur&#039; genutzt um darauf Software ablaufen zu lassen. Deren Möglichkeit zur Steuerung von elektrischen und mechanischen Geräten werden dabei leicht übersehen.&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel richtet sich daher an Einsteiger, die mit dem [[Raspberry Pi]] (&#039;RPi&#039;) Grundlagen der Computersteuerung von Relais und Spannungsteilern nachvollziehen möchten. Es wird schrittweise dargestellt, wie mittels eines D/A-Wandlers (Digital/Analog-Wandler = Umwandlung von digitalen 1/0 Signale) die Steuerung einer stufenweise veränderbaren Ausgangsspannung nachgebaut werden kann.&lt;br /&gt;
&lt;br /&gt;
= Verwendete Hardware =&lt;br /&gt;
&lt;br /&gt;
== RPi in Kombination mit der &#039;PiFace&#039;-Karte als Bastelplattform ==&lt;br /&gt;
&lt;br /&gt;
Dank der einfachen Bauweise bietet sich der RPi mit seinen frei zugänglichen GPIO-Pins als ideale Bastelplattform an. Trotzdem kann es beim Experimentieren mit Schaltungen öfters zu kleinen Fehlern kommen, die schlimmstenfalls die empfindliche Elektronik des RPi dauerhaft beschädigen können.&lt;br /&gt;
&lt;br /&gt;
Daher wird bei diesem Projekt zusätzlich mit der &#039;[http://elinux.org/RPi_Expansion_Boards#Piface|PiFace]&#039;-Karte gearbeitet, die man auf die GPIO-Pins stecken kann. Diese Erweiterungskarte verschaltet die GPIO-Pins auf je 8 digitale Ein- und Ausgänge, sowie 2 Relais, die eine galvanische Trennung von Stromkreisen ermöglichen. Damit besteht auch für Einsteiger ein gewisser Schutz für die Steuerelektronik des RPi.&lt;br /&gt;
&lt;br /&gt;
Auch im weiteren Verlauf dieser Einführung soll noch auf eine Trennung der Stromkreise Wert gelegt werden, so dass für erste digitale Schaltexperimente ein Optokoppler genutzt wird. Die spätere Nutzung der &#039;Input Pins&#039; des PiFace um eine Steuerung der D/A-Wandlung durch bestimmte Ereignisse zu ermöglichen, erfolgt ebenfalls passiv.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Auch wenn mit vermeindlich &#039;sicheren&#039; Transformatoren gebastelt wird, muss stets bedacht werden, dass diese an einem 230V-Stromnetz betrieben werden und man eher einmal mehr als weniger prüfen sollte, ob man durch eventuelle Fehler mit lebensgefährlicher Spannung in Berührung kommt!&lt;br /&gt;
&lt;br /&gt;
== Auswahl eines Beispielprojektes ==&lt;br /&gt;
&lt;br /&gt;
Günstige Möglichkeiten ein Gerät zu finden, das mit analogen Spannungen arbeitet, bieten sich u.a. im Spielzeugbereich. Im Grunde eignet sich alles, was mit Batterien oder mit Gleichspannungen unter 24 V betrieben wird.&lt;br /&gt;
&lt;br /&gt;
Da jedoch ein Ziel das Steuern von analogen Spannungen ist, bietet sich insbesondere alles an, bei dem [[Potentiometer]] eingesetzt werden. Einen dieser &#039;Handregler&#039; sollte man übrig haben, da er von seinem Anschlusskabel abgetrennt werden muss, um den oft proprietären Steckanschluss nutzen zu können. In diesem Sinne wird hier eine handelsübliche Spielzeug-Autorennbahn mit Potentiometer-Handreglern genutzt.&lt;br /&gt;
&lt;br /&gt;
== Sonstige Bauteile ==&lt;br /&gt;
&lt;br /&gt;
Für die ersten Grundlagen (s. Teile 2 &amp;amp; 3) genügen bereits rund 2 m isolierter Draht, der nicht aus verdrillten feinen Adern (Litze) bestehen sollte, 50 cm nicht-isolierter Draht, einige niederohmige Widerstände (z.B. je 2 mal 100 Ohm, 80, 60, sowie 20) und ein &#039;Experimentierbrett&#039; (engl. [[Breadboard]]).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Grundlagen und Vorbereitung des Projekts =&lt;br /&gt;
&lt;br /&gt;
== Umwandlung von 1/0 zu Ein/Aus mit einem Relais ==&lt;br /&gt;
&lt;br /&gt;
Vom Prinzip her ist jede Umwandlung eines digitalen 0 oder 1 Signals (das über eine bestimmte Spannungsdifferenz festgelegt ist) in eine (nutzbare) Spannung bereits eine D/A-Wandlung. Dies wird schlicht so realisiert, dass mit einer Eingabe am RPi die Nutzspannung des &#039;Verbrauchers&#039; zunächst einfach an- und ausgeschaltet wird.&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung der zu steuernden Hardware ==&lt;br /&gt;
&lt;br /&gt;
a. Um Fehlerquellen auszuschliessen sollte zunächst (und ggf. auch später!) kurz getestet werden, ob der vorhandene Regler wie erwartet funktioniert.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pif_Con9.jpg|thumb|right|400px|Fixierung der Reglerkabel]]&lt;br /&gt;
b. Nach dem Trennen des Reglers von der Einspeisung (und ggf. Ziehen des Netzsteckers) muss das Regler-Kabel abgeschnitten werden (eher nahe beim Regler, da das Kabel bald bis zum Breadboard reichen soll). Die neuen Enden des Einspeiseteils werden abisoliert und auf dem Breadboard diagonal zueinander mit einigen Spalten Abstand fixiert. Auch können bereits die Drähte, die später zum RPi führen, jeweils in den passenden kontaktführenden Spalten eingesteckt werden, z. B. wie rechts zu sehen (die nicht beschrifteten Drähte können vorerst ignoriert werden):&lt;br /&gt;
&lt;br /&gt;
c. Nun bietet sich eine gute Gelegenheit die maximale Spannung am Nutzgerät zu messen. Man verbindet das Regler-Kabel (nun ohne Regler) wieder mit der Einspeisung und die offenen Enden der Drähte mit dem Messgerät, bei dem zunächst ein Messbereich von ca. 10-50 Volt gewählt werden sollte. Dies sollte dann z.B. 14,8 V anzeigen. Natürlich können auch die beiden offenen Enden einen kleinen Moment kurz geschlossen werden, man sollte aber bedenken, dass das zu regelnde Nutzgerät dann die maximal vorgesehene Spannung erhält (hier: maximales Tempo).&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung des RPi ==&lt;br /&gt;
&lt;br /&gt;
Es wird davon ausgegangen, dass entsprechend des zugehörigen &#039;manual&#039; das PiFace bereits auf den RPi gesteckt ist, die nötigen python-Bilbliotheken installiert sind und man sich im Terminal-Arbeitsverzeichnis &#039;pi&#039; befindet.&lt;br /&gt;
&lt;br /&gt;
a. Zunächst wird der PiFace-Emulator (im Terminal direkt aus dem Arbeitsverzeichnis) gestartet: &amp;lt;tt&amp;gt;piface/scripts/piface-emulator&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b. Wenn alles richtig installiert wurde, erscheint ein Fenster (unten links), bei dem die vorerst wichtigen blauen Signale am rechten Rand wie folgt angezeigt werden sollten: &lt;br /&gt;
 &lt;br /&gt;
[[Datei:RPi_PiF_em-scs.jpg|400px|Piface-Emulator im default-Zustand]] [[Datei:RPi_PiF_em_scs1.jpg|400px|Piface-Relais 1 auf &#039;1&#039; geschaltet]]&lt;br /&gt;
&lt;br /&gt;
c. Das rechte Fenster ergibt sich, wenn man nun im Fenster auf &amp;quot;Override Enable&amp;quot; und dann &amp;quot;Output Pin 1&amp;quot; klickt. Es müsste ein &amp;quot;Klack&amp;quot; vom Relais 1 zu hören sein sowie der Schaltzustand des unteren Relais 1 (das an den Output Pin 1 gekoppelt ist) auf die Verbindung der beiden unteren Anschlüsse wechseln. Zugleich wird das erste LED-Icon beim Output Pin 1 rot sowie das zugehörige LED-Icon blau.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pif_rel2.png|thumb|right|250px|Schema der Piface-Relais]]&lt;br /&gt;
d. Rechts ist der Schaltzustand der Relais, die zu Beginn genutzt werden, im Grundzustand dargestellt (jeweils der mittlere und obere Kontakt sind kurzgeschlossen, der jeweils untere Kontakt ist frei):&lt;br /&gt;
&lt;br /&gt;
e. Ein weiterer Klick auf &amp;quot;Output Pin 1&amp;quot; versetzt das Relais in den Ausgangszustand, der vor dem nächsten Schritt wieder eingestellt werden sollte.&lt;br /&gt;
&lt;br /&gt;
f. Das Relais läßt sich auch mittel eines Python-Scripts vom RPi aus ansteuern. Dazu wird folgende Textdatei &amp;quot;wandler.py&amp;quot; im Arbeitsverzeichnis abgespeichert und mit dem Befehl &amp;quot;&amp;lt;tt&amp;gt;python wandler.py&amp;lt;/tt&amp;gt;&amp;quot; gestartet:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler.py&lt;br /&gt;
&lt;br /&gt;
 from time import sleep&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
&lt;br /&gt;
 pfio.init()&lt;br /&gt;
&lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
 print &amp;quot;Strom an&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 sleep(2)&lt;br /&gt;
&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Strom aus&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Nach dem Absetzen des Befehls wechselt nun das blaue Signal an Relais 1 für 2 Sekunden und das Relais klackt entsprechend.&lt;br /&gt;
&lt;br /&gt;
== Einsatz eines Relais&#039; zur Umsetzung von Spannungsänderungen ==&lt;br /&gt;
&lt;br /&gt;
a. Ist das Relais wieder im Ausgangszustand, befestigt man nun einen der vom Breadboard führenden Drähte am unteren und einen am mittleren Relaiseingang (im Moment ist die Polarität noch egal). Zunächst sollte nichts passieren (das Relais hält diesen ja Stromkreis noch offen).&lt;br /&gt;
&lt;br /&gt;
b. Startet man aber das Script wieder (&amp;lt;tt&amp;gt;python wandler.py&amp;lt;/tt&amp;gt;) oder klickt auf &#039;Output Pin 1&#039; wird der Nutzstromkreis geschlossen. Nochmals aufgepasst: unser Nutzer erhält wieder die maximal vorgesehene Spannung - also besser vorher im Script &amp;quot;&amp;lt;tt&amp;gt;sleep(0.3)&amp;lt;/tt&amp;gt;&amp;quot; setzen und speichern.&lt;br /&gt;
&lt;br /&gt;
c. Im Prinzip ist damit die programmgesteuerte Umsetzung eines 0/1 Signals in z.B. eine 0V/15V Spannung erreicht.&lt;br /&gt;
&lt;br /&gt;
d. Da wir bald verschiedene Steuerspannungen schalten wollen, geht es jetzt darum herauszufinden, bei welcher Spannung unser Nutzgerät gerade noch bewegt wird. Dies probiert man aus - mit dem kleinsten Widerstand beginnend: indem einer der Drähte in eine freie Breadboardspalte gesteckt wird und aus dieser Spalte der Widerstand zu dem &#039;alten&#039; Steckplatz des Drahtes geführt wird. Nun startet man jeweils das Script bis der Widerstand so hoch ist, dass die Anlaufspannung beim Nutzgerätes gut ausreicht, eine Reaktion des Nutzgerät (Fahrzeug bewegt sich) zu bewirken (z.B. bei 50 Ohm beträgt der Strom ca. 130 mA während ohne 190 mA fliessen).&lt;br /&gt;
&lt;br /&gt;
= Ansteuerung von 3 Schaltstufen =&lt;br /&gt;
&lt;br /&gt;
== Kombination von 2 Relais ==&lt;br /&gt;
&lt;br /&gt;
[[Bild:sm1ru50o.png|thumb|right|300px|Beschaltung der Relais]] a. Die einfachste Stufe der weiteren Verschaltung erreicht man, indem der Widerstand mit einem 2. Relais überbrückt wird. Relais 1 kann dann als &#039;Hauptschalter&#039;, Relais 2 als Spannungsumschalter genutzt werden:&lt;br /&gt;
&lt;br /&gt;
b. Diese Beschaltung kann sogleich mit dem PiFace-Emulator ausprobiert werden. Damit können wir bereits 3 Schaltstufen steuern: keine, verminderte und volle Spannung.&lt;br /&gt;
&lt;br /&gt;
c. Theoretisch liesse sich auch noch eine 4. Spannungsstufe erzeugen, da mit 2 &#039;Bits&#039; (Ein/Aus bei 2 Relais) bereits 4 verschiedene Signale darstellbar sind. Beim jetzigen Aufbau werden aber lediglich die (pin1,pin2)-Signale (0,0), (1,0) und (1,1) &#039;genutzt&#039;, da Relais 1 als Hauptschalter vorgesehen ist und die Kombination (0,1) so nicht ausgewertet wird.&lt;br /&gt;
&lt;br /&gt;
== Programmgesteuerte Schaltung von 2 Relais ==&lt;br /&gt;
&lt;br /&gt;
a. Mit einem veränderten python-Script &amp;quot;wandler2.py&amp;quot; ist auch die programmgesteuerte Schaltung möglich. Dabei werden direkt zusätzlich die Tasten 1 und 2 des PiFace genutzt, um nach dem Start des Scripts (&amp;lt;tt&amp;gt;python wandler2.py&amp;lt;/tt&amp;gt;) den Hauptschalter (Relais 1) zu steuern:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler2.py&lt;br /&gt;
 &lt;br /&gt;
 from time import sleep&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
 pfio.init()&lt;br /&gt;
 &lt;br /&gt;
 taste_1=0&lt;br /&gt;
 taste_2=0&lt;br /&gt;
 intervall_a=0.1&lt;br /&gt;
 intervall_b=0.5&lt;br /&gt;
 # Die Intervalle bestimmen die Schaltzeit für volle/verminderte Spannung&lt;br /&gt;
 &lt;br /&gt;
 print &amp;quot;Zum Start Taste 1 drücken, zum Stoppen Taste 2&amp;quot;&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 while taste_1 == 0:&lt;br /&gt;
   sleep(intervall_a)&lt;br /&gt;
   taste_1=pfio.digital_read(1)&lt;br /&gt;
&lt;br /&gt;
 # Der o.g. &#039;sleep&#039;-Befehl bestimmt die Abfragepausen für Taste 1&lt;br /&gt;
 &lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
 print &amp;quot;Strom an!&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 while taste_2 == 0:&lt;br /&gt;
   pfio.digital_write(2,1)&lt;br /&gt;
   sleep(intervall_a)&lt;br /&gt;
   pfio.digital_write(2,0)&lt;br /&gt;
   sleep(intervall_b)&lt;br /&gt;
   taste_2=pfio.digital_read(2)&lt;br /&gt;
 &lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Strom aus!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
b. Falls beim Ausprobieren von Script-Änderungen mal was schief geht, kann das Script stets auch mit der Tastenkombination (CNTRL-C) gestoppt werden. U.U. muss dann noch zusätzlich Relais 1 und/oder 2 via Emulator zurückgesetzt werden.&lt;br /&gt;
&lt;br /&gt;
c. Beim Verändern des Scripts fällt bald auf, dass die bisherige Programmsteuerung keine direkte Möglichkeit vorsieht, auf Ereignisse zu reagieren. Immerhin wird ein mechanisches Gerät gesteuert, bei dem mit Ausfällen, Fertigungstoleranzen, Umwelteinflüssen o.Ä. zu rechnen ist (im Script wird dies bislang &#039;nur&#039; durch die Abbruchbedingung Taste 2 berücksichtigt).&lt;br /&gt;
&lt;br /&gt;
== Einfache Sensor-Signale als steuernde Elemente eines Programms ==&lt;br /&gt;
&lt;br /&gt;
a. Eine wichtige Anwendung von D/A-Steuerungen ist die mögliche Reaktion dieser Steuerung auf &#039;äußere&#039; Ereignisse, die z.B. mit Hilfe von Sensoren leistbar ist.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Einf_Sens.jpg|thumb|right|300px|einfacher Sensor]]b. Für unsere Zwecke genügt zunächst ein sehr einfacher Sensor, der ein 0- oder 1-Signal liefert und idealerweise direkt am &#039;Input Pin 1&#039; des PiFace angeschlossen werden kann. So liegt beim Input Pin 1 das Signal &#039;1&#039; an, wenn eine Verbindung zu &#039;Input GND&#039; besteht.&lt;br /&gt;
Z.B. können 2 unisolierte Drähte so plaziert werden, dass ein vorbeifahrendes Fahrzeug einen von ihnen genügend bewegt um den Kontakt kurze Zeit zu öffnen. Genau dann liefert dieser &#039;Sensor&#039; das Signal &#039;0&#039;. Eine - die Schwerkraft nutzende - mögliche Bauform ist rechts abgebildet ;-)&lt;br /&gt;
&lt;br /&gt;
c. Natürlich werden zusätzlich 2 isolierte Drähte benötigt, um jeden der beiden offenen Drähte geschützt mit Input Pin 1 und Input GND zu verbinden.&lt;br /&gt;
&lt;br /&gt;
d. Bei jeder Durchfahrt liefert der Sensor nun ein &#039;0&#039;-Signal, was im Script sowohl für eine Zeitmessung als auch für ein &#039;Schaltintervall-Array&#039; genutzt werden kann. Dort können abwechselnd für beide Spannungen Zeiten (die in etwa zum jeweiligen Streckenabschnitt passt) &#039;programmiert&#039; werden. Statt Taste 1 wird nun der Sensor ausgewertet (wobei Taste 1 als Sensor-Ersatz insoweit genutzt werden kann, dass sie gedrückt bleiben bzw. kurz losgelassen werden muss). Zur genaueren Zeitmessung wird noch das modul &#039;clock&#039; benötigt. &amp;quot;&amp;lt;tt&amp;gt;wandler3.py&amp;lt;/tt&amp;gt;&amp;quot; könnte also so aussehen:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 # wandler3.py&lt;br /&gt;
 &lt;br /&gt;
 from time import clock&lt;br /&gt;
 import piface.pfio as pfio&lt;br /&gt;
 sensor_1=1&lt;br /&gt;
 sensor_2=0&lt;br /&gt;
 rundenzahl=0&lt;br /&gt;
 v_wechsel=0&lt;br /&gt;
 vorrunde=0&lt;br /&gt;
 index_zaehler=1&lt;br /&gt;
 &lt;br /&gt;
 zeit_array=[0,0.2,0.4,0.2,0.4,0.2,0.4,0.2,5,0.2,6]&lt;br /&gt;
 # dieses array enthält die sek. bis zum Spannungswechsel&lt;br /&gt;
&lt;br /&gt;
 array_laenge=9&lt;br /&gt;
 # legt fest, wie viel Werte des arrays genutzt werden sollen&lt;br /&gt;
 &lt;br /&gt;
 sensor_aus=1.3&lt;br /&gt;
 # bis der Sensor sicher in die Ruhestellung kippt, wird er nicht ausgelesen&lt;br /&gt;
  &lt;br /&gt;
 pfio.init()&lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 pfio.digital_write(1,1)&lt;br /&gt;
&lt;br /&gt;
 # das Fahrzeug wird langsam zum Start (=Sensor) bewegt&lt;br /&gt;
 while sensor_1 == 1 :&lt;br /&gt;
   sensor_1=pfio.digital_read(1)&lt;br /&gt;
  &lt;br /&gt;
 print &amp;quot;fliegender Start... zum Beenden Taste 2 drücken&amp;quot;&lt;br /&gt;
 print &amp;quot;Runde Nr., Ges.Zeit, Rundenzeit, mittlere Rundenzeit&amp;quot;&lt;br /&gt;
 start_zeit=clock()&lt;br /&gt;
 runden_start=start_zeit&lt;br /&gt;
  &lt;br /&gt;
 while sensor_2 == 0 :&lt;br /&gt;
   sensor_2=pfio.digital_read(2)&lt;br /&gt;
   v_wechsel=1-v_wechsel&lt;br /&gt;
   pfio.digital_write(2,v_wechsel)&lt;br /&gt;
   sensor_zeit=clock()&lt;br /&gt;
  &lt;br /&gt;
   while zeit_array[index_zaehler]+sensor_zeit &amp;gt; clock() :&lt;br /&gt;
     if runden_start+sensor_aus &amp;lt; clock() :&lt;br /&gt;
 &lt;br /&gt;
       sensor_1=pfio.digital_read(1) &lt;br /&gt;
       if sensor_1 == 0 :&lt;br /&gt;
         rundenzahl=rundenzahl+1&lt;br /&gt;
         runden_start=clock()&lt;br /&gt;
         zeit=runden_start-start_zeit&lt;br /&gt;
         print rundenzahl, zeit, zeit-vorrunde, zeit/rundenzahl&lt;br /&gt;
         vorrunde=zeit&lt;br /&gt;
         sensor_zeit=0&lt;br /&gt;
         index_zaehler=0&lt;br /&gt;
         v_wechsel=0&lt;br /&gt;
  &lt;br /&gt;
   index_zaehler=index_zaehler+1&lt;br /&gt;
   if index_zaehler &amp;gt; array_laenge :&lt;br /&gt;
     sensor_2=1&lt;br /&gt;
     print &amp;quot;array-Ende erreicht!&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
 pfio.digital_write(2,0)&lt;br /&gt;
 pfio.digital_write(1,0)&lt;br /&gt;
 print &amp;quot;Outp 1 &amp;amp; 2 auf 0!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wird das Array-Ende erreicht, wurden entweder zu wenige Einträge vorgesehen oder es befindet sich kein Fahrzeug (mehr) auf der Strecke, das den Sensor und damit des Zurücksetzen des Arrays auslösen konnte.&lt;br /&gt;
&lt;br /&gt;
e. Das Array ist an die jeweilige Strecke anzupassen, wobei der vorderste Eintrag ungenutzt bleibt und dann mit der Dauer für maximale Spannung begonnen wird. Solange man mit Relais arbeitet, sollten die Schaltzeiten nicht zu kurz sein (&amp;gt;0.1 sek), da diese eine gewisse mechanische Trägheit besitzen.&lt;br /&gt;
&lt;br /&gt;
f. Eben diese mechanische Beschaffenheit der Relais (Verschleiß) ist auch ein guter Grund, auf &#039;volle&#039; digitale Signalumwandlung umzustellen.&lt;br /&gt;
&lt;br /&gt;
= Optokoppler als Ersatz für Relais =&lt;br /&gt;
&lt;br /&gt;
Ähnlich wie ein Relais dient ein [[Optokoppler]] dazu, eine Signalübertragung zwischen zwei getrennten Stromkreisen zu ermöglichen. Hier liegt der Einsatz von Optokopplern nahe, da sie schneller schalten und keine beweglichen Teile besitzen. Für unsere Zwecke benötigen wir nun als zusätzliche Elemente: Optokoppler (CNY 17-4), npn-[[Transistor]]en (BC 337-40) zur Signalverstärkung sowie einige Widerstände im Bereich von 2k und 400 Ohm. &lt;br /&gt;
&lt;br /&gt;
== Kaskadierung von Transistoren zur Signalverstärkung ==&lt;br /&gt;
&lt;br /&gt;
[[Bild:PiF_CNY_BC_1.png|thumb|right|500px|Optokoppler mit Transistor]]a. Entsprechend Schritt 2.4.d. (ein Relais bei 50 Ohm) wird zunächst ein Optokoppler eingesetzt, dessen Signal durch einen Transistor verstärkt wird, um die &#039;Grundspannung&#039; zu schalten (Pin 3 und 6 beim Optokoppler sollten unbeschaltet bleiben, allein der &#039;Lichtstrom&#039; reicht für eine Durchschaltung aus).&lt;br /&gt;
&lt;br /&gt;
b. Da immer mit einer gewissen Toleranz bei allen Komponenten zu rechnen ist, kann es sein, dass u.U. die Widerstände etwas größer oder kleiner gewählt werden müssen. Beim Ausprobieren sollte man hier in 10% Schritten variieren.&lt;br /&gt;
&lt;br /&gt;
c. Bei Austesten mit Emulator oder Script ist auch zu beachten, dass nun &#039;Output Pin 8&#039; genutzt wird, da dieser nicht mit den Relais verschaltet ist.&lt;br /&gt;
&lt;br /&gt;
== Umsetzung von 3 Schaltstufen mit Optokopplern ==&lt;br /&gt;
&lt;br /&gt;
[[Bild:SmPiFu2ou2T.png|thumb|right|500px|Kombination von 2 Optokopplern]]a. Entsprechend dem Vorgehen beim Relais kann nun auch der kleine Widerstand zusätzlich beschaltet werden um seine gesteuerte Überbrückung zu ermöglichen. Da hier eine relativ geringe Spannung aufgeschaltet wird, kann zusätzlich eine Diode eingesetzt werden, die die Schaltstufe &#039;maximale Spannung&#039; anzeigt.&lt;br /&gt;
&lt;br /&gt;
b. Vor dem Testen ist wieder zu beachten, dass nun zusätzlich &#039;Output Pin 7&#039; genutzt wird (statt Output Pin 2).&lt;br /&gt;
&lt;br /&gt;
c. Eine mögliche Realisierung sieht so aus:...&lt;br /&gt;
&lt;br /&gt;
== Zusätzliche Erhöhung der Schaltstufen bei D/A-Wandlern ==&lt;br /&gt;
&lt;br /&gt;
[[Bild:Sm3ou3t2.png|thumb|right|500px|Erhöhung der Schaltstufen]]a. Zwar benötigen wir in unserem speziellen Beispiel eine &#039;Grundspannung&#039;, die sich dahingehend auswirkt, dass - wie unter 3.1.c. erwähnt - eine Signalkombination nicht ausgewertet wird, aber mit jeder weiteren Schaltstufe würde sich dieses Problem (theoretisch relativieren), da bei geschickter Auswahl der Widerstände (z.B. im Verhältnis 1 zu 2) jeweils eine Verdoppelung der Kombinationsmöglichkeiten erreichbar ist.&lt;br /&gt;
&lt;br /&gt;
b. Wird hier der 50 Ohm Widerstand asymmetrisch geteilt (z.B. 15 + 35 Ohm, s.a. [[Spannungsteiler]]) um dort ein weiteres Signal umsetzen zu können, ergeben sich direkt folgende 5 Schaltstufen (aus, 50, 35, 15 und 0 Ohm) u.s.w.&lt;br /&gt;
&lt;br /&gt;
c. Zur Ansteuerung dieser Schaltstufen ist das Script so zu ändern, dass nun zwischen mehr als 2 Stufen gewechselt werden kann und im Array entsprechende Zusatzdaten vorgegeben und ausgelesen werden. Mehr als diese Stufen sind im konkreten Fall aber nicht sinnvoll, da die entstehende Verlustleistung in der Schaltung die maximal verfügbare Leistung reduziert.&lt;br /&gt;
&lt;br /&gt;
= Weiterführende Ideen =&lt;br /&gt;
&lt;br /&gt;
== Hardwareseitige Ausbauvarianten ==&lt;br /&gt;
&lt;br /&gt;
Dem Ausbau dieses Ansatzes sind kaum Grenzen gesetzt:&lt;br /&gt;
&lt;br /&gt;
- beispielhafte Umsetzung einer differenzierten Abstufung mittels mittels einer logarithmischen Einteilung oder eines möglichst oft durch 2 teilbaren Anfangswertes und der Teiler (640 Ohm, 320, 160...);&lt;br /&gt;
&lt;br /&gt;
- Nachbau des Projekts mit einem Microcontroller (ggf. mit LCD-Anzeige);&lt;br /&gt;
&lt;br /&gt;
- Umbau der Steuerung mit dem Ziel, sie direkt an die GPIO-Pins des RPi anzuschließen;&lt;br /&gt;
&lt;br /&gt;
- Ergänzung um eine Sensorik, die in diesem Beispiel eine Rückmeldung liefert, ob ein Verbraucher aktiv ist oder nicht (Fahrzeug noch auf der Strecke?);&lt;br /&gt;
&lt;br /&gt;
- Einsatz anderer Sensortechniken und/oder mehrerer Sensoren zur Optimierung der Schnelligkeit oder parallelen Steuerung eines 2. Fahrzeuges;&lt;br /&gt;
&lt;br /&gt;
== Softwareseitige Ausbauvarianten ==&lt;br /&gt;
&lt;br /&gt;
- Optimierung des Scripts, indem die Sensor-Abfrage über einen &#039;Listener&#039; umgesetzt wird;&lt;br /&gt;
&lt;br /&gt;
- Erweiterung des Scripts um eine GUI mit Hilfe der python-lib Tkinter, um einen Nutzerzugriff auf das Steuerarray und/oder eine &#039;Verwaltung&#039; mehrerer Fahrzeuge;&lt;br /&gt;
&lt;br /&gt;
- Einbindung eines Web-Interface um eine &#039;Fernsteuerung&#039; zu ermöglichen...&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [http://hackaday.com/2013/01/23/replacement-controllers-for-slot-car-racing/ ähnliches Projekt bei &#039;hackaday&#039;] &lt;br /&gt;
* [https://docs.google.com/folder/d/0B-UAZ9CyJCLGQjJ3RDlqa2pqaDg/edit?pli=1&amp;amp;docId=0B-UAZ9CyJCLGNmpMeVpyYlZJUWc Relaisschaltung mit pädagogischer Erweiterung d. Universität Manchester]&lt;br /&gt;
* [http://elinux.org/RPi_Projects/PiFace_controlling_a_slot-car parallele englischsp. Dokumentation dieses Projekts mit anderem Schwerpunkt] &lt;br /&gt;
* [http://elinux.org/RPi_Projects englischsp. Projektliste zum RPi]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Raspberry Pi]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Mknot9</name></author>
	</entry>
</feed>