- Timestamp:
- Aug 15, 2016, 11:40:12 PM (8 years ago)
- Location:
- de/lernprojekte/arduino-projekt-programme
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
de/lernprojekte/arduino-projekt-programme/fax_v1_0_arduino_.pde.txt
r284 r1011 1 int dataPin = 3; // Pin zum Einlesen der Pixel 2 int interruptPin = 2; // Pin fuer Zeilenumbruch 1 /* 2 ******************************************************************** 3 4 Programm zur Wandlung des Ausgangssignals des Siemens-Hell-FAX-Gerätes/ 5 KF 108 in einen Datenstrom über den seriellen Port (USB, 115200 bd) 6 Pin 3 wird mit dem verstärkten/gewandelten Ausgangssignal des FAX 7 verbunden. Programm sendet "0" bei LOW an Pin 3, "1" bei HIGH 8 Ein Reed-Relais auf der Achse des Fax wird durch einen mitlaufenden 9 Magnet pro Umdrehung einmal geschlossen und zieht Pin 2 auf LOW- 10 Das Programm sendet "2", wenn auf Pin 2 eine Flanke erkannt wird. 11 12 Der Datenstrom des Arduino wird durch ein Programm auf dem PC in 13 eine Grafik gewandelt. 14 15 technikum29, 15.8.2016 16 ********************************************************************* 17 */ 18 int dataPin = 3; // Pin zum Einlesen der Pixel 19 int interruptPin = 2; // Pin fuer Zeilensync 20 int sum = 0; // Aufsummieren des Signals 21 unsigned int verzoegerung = 500; // Verzögerung in us 22 23 /* empfohlene Verzögerung liegt zwischen 500 und 250 us, Optimum 24 * für KF 108 bei 300 us. Je nach Verögerung ist im zugehörigen 25 * PC-Empfangs-Programm der Faktor yScal anzupassen 26 */ 27 28 // Programm-Initialisierung 3 29 4 30 void setup(){ 5 Serial.begin(115200); // Datenübertragungsrate (Baud-Rate) 6 31 Serial.begin(115200); // Datenübertragungsrate (Baud-Rate) 7 32 pinMode(dataPin,INPUT); // Pins werden als Dateneingaenge konfiguriert 8 33 pinMode(interruptPin,INPUT); 9 digitalWrite(interruptPin,HIGH); 10 34 digitalWrite(interruptPin,HIGH); 11 35 attachInterrupt(0,newLine,RISING); // Interrupt (Unterbrechung) fuer Zeilenumbruch wird festgelegt 12 36 } 13 37 38 // Dauerschleife 39 14 40 void loop(){ 15 if(digitalRead(dataPin)==HIGH){ // Bei Spannung, also schwarz, wird eine "1" gesendet, sonst eine "0" 41 if(digitalRead(dataPin)==HIGH){ 42 // Bei Spannung, also schwarz, wird eine "1" gesendet, sonst eine "0" 16 43 Serial.print("1"); 17 44 }else{ 18 45 Serial.print("0"); 19 46 } 20 delay (0.1);// Zeitverzoegerung zwischen den Pixeln47 delayMicroseconds(verzoegerung); // Zeitverzoegerung zwischen den Pixeln 21 48 } 22 49 23 void newLine(){ 50 // Interruptroutine, wird durch Magnetschalter ausgelöst 51 52 void newLine(){ 24 53 Serial.print("2"); // Bei Interrupt zum Zeilenumbruch wird eine "2" gesendet 25 54 } 55 56 -
de/lernprojekte/arduino-projekt-programme/fax_v1_1.pde.txt
r284 r1011 1 import processing.serial.*; 1 /* 2 **************************************************************** 3 4 Programm zur Darstellung des Datenstroms (des "Bildes") des 5 Siemens-Hell Faxgerätes KF 108 6 7 Am seriellen (USB) Eingang muß ein Arduino angeschlossen sein, 8 der das Ton(Bild) Signal des FAX in einen seriellen Datenstrom 9 (Baudrate 115200) von "0", "1" und "2" wandelt. 10 "0" bzw "1" stehen für das Helligkeitssignal, "2" zeigt das 11 Ende einer Trommelumdrehung an und dient der Synchronisation 12 auf die nächste Spalte. 13 14 Nach 700 Spalten wird das eingelesene Bild abgespeichert unter 15 "Scan_FAX.jpg" im Programmordner. 16 17 R.L. und technikum29, 15.8.2016 18 19 **************************************************************** 20 */ 21 import processing.serial.*; 2 22 Serial serialPort; 23 boolean finished=false; 24 int kx=700; // Breite des Bildes (Spalten) 25 int ky=0; // Höhe des Bildes (Umfang der Trommel in px) 26 int flag = 0; // Startflag 27 float yScal= 0.75; 28 /* yScal richtet sich nach der Verzögerungszeit des Arduino-Programms zur Zeichen- 29 generierung. Der Wert (als FLOAT) ist so einzustellen, daß das **beschriebene** 30 Bildschirmfenster ein Breiten/Höhen-Verhältnis von etwa 2:3 hat 31 */ 32 void setup(){ 33 flag = 0; // Sync-Flag: wird "1" nach Empfang der ersten "2" 34 size(700,1300); // Größe der Zeichenfläche, der 2. Parameter kann ggf bis 35 // bis auf 1000 reduziert werden, um unbeschriebene Leer- 36 // fläche unter dem Bild zu vermeiden 37 noStroke(); // kein Rahmen um die Fläche zeichnen 38 println(Serial.list()); // gibt alle USB-Anschlüsse auf Konsole aus 39 // dieser Befehl erzeugt (unbedenklichen) Fehler, kann auskommentiert werden 40 // er gibt auf der Konsole die vorhandenen COM-Ports aus (also z.B. COM3 COM 15) 3 41 4 boolean finished=false; 5 int scal=1; 6 int kx=630/scal; 7 int ky=0; 8 float yScal=2; 9 10 int verzoeger=0; 11 12 13 14 void setup(){ 15 size(kx,900); 16 noStroke(); 17 println(Serial.list()); 18 //serialPort = new Serial(this, Serial.list()[0], 9600); // Fuer Mac-User 19 serialPort = new Serial(this, Serial.list()[Serial.list().length-1], 115200); // Fuer PC-User 42 // wählt den geeigneten Port aus der Liste Serial.list()[] 43 // serialPort = new Serial(this, Serial.list()[1], 115200); // Fuer Mac-User, funktioniert so 44 // bei PC: ggf den Inhalt von [] durch eine Ziffer ersetzen: 45 // 0 für den ersten durch println... angezeigten COM-Port, 1 für den nächsten usw ... 46 serialPort = new Serial(this, Serial.list()[Serial.list().length-1], 115200); // Fuer PC-User 47 serialPort.clear(); // zur Sicherheit nochmal Datenpuffer löschen 20 48 } 21 49 22 50 void draw(){ 23 24 } 25 26 void serialEvent(Serial serialPort) { 51 // starte mit Spalte# kx=700. zähle runter auf 0 27 52 if (kx>0) { 28 String dataString = serialPort.readString(); 29 println(dataString); 30 if (dataString != null) { 31 for(int i=0; i<dataString.length(); i++){ 32 if(dataString.charAt(i)==48){ 33 fill(255); 34 rect(kx*scal,ky*scal*yScal,scal,scal*yScal); 35 ky++; 36 }else if(dataString.charAt(i)==49){ 37 fill(0); 38 rect(kx*scal,ky*scal*yScal,scal,scal*yScal); 39 ky++; 40 }else if(dataString.charAt(i)==50){ 41 if(ky>300){ 42 ky=0; 43 kx--; 53 String dataString = serialPort.readString(); // lese Seriel-Puffer ein und ... 54 println(dataString); // ... gebe zur Kontrolle auf Konsole aus 55 if (dataString != null) { // nur, wenn auch ein neues Zeichen angekommen ist 56 for(int i=0; i<dataString.length(); i++){ // Eingabestring kann mehrere Zeichen enthalten ! 57 if(dataString.charAt(i)==48){ // Fall "0" 58 if (flag == 1) { // zeichne nur, wenn bereits ein Sync erhalten 59 fill(255); // helles Rechteck malen 60 rect(kx,ky*yScal,1,yScal); 61 ky++; // rücke zu nächstem Pixel vor 44 62 } 63 }else if(dataString.charAt(i)==49){ // Fall "1" 64 if (flag == 1) { // zeichne nur, wenn bereits ein Sync erhalten 65 fill(0); // dunkles Rechteck malen 66 rect(kx,ky*yScal,1,yScal); 67 ky++; // rücke zum nächsten Pixel vor 68 } 69 }else if(dataString.charAt(i)==50){ // Fall "2" Sync-Zeichen vom Magnet 70 if (flag == 0) { // erstes Eintreffen von Sync-Zeichen, ... 71 flag = 1; // ... setze Synflag 72 } 73 else { // wiederholtes Empfangen von "2" 74 if(ky>50){ // akzeptiere neues Sync erst nach 50 Pixeln (Entprellen) 75 // kann ggf entfallen, 76 ky=0; // Anfang neue Spalte: Zeile 0 77 kx--; // nächste Spalte 78 } 79 } 45 80 } 46 81 } … … 48 83 }else if(!finished){ 49 84 finished=true; 50 saveFrame("Scan#000003.jpg"); 85 println("--Ende--"); // Ende-Meldung 86 println("Vorhandene USB-Ports:"); // nur zur Kontrolle wg besserer Lesbarkeit nochmal 87 println(Serial.list()); // gibt alle USB-Anschlüsse auf Konsole aus 88 saveFrame("Scan_FAX.jpg"); // speichere Bild ab 89 println("FAX-Bild gespeichert in File Scan_FAX.jpg im Processingordner"); 90 serialPort.stop(); // seriellen Port abmelden 51 91 } 52 92 }
Note: See TracChangeset
for help on using the changeset viewer.