<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Linux Archives - Nerd Corner</title>
	<atom:link href="https://nerd-corner.com/de/tag/linux/feed/" rel="self" type="application/rss+xml" />
	<link>https://nerd-corner.com/de/tag/linux/</link>
	<description>Craft your dreams!</description>
	<lastBuildDate>Tue, 20 Jul 2021 09:10:48 +0000</lastBuildDate>
	<language>de</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8.2</generator>

<image>
	<url>https://nerd-corner.com/wp-content/uploads/2019/10/cropped-LogoNerdCorner-2-32x32.png</url>
	<title>Linux Archives - Nerd Corner</title>
	<link>https://nerd-corner.com/de/tag/linux/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Upgrade: Datentransfer mittels VLC und LiFi – Pi zu Pi Übertragung</title>
		<link>https://nerd-corner.com/de/upgrade-datentransfer-mittels-vlc-und-lifi-pi-zu-pi-uebertragung/</link>
					<comments>https://nerd-corner.com/de/upgrade-datentransfer-mittels-vlc-und-lifi-pi-zu-pi-uebertragung/#comments</comments>
		
		<dc:creator><![CDATA[Nerds]]></dc:creator>
		<pubDate>Thu, 08 Jul 2021 13:53:33 +0000</pubDate>
				<category><![CDATA[DIY]]></category>
		<category><![CDATA[Hardware-DE]]></category>
		<category><![CDATA[Linux-DE]]></category>
		<category><![CDATA[Software-DE]]></category>
		<category><![CDATA[C Programmierung]]></category>
		<category><![CDATA[CAD]]></category>
		<category><![CDATA[Datenübertragung]]></category>
		<category><![CDATA[Datenübertragung per Licht]]></category>
		<category><![CDATA[Genauigkeit]]></category>
		<category><![CDATA[Hardware]]></category>
		<category><![CDATA[Kommunikationstechnik]]></category>
		<category><![CDATA[LiFi]]></category>
		<category><![CDATA[LiFI Router]]></category>
		<category><![CDATA[Light Fidelity]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Lüfter]]></category>
		<category><![CDATA[Präzision]]></category>
		<category><![CDATA[Raspberry Pi]]></category>
		<category><![CDATA[visible Light communication]]></category>
		<category><![CDATA[visuelle Lichtkommunikation]]></category>
		<category><![CDATA[VLC]]></category>
		<category><![CDATA[zyklische Redundanzprüfung]]></category>
		<guid isPermaLink="false">https://nerd-corner.com/?p=964</guid>

					<description><![CDATA[<p>Nachdem ich bereits einfache Textnachrichten mittels Lichtsignale von einem Raspberry Pi zu einem Arduino Uno übertragen habe ( Link: https://nerd-corner.com/de/textnachrichten-mittels-lichtsignale-senden-pi-zu-arduino/ ) wollte ich dieses System &#8230; </p>
<p>The post <a href="https://nerd-corner.com/de/upgrade-datentransfer-mittels-vlc-und-lifi-pi-zu-pi-uebertragung/">Upgrade: Datentransfer mittels VLC und LiFi – Pi zu Pi Übertragung</a> appeared first on <a href="https://nerd-corner.com/de">Nerd Corner</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Nachdem ich bereits einfache Textnachrichten mittels Lichtsignale von einem Raspberry Pi zu einem Arduino Uno übertragen habe ( Link: <a href="https://nerd-corner.com/de/textnachrichten-mittels-lichtsignale-senden-pi-zu-arduino/">https://nerd-corner.com/de/textnachrichten-mittels-lichtsignale-senden-pi-zu-arduino/</a> ) wollte ich dieses System verbessern, um jegliche Dateiformate in beide Richtungen übertragen zu können. Da ein Raspberry Pi mit Linux betrieben wird, kann dieses System zur Datenübertragung mittels VLC (visueller Lichtkommunikation) auf alle Linux Geräte übertragen werden. Der Software Code und die STL Dateien können am Ende des Blogeintrags heruntergeladen werden.</p>
<p><em><strong>Das könnte dich auch interessieren:</strong> <a href="https://nerd-corner.com/de/textnachrichten-mittels-lichtsignale-senden-pi-zu-arduino/" target="_blank" rel="noopener">Textnachrichten mittels Lichtsignale senden</a></em></p>
<p><em><strong>Eng mit diesem Artikel verbunden:</strong> <a href="https://nerd-corner.com/de/zyklische-redundanzpruefung-in-c/" target="_blank" rel="noopener">Fehlererkennung bei der Datenübertragung</a></em></p>
<p><em><strong>Ebenfalls relevant:</strong> <a href="https://nerd-corner.com/de/wie-programmiert-man-einen-praezisen-timer-in-c-fuer-linux/" target="_blank" rel="noopener">Taktgeschwindigkeit für eine Datenübertragung festlegen in C</a></em></p>
<h2>Liste der Bauteile</h2>
<ul>
<li><a href="https://amzn.to/3zlaLSJ" target="_blank" rel="noopener">2x Raspberry Pi 4</a></li>
<li><a href="https://amzn.to/3zhH6to" target="_blank" rel="noopener">2x 5V Solarzelle</a></li>
<li><a href="https://amzn.to/3rkpOZU" target="_blank" rel="noopener">2x 5V Laserdiode</a></li>
<li><a href="https://amzn.to/2Uu9AkT" target="_blank" rel="noopener">Jumper Kabel</a></li>
<li><a href="https://amzn.to/3exAv6g" target="_blank" rel="noopener">3D Drucker</a></li>
<li><a href="https://amzn.to/3hST9I2" target="_blank" rel="noopener">Filament</a></li>
<li><a href="https://amzn.to/3kwoX7c" target="_blank" rel="noopener">2x 5V Lüfter</a></li>
<li><a href="https://amzn.to/2UvY34L" target="_blank" rel="noopener">NPN Transistor</a></li>
<li>2x ADC Board mit einem LM393</li>
</ul>
<p><img fetchpriority="high" decoding="async" class="aligncenter wp-image-966 zoooom" src="https://nerd-corner.com/wp-content/uploads/2021/07/Assembly-parts-scaled.jpg" alt="Datenübertragung mit Licht Einzelteile" width="2500" height="1681" srcset="https://nerd-corner.com/wp-content/uploads/2021/07/Assembly-parts-scaled.jpg 2560w, https://nerd-corner.com/wp-content/uploads/2021/07/Assembly-parts-300x202.jpg 300w, https://nerd-corner.com/wp-content/uploads/2021/07/Assembly-parts-1024x689.jpg 1024w, https://nerd-corner.com/wp-content/uploads/2021/07/Assembly-parts-768x516.jpg 768w, https://nerd-corner.com/wp-content/uploads/2021/07/Assembly-parts-1536x1033.jpg 1536w, https://nerd-corner.com/wp-content/uploads/2021/07/Assembly-parts-2048x1377.jpg 2048w" sizes="(max-width: 2500px) 100vw, 2500px" /></p>
<h2>Verkabelung</h2>
<p>Anders als bei der Verkabelung im letzten Artikel, in dem Textnachrichten mittels Lichtsignale von einem Pi zu einem Arduino gesendet wurden ( Link: <a href="https://nerd-corner.com/de/textnachrichten-mittels-lichtsignale-senden-pi-zu-arduino/">https://nerd-corner.com/de/textnachrichten-mittels-lichtsignale-senden-pi-zu-arduino/</a> ), gibt es jetzt keinen definierten Empfänger und keinen definierten Sender. Es werden stattdessen zwei baugleiche Stationen aufgebaut, die sowohl Daten senden und empfangen können.</p>
<p><img decoding="async" class="aligncenter wp-image-965 zoooom" src="https://nerd-corner.com/wp-content/uploads/2021/07/FritzingPiTransceiver_Steckplatine.png" alt="Fritzing Pi VLC LiFI" width="2250" height="1459" srcset="https://nerd-corner.com/wp-content/uploads/2021/07/FritzingPiTransceiver_Steckplatine.png 2270w, https://nerd-corner.com/wp-content/uploads/2021/07/FritzingPiTransceiver_Steckplatine-300x195.png 300w, https://nerd-corner.com/wp-content/uploads/2021/07/FritzingPiTransceiver_Steckplatine-1024x664.png 1024w, https://nerd-corner.com/wp-content/uploads/2021/07/FritzingPiTransceiver_Steckplatine-768x498.png 768w, https://nerd-corner.com/wp-content/uploads/2021/07/FritzingPiTransceiver_Steckplatine-1536x996.png 1536w, https://nerd-corner.com/wp-content/uploads/2021/07/FritzingPiTransceiver_Steckplatine-2048x1328.png 2048w" sizes="(max-width: 2250px) 100vw, 2250px" /></p>
<p>Aus diesem Grund werden die Raspberry Pi’s sowohl mit einem 5V Laser als auch mit einer 5V Solarzelle verbunden. Für den Laser wurde der GPIO18 Pin gewählt, welcher in der „wiringPi“ Library Pin 1 entspricht. Die „wiringPi“ Library wird im Programmcode verwendet. Direkt unter GPIO18 befindet sich ein Ground, welcher mit dem Minus Pol des Lasers verbunden wird.</p>
<p><img decoding="async" class="aligncenter wp-image-967 zoooom" src="https://nerd-corner.com/wp-content/uploads/2021/07/GPIO.png" alt="Datenübertragung mittels Licht Pi" width="1500" height="1125" srcset="https://nerd-corner.com/wp-content/uploads/2021/07/GPIO.png 1600w, https://nerd-corner.com/wp-content/uploads/2021/07/GPIO-300x225.png 300w, https://nerd-corner.com/wp-content/uploads/2021/07/GPIO-1024x768.png 1024w, https://nerd-corner.com/wp-content/uploads/2021/07/GPIO-768x576.png 768w, https://nerd-corner.com/wp-content/uploads/2021/07/GPIO-1536x1152.png 1536w" sizes="(max-width: 1500px) 100vw, 1500px" /></p>
<p>Die Solarzelle liefert je nach Lichtintensität einen entsprechenden Spannungswert. Da die digitalen Pins des Raspberry Pi aber nur 1 und 0 erkennen können, muss mit Hilfe eines Komparators der analoge Wert der Solarzelle in einen digitalen Wert gewandelt werden. Der Vorgang wird genauer im Abschnitt „ADC Board mit einem LM393 Komparator“ erläutert. Für die Verkabelung wird der Plus und Minus Pol der Solarzelle mit den Plus und Minus Kontakten des ADC Boards verbunden. Anschließend wird der Ground des ADC Boards an einen Raspberry Pi Ground verbunden und für die Spannungsversorgung der Plus Pol des ADC Boards mit 5V des Pi verbunden. Der D0 Pin des ADC Boards liefert den digitalen Wert 0 oder 1, abhängig von der Lichtintensität der Solarzelle. Diesen Pin habe ich mit GPIO17, welcher in der „wiringPi“ Library Pin 0 entspricht, verbunden.</p>
<p>Da mir aufgefallen ist, dass der Pi im Betrieb sehr heiß wird, habe ich noch einen Lüfter angeschlossen. Damit der Lüfter sich nicht dauerhaft im Betrieb befindet, was sich negativ auf die Leistung des Lasers auswirken würde, kann der Lüfter durch einen NPN Transistor geschalten werden. Hierfür verbindet man den Plus Pol des Lüfters direkt mit einem 5V Pin des Raspberry Pi und den Minus Pol des Lüfters mit dem Emitter des NPN Transistors. Der Collector des Transistors wird mit einem Ground des Pi verbunden. Um nun den Lüfter über den Transistor ein- und ausschalten zu können wird die Transistor Basis mit einem GPIO Pin verbunden. Ich habe beispielsweise GPIO27 (entspricht in der „wiringPi“ Library Pin 2) gewählt. In der Nachfolgenden Tabelle werden die Pins des Pi der Nummerierung der „wiringPi“ Library gegenüber gestellt.</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-940 zoooom" src="https://nerd-corner.com/wp-content/uploads/2021/06/pinbelegung-Pi.png" alt="VLC Textnachrichten visuelle Lichtkommunikation wiringPi Datenübertragung mit Licht" width="599" height="295" srcset="https://nerd-corner.com/wp-content/uploads/2021/06/pinbelegung-Pi.png 600w, https://nerd-corner.com/wp-content/uploads/2021/06/pinbelegung-Pi-300x148.png 300w" sizes="auto, (max-width: 599px) 100vw, 599px" /></p>
<h2>ADC Board mit einem LM393 Komparator</h2>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-968 zoooom" src="https://nerd-corner.com/wp-content/uploads/2021/07/ADC-LM393.jpg" alt="ADC Board mit LM393 Komparator" width="450" height="319" srcset="https://nerd-corner.com/wp-content/uploads/2021/07/ADC-LM393.jpg 771w, https://nerd-corner.com/wp-content/uploads/2021/07/ADC-LM393-300x213.jpg 300w, https://nerd-corner.com/wp-content/uploads/2021/07/ADC-LM393-768x545.jpg 768w, https://nerd-corner.com/wp-content/uploads/2021/07/ADC-LM393-120x85.jpg 120w" sizes="auto, (max-width: 450px) 100vw, 450px" /></p>
<p>Die Solarzelle gibt abhängig von der Lichtintensität einen Spannungswert zurück. Leider hat der Raspberry Pi aber keine analogen Pins um diesen Spannungswert auszulesen. Daher muss das analoge Signal in ein digitales Signal umgewandelt werden. Mit Hilfe des <a href="https://www.ti.com/product/LM393" target="_blank" rel="noopener">LM393</a> Komparators ist das möglich. Dieser ist häufig auf ADC Boards verbaut. Hier habe ich einfach den ursprünglichen Sensor (es war ein Fotowiderstand) durch die Solarzelle ersetzt. Mit Hilfe eines Potentiometers kann der Komparator eingestellt werden. Das bedeutet, sobald der Spannungswert der Solarzelle, welcher von der Lichtintensität abhängt, den eingestellten Wert des Potentiometers übersteigt, wird eine digitale 1 gemessen, anderenfalls eine digitale 0.</p>
<h2>Aufbau des Datenframes</h2>
<p><img loading="lazy" decoding="async" class="zoooom aligncenter wp-image-969" src="https://nerd-corner.com/wp-content/uploads/2021/07/MultipleFrames-1.jpg" alt="Aufbau Datenframe Lichtübertragung Daten Datentransfer mittels VLC" width="1300" height="469" srcset="https://nerd-corner.com/wp-content/uploads/2021/07/MultipleFrames-1.jpg 1409w, https://nerd-corner.com/wp-content/uploads/2021/07/MultipleFrames-1-300x108.jpg 300w, https://nerd-corner.com/wp-content/uploads/2021/07/MultipleFrames-1-1024x369.jpg 1024w, https://nerd-corner.com/wp-content/uploads/2021/07/MultipleFrames-1-768x277.jpg 768w" sizes="auto, (max-width: 1300px) 100vw, 1300px" /></p>
<p>Der Datenframe für das Versenden der Textnachrichten mittels visueller Lichtkommunikation (Link: <a href="https://nerd-corner.com/de/textnachrichten-mittels-lichtsignale-senden-pi-zu-arduino/">https://nerd-corner.com/de/textnachrichten-mittels-lichtsignale-senden-pi-zu-arduino/</a> ) bestand aus einer Preamble, der Länge der Textnachricht, dem Textinhalt und der zyklischen Redundanzprüfung. Um aber statt Textnachrichten alle möglichen Arten von Daten verschicken zu können muss anstelle der Länge der Textnachricht der Dateiname, die Dateiendung, die Gesamtzahl der Pakete und die Nummer des aktuellen Pakets angegeben werden. Anschließend kann der Dateninhalt und der Code der zyklischen Redundanzprüfung angefügt werden.</p>
<h2>Softwarecode für Datentransfer mittels VLC</h2>
<p>Im Grunde wurden die Empfänger- und Senderskripte aus dem vorherigen Projekt zum Senden von Textnachrichten mittels visueller Lichtkommunikation (Link: <a href="https://nerd-corner.com/de/textnachrichten-mittels-lichtsignale-senden-pi-zu-arduino/" target="_blank" rel="noopener">https://nerd-corner.com/de/textnachrichten-mittels-lichtsignale-senden-pi-zu-arduino/</a> ) weiterentwickelt und zu einem gemeinsamen Skript zusammengefasst. Welches auf beiden Raspberry Pi’s Anwendung findet. Es wurde beispielsweise eine „ReadFile“ und „WriteFile“ Funktion ergänzt, welche Dateien einlesen und empfangene Datenpakete zu einer Datei zusammenfassen und abspeichern können. Das Programm wurde wieder in C geschrieben, da eine hohe Geschwindigkeit bei der Datenübertragung erreicht werden soll. Details zur präzisen Programmierung in C für eine schnelle Datenübertragung in diesem Beitrag: <a href="https://nerd-corner.com/de/wie-programmiert-man-einen-praezisen-timer-in-c-fuer-linux/" target="_blank" rel="noopener">https://nerd-corner.com/de/wie-programmiert-man-einen-praezisen-timer-in-c-fuer-linux/</a></p>
<p>Der gesamte Softwarecode zum Datentransfer mittels VLC kann am Ende des Artikels heruntergeladen werden. Der Kern des Programms ist wieder eine State Maschine mit Hilfe derer ausgewählt werden kann, ob Daten gesendet oder empfangen werden sollen. Außerdem schaltet das Programm automatisch den Lüfter an, wenn keine Datenübertragung stattfindet. Wichtig: Beim Kompilieren bitte nicht die „<a href="http://wiringpi.com/" target="_blank" rel="noopener">wiringPi</a>“ Bibliothek und die &#8222;math.h&#8220; Bibliothek vergessen! Der Befehl lautet: „gcc -o transceiver transceiver.c -lwiringPi -lm“</p>
<pre class="EnlighterJSRAW" data-enlighter-language="c" data-enlighter-group="transceiver" data-enlighter-title="transceiver.c">while(1)
    {
        digitalWrite (2, HIGH);
        printf("Press the R button for Receiver Mode or any other key for Sender Mode\n");
        scanf(" %c",&amp;mode);
        
        if (mode=='R'||mode=='r')
        {
            digitalWrite(2,LOW);
            modeReceiver=true;
        }
        
        if (mode!='R'&amp;&amp;mode!='r')
        {
            digitalWrite(2,LOW);
            modeReceiver=false;
            
            char dataName[NAME_MAX];
            char dataExtension[NAME_MAX];
            
               
            printf("\n Name of file WITHOUT extension: ");
            scanf("%s",dataName);

            printf("\n Extension: ");
            scanf("%s",dataExtension);

            if (read_file(dataName, dataExtension, file_content) != OK)
            {
                printf("File read error, size exceeds array size\n");
                return -1;
            }
            BuildDataFrame(dataName, dataExtension, file_content);
        }
        
        
        
        while(modeReceiver)
        {
            gettimeofday(&amp;tval_after, NULL);
            timersub(&amp;tval_after, &amp;tval_before, &amp;tval_result);
            double time_elapsed = (double)tval_result.tv_sec + ((double)tval_result.tv_usec/1000000.0f);
            
            while(time_elapsed &lt; 0.001)
            {
                gettimeofday(&amp;tval_after, NULL);
                timersub(&amp;tval_after, &amp;tval_before, &amp;tval_result);
                time_elapsed = (double)tval_result.tv_sec + ((double)tval_result.tv_usec/1000000.0f);
            }
            gettimeofday(&amp;tval_before, NULL);
            
            int data = digitalRead(0);
            
            
            switch (state)
            {
                case 0:
                    //looking for preamble pattern
                    synchro_Done=false;
                    LookForSynchro(data);
                    
                    if (synchro_Done==true)
                    {
                        state=1;
                    }
                    break;
                    
                case 1:
                    //receive the actual data
                    receiveData_Done=false;
                    senderState=false;
                    ReceiveData(data);
                    
                    if(receiveData_Done&amp;&amp;senderState==false)
                    {
                        state=0;
                    }
                    if(senderState==true){
                        senderState=false;
                        state=0;
                        modeReceiver=false;
                        }
                    break;
                  
            }
            
        }
    }</pre>
<p>&nbsp;</p>
<h2>Gehäuse</h2>
<p>Um die Komponenten an Ort und Stelle fixieren zu können, wurde im CAD ein Gehäuse konstruiert. Dies hat auch den Vorteil, dass keine komplizierte Ausrichtung der Laser und der Solarzellen für die Datenübertragung notwendig ist. Für Anfänger eignet sich TinkerCAD zum Gehäuse design. TinkerCAD ist kostenlos und kann direkt im Browser benutzt werden. Alternativ können die STL Files für den 3D Drucker auch hier heruntergeladen werden.</p>
<p><img loading="lazy" decoding="async" class="zoooom aligncenter wp-image-970" src="https://nerd-corner.com/wp-content/uploads/2021/07/gehaeuse-CAD.jpg" alt="Datenübertragung per Licht Gehäuse Datentransfer mittels VLC" width="600" height="530" srcset="https://nerd-corner.com/wp-content/uploads/2021/07/gehaeuse-CAD.jpg 682w, https://nerd-corner.com/wp-content/uploads/2021/07/gehaeuse-CAD-300x265.jpg 300w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p>Das Gehäuse zum Datentransfer mittels VLC besitzt eine Öffnung für die Solarzelle und den Laser. Außerdem wurde ein Abluftschacht für den Lüfter konstruiert und zusätzlich Platz für ein Raspberry Pi Gehäuse frei gelassen. Im nachfolgenden Bild wird der Einbau der Komponenten dargestellt.</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-971 zoooom" src="https://nerd-corner.com/wp-content/uploads/2021/07/assembly-end-scaled.jpg" alt="Datenübertragung per Licht Lifi VLC" width="2500" height="1875" srcset="https://nerd-corner.com/wp-content/uploads/2021/07/assembly-end-scaled.jpg 2560w, https://nerd-corner.com/wp-content/uploads/2021/07/assembly-end-300x225.jpg 300w, https://nerd-corner.com/wp-content/uploads/2021/07/assembly-end-1024x768.jpg 1024w, https://nerd-corner.com/wp-content/uploads/2021/07/assembly-end-768x576.jpg 768w, https://nerd-corner.com/wp-content/uploads/2021/07/assembly-end-1536x1152.jpg 1536w, https://nerd-corner.com/wp-content/uploads/2021/07/assembly-end-2048x1536.jpg 2048w" sizes="auto, (max-width: 2500px) 100vw, 2500px" /></p>
<h2>Fazit zum Datentransfer mittels VLC</h2>
<p>Es wurde das bereits bestehende System zum Senden von Textnachrichten mittels visueller Lichtsignale weiterentwickelt, sodass jetzt alle Arten von Daten gesendet und empfangen werden können. Das System funktioniert erstaunlich erfolgreich. Es ist sehr robust und erreicht eine Datenrate von 1 kBit/s bis 10 kBit/s. Alle ankommenden Datenpakete können durch den intelligenten Aufbau des Datenframes direkt zugeordnet werden. Lediglich ein Acknowledgement Signal wäre noch eine sinnvolle Ergänzung. Ein solches Signal wäre eine Rückmeldung vom Empfänger an den Sender um dem Sender mitzuteilen, dass alle Pakete angekommen sind, oder eventuell ein bestimmtes Paket fehlerhaft war und erneut gesendet werden muss.</p>
<p>Ebenfalls interessant für die Zukunft wäre andere Modulationsarten auszuprobieren. Besonders das speziell für visuelle Lichtkommunikation erdachte Colour Shift Keying würde ich gerne näher untersuchen und die daraus resultierenden Datenraten vergleichen.</p>
<p><img loading="lazy" decoding="async" class="zoooom aligncenter wp-image-972" src="https://nerd-corner.com/wp-content/uploads/2021/07/Assembly-finish-scaled.jpg" alt="Datenübertragung per Licht Gehäuse Lifi VLC Datentransfer mittels VLC" width="2500" height="1125" srcset="https://nerd-corner.com/wp-content/uploads/2021/07/Assembly-finish-scaled.jpg 2560w, https://nerd-corner.com/wp-content/uploads/2021/07/Assembly-finish-300x135.jpg 300w, https://nerd-corner.com/wp-content/uploads/2021/07/Assembly-finish-1024x461.jpg 1024w, https://nerd-corner.com/wp-content/uploads/2021/07/Assembly-finish-768x346.jpg 768w, https://nerd-corner.com/wp-content/uploads/2021/07/Assembly-finish-1536x691.jpg 1536w, https://nerd-corner.com/wp-content/uploads/2021/07/Assembly-finish-2048x922.jpg 2048w" sizes="auto, (max-width: 2500px) 100vw, 2500px" /></p>
<h2>Dateien herunterladen:</h2>
<ul>
<li><a  data-e-Disable-Page-Transition="true" class="download-link" title="" href="https://nerd-corner.com/de/download/977/?tmstv=1756252357" rel="nofollow" id="download-link-977" data-redirect="false" >
	Softwarecode Transceiver</a>
</li>
<li><a href="https://cults3d.com/en/3d-model/various/visible-light-communication-pi-housing" target="_blank" rel="noopener">STL files housing</a></li>
<li><a  data-e-Disable-Page-Transition="true" class="download-link" title="" href="https://nerd-corner.com/de/download/991/?tmstv=1756252357" rel="nofollow" id="download-link-991" data-redirect="false" >
	Pi Case with free pins (Creative Common License from Thingiverse)</a>
</li>
</ul>
<p>&nbsp;</p>
<p>The post <a href="https://nerd-corner.com/de/upgrade-datentransfer-mittels-vlc-und-lifi-pi-zu-pi-uebertragung/">Upgrade: Datentransfer mittels VLC und LiFi – Pi zu Pi Übertragung</a> appeared first on <a href="https://nerd-corner.com/de">Nerd Corner</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://nerd-corner.com/de/upgrade-datentransfer-mittels-vlc-und-lifi-pi-zu-pi-uebertragung/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Wie programmiert man einen präzisen Timer in C für Linux</title>
		<link>https://nerd-corner.com/de/wie-programmiert-man-einen-praezisen-timer-in-c-fuer-linux/</link>
					<comments>https://nerd-corner.com/de/wie-programmiert-man-einen-praezisen-timer-in-c-fuer-linux/#comments</comments>
		
		<dc:creator><![CDATA[Nerds]]></dc:creator>
		<pubDate>Sun, 28 Feb 2021 13:03:04 +0000</pubDate>
				<category><![CDATA[Linux-DE]]></category>
		<category><![CDATA[Software-DE]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[C Programmierung]]></category>
		<category><![CDATA[Genauigkeit]]></category>
		<category><![CDATA[Kommunikationstechnik]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Präzision]]></category>
		<category><![CDATA[Raspberry Pi]]></category>
		<category><![CDATA[Timer]]></category>
		<guid isPermaLink="false">https://nerd-corner.com/?p=833</guid>

					<description><![CDATA[<p>Ich wollte einen Timer in C für meinen Raspberry Pi programmieren, der sowohl für 1 ms als auch für 0,1 ms präzise Arbeitsanweisungen ausführt. Da &#8230; </p>
<p>The post <a href="https://nerd-corner.com/de/wie-programmiert-man-einen-praezisen-timer-in-c-fuer-linux/">Wie programmiert man einen präzisen Timer in C für Linux</a> appeared first on <a href="https://nerd-corner.com/de">Nerd Corner</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Ich wollte einen Timer in C für meinen Raspberry Pi programmieren, der sowohl für 1 ms als auch für 0,1 ms präzise Arbeitsanweisungen ausführt. Da Python zur Laufzeit kompiliert wird, war Python für diesen Zweck leider viel zu langsam. Aus diesem Grund wurde das Programm in C geschrieben. Die 1 ms und 0,1 ms wurden nach der Programmierung mit Hilfe eines Oszilloskops bestätigt.</p>
<p>Nachfolgend eine Erklärung wieso die Library „sys/time.h“ genutzt wurde, sowie ein Codebeispiel mit anschließender Erläuterung. Dieses Codebeispiel eignet sich sehr gut für bitweise Datenübertragung in der Kommunikationstechnik.</p>
<p><em><strong>Das könnte Sie ebenfalls interessieren:</strong> <a href="https://nerd-corner.com/de/arduino-timer-interrupts-arduino-register-programmieren/" target="_blank" rel="noopener">Präzise Timer Interrupts für den Arduino programmieren!</a></em></p>
<h2>Liste der Komponenten</h2>
<ul>
<li><a href="https://amzn.to/3hSZ7bT" target="_blank" rel="noopener">Linux Betriebssystem (zum Beispiel Raspberry Pi)</a></li>
<li>Editor für C &#8211; Programmierung</li>
</ul>
<p><img loading="lazy" decoding="async" class="zoooom aligncenter wp-image-841" src="https://nerd-corner.com/wp-content/uploads/2021/02/proxy-image-3.jpg" alt="Timer in C for Linux" width="498" height="404" srcset="https://nerd-corner.com/wp-content/uploads/2021/02/proxy-image-3.jpg 1084w, https://nerd-corner.com/wp-content/uploads/2021/02/proxy-image-3-300x243.jpg 300w, https://nerd-corner.com/wp-content/uploads/2021/02/proxy-image-3-1024x830.jpg 1024w, https://nerd-corner.com/wp-content/uploads/2021/02/proxy-image-3-768x623.jpg 768w" sizes="auto, (max-width: 498px) 100vw, 498px" /></p>
<h2>Die Library „sys/time.h“</h2>
<p>Funktionen wie „usleep()“ oder „nanosleep()“ würden das komplette Programm anhalten. Für einfache Anwendungen mag das vielleicht ausreichen, allerdings war das für meine Zwecke zu ungenau. Ich wollte einen Timer, der wirklich exakt im 1 ms Takt bzw. 0,1 ms Takt arbeitet. Deswegen wurde anstelle von „usleep()“ oder „nanosleep()“ eine andere Lösung gewählt. Die Library „sys/time.h“. Diese kann die aktuelle „System Clock Time“ (System Uhrzeit) auslesen und vergleichen.</p>
<h2>Codebeispiel für präzisen Timer in C</h2>
<pre class="EnlighterJSRAW" data-enlighter-language="c">#include &lt;sys/time.h&gt;

int main()
{
    struct timeval tval_before, tval_after, tval_result;
    int counter=0;
    bool stop=false;
   
    gettimeofday(&amp;tval_before, NULL);
    while(stop!=true)
    {
        gettimeofday(&amp;tval_after, NULL);
        timersub(&amp;tval_after, &amp;tval_before, &amp;tval_result);
        double time_elapsed = (double)tval_result.tv_sec + ((double)tval_result.tv_usec/1000000.0f);
        
        while(time_elapsed &lt; 0.001)  //1ms; you can change your desired time interval here
        {
            gettimeofday(&amp;tval_after, NULL);
            timersub(&amp;tval_after, &amp;tval_before, &amp;tval_result);
            time_elapsed = (double)tval_result.tv_sec + ((double)tval_result.tv_usec/1000000.0f);
        }
        gettimeofday(&amp;tval_before, NULL);
        
        if (counter==10000)
        {
            stop=true;
        }
            
        else 
        {
            counter++;
        }
    }
    return 0;
}
</pre>
<h2>Erklärung zum Codebeispiel:</h2>
<p>Eine Funktion &#8222;gettimeofday&#8220; schreibt die aktuelle System Uhrzeit in die Variable &#8222;tval_before&#8220;. Eine While Schleife wird anschließend solange ausgeführt bis die eigentliche Aufgabe erledigt ist.</p>
<p>Innerhalb der While Schleife wird als Erstes erneut die System Uhrzeit in eine Variable &#8222;tval_after&#8220; abgespeichert. Anschließend wird die zeitliche Differenz zwischen &#8222;tval_after&#8220; und &#8222;tval_before&#8220; gemessen und in &#8222;tval_result&#8220; abgespeichert.</p>
<p>Der nächste Schritt des Timers in C erschließt sich nicht sofort auf den ersten Blick: &#8222;tv_result&#8220; besteht per Definition aus 2 Teilen. Zum einen ein Sekunden Anteil &#8222;.tv_sec&#8220; und zum anderen ein Mikrosekunden Anteil &#8222;.tv_usec&#8220;. Eben dieser Mikrosekundenanteil muss erst noch durch eine Million geteilt werden, damit man den Wert in Sekunden erhält. Anschließend, kann der Mikrosekundenanteil zum Sekundenanteil addiert werden.</p>
<p>Der addierte Wert wird im Code als &#8222;time_elapsed&#8220; bezeichnet. Falls dieser Wert kleiner als eine Millisekunde ist, wird eine weitere innere While Schleife geöffnet, die solange den Wert für &#8222;time_elapsed&#8220; neu berechnet, bis exakt 1 ms vergangen ist. Anschließend wird mittels der &#8222;gettimeofday&#8220; Funktion der Wert für &#8222;tval_before&#8220; neu festgelegt.</p>
<p>Da zu diesem Zeitpunkt exakt 1 ms vergangen ist, kann der Timer nun seinen eigentlichen Arbeitsschritt ausführen. In diesem einfachen Codebeispiel wird lediglich eine Variable „counter“ um 1 erhöht. Das bedeutet für jeden Intervallschritt (im Codebeispiel 1 ms) erhöht sich der counter um 1. Sobald ein festgelegter Wert für counter erreicht wurde stoppt das Programm. In diesem Fall ist der festgelegte Wert 10000. Anschließend wird die While Schleife beendet. Aber dieser Teil des Codes kann natürlich problemlos für die eigenen Zwecke angepasst werden.</p>
<p>Meine Messungen mit dem Oszilloskop haben eine exakte Frequenz von 1 ms gemessen, sogar 0,1 ms wurde exakt gemessen. Dieses Codebeispiel eignet sich deswegen auch sehr gut für eine exakte <a href="https://de.wikipedia.org/wiki/Daten%C3%BCbertragung">Datenübertragung</a> in der Kommunikationstechnik.</p>
<h2>Dateien herunterladen</h2>
<ul>
<li><a  data-e-Disable-Page-Transition="true" class="download-link" title="" href="https://nerd-corner.com/de/download/835/?tmstv=1756252357" rel="nofollow" id="download-link-835" data-redirect="false" >
	Downloadfile Timer in C</a>
</li>
</ul>
<p>The post <a href="https://nerd-corner.com/de/wie-programmiert-man-einen-praezisen-timer-in-c-fuer-linux/">Wie programmiert man einen präzisen Timer in C für Linux</a> appeared first on <a href="https://nerd-corner.com/de">Nerd Corner</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://nerd-corner.com/de/wie-programmiert-man-einen-praezisen-timer-in-c-fuer-linux/feed/</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
			</item>
	</channel>
</rss>
