Differences
This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
| efinf:blc2016:bu1:projekt2:projekt [2017/03/16 15:09] – [Code] jannis_widmer | efinf:blc2016:bu1:projekt2:projekt [2017/03/17 08:25] (current) – [Code] jannis_widmer | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | {{backlinks> | ||
| + | ====== Laserkommunikation - Datenübertragung via Lichtwellen ===== | ||
| + | ==== Autoren ==== | ||
| + | Teng, Jannis, Luca | ||
| + | ==== Idee und Fernziel ==== | ||
| + | |||
| + | Das Ziel des Projekts ist es, mit Lasern Daten zwischen 2 Arduino-Boards auszutauschen. | ||
| + | ==== Minimalprojekt ==== | ||
| + | |||
| + | Das Ziel ist die Herstellung eines " | ||
| + | Das Programm funktioniert in beide Richtungen, es ist also sowohl möglich Text zu senden als auch zu empfangen. | ||
| + | ===== Bericht ===== | ||
| + | ==== Material ==== | ||
| + | |||
| + | Für jeden Client wurden folgende Materialien benötigt: | ||
| + | |||
| + | * 1x Arduino | ||
| + | * 1x 100Ω Widerstand | ||
| + | * 1x Trimpot | ||
| + | * 1x Laser | ||
| + | * 1x Photodiode | ||
| + | ==== Aufbau ==== | ||
| + | |||
| + | === Schema: === | ||
| + | |||
| + | {{: | ||
| + | |||
| + | === 1. Version: === | ||
| + | |||
| + | {{: | ||
| + | |||
| + | === 2. Version: === | ||
| + | |||
| + | {{: | ||
| + | |||
| + | === 3. Version: === | ||
| + | |||
| + | {{: | ||
| + | |||
| + | |||
| + | |||
| + | ==== Code ==== | ||
| + | |||
| + | [[https:// | ||
| + | |||
| + | <hidden Code anzeigen> | ||
| + | <code c++> | ||
| + | |||
| + | /** | ||
| + | Software zur Kommunikation zwischen zwei Lasern mittels Lasern & Photodioden | ||
| + | Infos zum Projekt: https:// | ||
| + | Autoren: Teng Jiang, Luca Näf & Jannis Widmer (KSBG 2017) | ||
| + | |||
| + | Funktionsweise: | ||
| + | Setup: | ||
| + | PINs aktualisieren | ||
| + | |||
| + | Senden: | ||
| + | Text in Serial Monitor eingeben. | ||
| + | Empfangen: | ||
| + | Serial Monitor öffnen und Text empfangen | ||
| + | |||
| + | **/ | ||
| + | |||
| + | |||
| + | // PIN-Vergaben auf den Arduino Boards | ||
| + | #define LASERPIN 4 | ||
| + | #define PHOTOPIN 3 | ||
| + | |||
| + | |||
| + | enum Action { | ||
| + | Send, Receive | ||
| + | }; | ||
| + | |||
| + | class Info { | ||
| + | public: | ||
| + | Info() { | ||
| + | WAITTRUEBIT = 40; | ||
| + | WAITFALSEBIT = 20; | ||
| + | WAITBIT = 10; | ||
| + | WAITAFTERBIT = 10; | ||
| + | COUNTBORDER = 15; | ||
| + | } | ||
| + | int LASER; | ||
| + | int PHOTO; | ||
| + | int WAITTRUEBIT; | ||
| + | int WAITFALSEBIT; | ||
| + | int WAITBIT; | ||
| + | int WAITAFTERBIT; | ||
| + | int COUNTBORDER; | ||
| + | }; | ||
| + | |||
| + | |||
| + | // Klasse um Datenpakete zu senden | ||
| + | class LaserWriter | ||
| + | private: | ||
| + | void writeBit(bool t) { | ||
| + | | ||
| + | if(t) { | ||
| + | delay(point-> | ||
| + | } | ||
| + | else { | ||
| + | delay(point-> | ||
| + | } | ||
| + | digitalWrite(point-> | ||
| + | delay(point-> | ||
| + | } | ||
| + | |||
| + | Info *point; | ||
| + | protected: | ||
| + | void setInfo(Info *point) { | ||
| + | this-> | ||
| + | } | ||
| + | |||
| + | // Startsignal abwarten | ||
| + | void waitForCall() { | ||
| + | while(!digitalRead(point-> | ||
| + | delay(point-> | ||
| + | } | ||
| + | |||
| + | // Funktion um Zeichen zu senden | ||
| + | void writeByte(char t) { | ||
| + | | ||
| + | | ||
| + | } | ||
| + | } | ||
| + | |||
| + | // Funktion um Integer zu senden | ||
| + | void writeInteger(int l) { | ||
| + | char t; | ||
| + | | ||
| + | t = 0; | ||
| + | t = t | l; | ||
| + | l >> 8; | ||
| + | | ||
| + | | ||
| + | } | ||
| + | } | ||
| + | |||
| + | |||
| + | }; | ||
| + | |||
| + | |||
| + | // Klasse um Datenpakete zu empfangen | ||
| + | class LaserReader { | ||
| + | private: | ||
| + | Info *point; | ||
| + | |||
| + | protected: | ||
| + | void setInfo(Info *point) { | ||
| + | this-> | ||
| + | } | ||
| + | |||
| + | // Funktion um Zeichen zu empfangen: | ||
| + | char readChar(){ | ||
| + | // Deklarierung und Initilaisierung: | ||
| + | int nextbyte = 0; | ||
| + | int bitcount = 0; | ||
| + | // Startsignal geben: | ||
| + | digitalWrite(point-> | ||
| + | delay(point-> | ||
| + | digitalWrite(point-> | ||
| + | // Bytes Empfangen: | ||
| + | for (int c = 0; c<8; c++) { // Bit-Iteration | ||
| + | while(not(digitalRead(point-> | ||
| + | while(digitalRead(point-> | ||
| + | bitcount ++; delay(2); | ||
| + | } | ||
| + | if (bitcount < point-> | ||
| + | else {nextbyte = nextbyte << 1 | 1;} | ||
| + | bitcount = 0; | ||
| + | } | ||
| + | char c = nextbyte; | ||
| + | return c; | ||
| + | } | ||
| + | |||
| + | // Funktion um Integer zu empfangen: | ||
| + | int readInt(){ | ||
| + | // Deklarierung und Initilaisierung | ||
| + | int nextbyte = 0; | ||
| + | int bitcount = 0; | ||
| + | // Startsignal geben | ||
| + | digitalWrite(point-> | ||
| + | delay(point-> | ||
| + | digitalWrite(point-> | ||
| + | // Bytes Empfangen | ||
| + | for (int c = 0; c<8; c++) { // Bit-Iteration | ||
| + | while(not(digitalRead(point-> | ||
| + | while(digitalRead(point-> | ||
| + | bitcount ++; delay(2); | ||
| + | } | ||
| + | if (bitcount < point-> | ||
| + | else {nextbyte = nextbyte << 1 | 1;} | ||
| + | bitcount = 0; | ||
| + | } | ||
| + | return nextbyte; | ||
| + | } | ||
| + | |||
| + | }; | ||
| + | |||
| + | // Protokoll-Klasse um Empfangen und Senden zu vereinbaren | ||
| + | class LaserProtoc : LaserWriter, | ||
| + | public: | ||
| + | LaserProtoc() { | ||
| + | LaserWriter:: | ||
| + | LaserReader:: | ||
| + | } | ||
| + | |||
| + | // String Senden | ||
| + | void sendString(String toSend) { | ||
| + | int x = toSend.length(); | ||
| + | waitForCall(); | ||
| + | writeInteger(x); | ||
| + | for(int st = 0; st < x - 1; st++) { | ||
| + | waitForCall(); | ||
| + | writeByte(toSend[st]); | ||
| + | } | ||
| + | } | ||
| + | |||
| + | // String empfangen | ||
| + | String receiveString() { | ||
| + | String ret = ""; | ||
| + | int x = readInt(); | ||
| + | for(int st = 0; st < x; st++) { | ||
| + | ret += readChar(); | ||
| + | } | ||
| + | return ret; | ||
| + | } | ||
| + | |||
| + | // Funktion um zu Senden und zu Empfangen | ||
| + | bool drive(Action &what, String & | ||
| + | String h = ""; | ||
| + | if(digitalRead(dInfo.PHOTO)) { | ||
| + | what = Receive; | ||
| + | while(digitalRead(dInfo.PHOTO)); | ||
| + | delay(50); | ||
| + | stringVal = receiveString(); | ||
| + | return true; | ||
| + | } | ||
| + | h = Serial.readString(); | ||
| + | if(h != "" | ||
| + | Serial.println(" | ||
| + | digitalWrite(dInfo.LASER, | ||
| + | delay(1200); | ||
| + | digitalWrite(dInfo.LASER, | ||
| + | sendString(h); | ||
| + | Serial.println(" | ||
| + | what = Send; | ||
| + | stringVal = h; | ||
| + | return true; | ||
| + | } | ||
| + | return false; | ||
| + | } | ||
| + | |||
| + | void SetLaser(int port) { | ||
| + | dInfo.LASER = port; | ||
| + | } | ||
| + | |||
| + | void SetPhoto(int port) { | ||
| + | dInfo.PHOTO = port; | ||
| + | } | ||
| + | private: | ||
| + | Info dInfo; | ||
| + | }; | ||
| + | |||
| + | |||
| + | LaserProtoc lClass; | ||
| + | |||
| + | // PINS initialisieren | ||
| + | void setup() { | ||
| + | lClass.SetLaser(LASERPIN); | ||
| + | pinMode(LASERPIN, | ||
| + | lClass.SetPhoto(PHOTOPIN); | ||
| + | pinMode(PHOTOPIN, | ||
| + | Serial.begin(115200); | ||
| + | } | ||
| + | |||
| + | void loop() { | ||
| + | |||
| + | String l; | ||
| + | Action w; | ||
| + | |||
| + | if(lClass.drive(w, | ||
| + | if(w == Send) { | ||
| + | Serial.print(" | ||
| + | Serial.println(l); | ||
| + | } | ||
| + | else { | ||
| + | Serial.print(" | ||
| + | Serial.print(l); | ||
| + | } | ||
| + | } | ||
| + | |||
| + | |||
| + | } | ||
| + | |||
| + | </ | ||
| + | |||
| + | </ | ||
| + | ==== Fazit ==== | ||
| + | |||
| + | Mit dem Programm ist es nun möglich zwischen 2 Computern mit Hilfe der Arduinos über Laserkommunikation zu chatten (Dabei können beide Sender und Receiver sein). Die Verzögerung ist sehr Hoch, da die Infomationen bit-weise transportiert werden. D. h. bei einem langen Satz wird die Wartenszeit deutlich merkbar. Die maximale Reichweite wurde nicht überprüft, | ||
| + | |||
| + | ==== Fotos und Film ==== | ||
| + | |||
| + | {{: | ||