Das Lasermikroskop zählt zu meinen aufwendigeren Projekten. Basis bildet der Lesekopf eines alten DVD-Laufwerks und zwei Lautsprecher. Vom Lesekopf wird die rote Laserdiode verwendet. Diese leuchtet auf das zu untersuchende Objekt, welches die Stelle einer CD/DVD vor dem Lesekopf einnimmt. Das vom Objekt reflektierte Laserlicht wird von einer Photodiode (in meinem Fall eine BPW34) erfasst, verstärkt und an einen analogen Eingang des Arduino gesendet. Damit nun unterschiedliche Stellen des Objekts untersucht werden können, liegt dieses auf einem Teller (dünnes Kupferblech mit Loch in der Mitte). Dieser Teller ist nun über zwei Metallstangen in x- und y-Richtung mit den beiden Lautsprechern verbunden.
Fließt nun ein bestimmter Strom durch die Lautsprecher, so verformt sich dadurch die Lautsprechermembran und drückt den Teller mehr oder weniger von sich fort. Erhöht man nun stetig den Strom durch beide Lautsprecher, lässt sich das Objekt in x- und y-Richtung abscannen.
Umgesetzt habe ich die Ansteuerung der beiden Lautsprecher mit einem DA-Wandler (MCP4922). Das analoge Signal des DA-Wandlers steuert sodann die Basis eines Transistors (BD135) an. Im Kollektorzweig befindet sich dann der Lautsprecher. Ein Potentiometer im Basiszweig des Transistors regelt den Basis- bzw. Kollektorstrom und dadurch die Vergrößerung des Lasermikroskops. Vergrößert man etwa den Widerstandswert des Potentiometers im Basiszweig, so nimmt der Basisstrom und dadurch auch der Kollektorstrom ab und die Membran des Lautsprechers bewegt sich weniger weit nach außen. Dadurch wird eine höhere Vergrößerung erzielt.
Mit diesem Lasermikroskop konnte ich etwa die pit-Struktur einer CD (1.6 µm Spurabstand) auflösen.
Vor Aufnahme eines Scans muss noch der Fokus des DVD-Lesekopfs richtig eingestellt werden. Hierzu dreht man am Fokus-Potentiometer so lange, bis die Ausgangsspannung (die dann an den Arduino weitergeleitet wird) maximal wird. Dann weiß man, dass sich das zu untersuchende Objekt im Fokus befindet.
Als Display kommt ein 320×480 Pixel Modell zum Einsatz. Dieses lässt sich sehr einfach mit einem Arduino Mega und dessen Stiftleiste verbinden.
Arduino-Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 |
/************************************************************************* ** AH_MCP4922.h - Library for get out analog voltage ** ** Created by A. Hinkel 2012-01-05 ** ** download from "http://www.alhin.de/arduino" ** ** ** ** Based on code from website: ** ** http://www.sinneb.net/2010/06/mcp4921-12bit-dac-voltage-controller/ ** ** ** ** Released into the public domain. ** *************************************************************************/ #include "AH_MCP4922.h" #include <UTFT.h> // Declare which fonts we will be using extern uint8_t SmallFont[]; UTFT myGLCD(CTE32HR,38,39,40,41); //define AnalogOutput (MOSI_pin, SCK_pin, CS_pin, DAC_x, GAIN) AH_MCP4922 AnalogOutput1(11,13,12,LOW,HIGH); // define AnalogOutput1 for UNO_board, select DAC_A, Gain=1x AH_MCP4922 AnalogOutput2(11,13,12,HIGH,HIGH); // define AnalogOutput2 for UNO_board, select DAC_B, Gain=1x /******************************** * | MEGA | UNO * * -------------------------- * * SCK_pin | 52 | 13 * * MOSI_pin | 51 | 11 * * CS_pin | 53 | 12 * ********************************* * DAC=LOW => DAC_A select * * DAC=HIGH => DAC_B select * * * * GAIN=LOW => 2x gain select * * GAIN=HIGH => 1x gain select * ********************************/ int xPos, yPos; // Abtastposition int value; // Grauwert int pushButton = 2; // Port für den Startknopf #define sensorPin A0 // analoger Eingang für das Photodiodensignal // *************************************** // **************** SETUP **************** // *************************************** void setup() { /* AnalogOutput1.setValue(100); AnalogOutput2.setValue(100); delay(1000); */ Serial.begin(9600); // Init serial interface pinMode(pushButton, INPUT); // Setup the LCD myGLCD.InitLCD(); myGLCD.setFont(SmallFont); myGLCD.clrScr(); } // ******************************************* // ************** HAUPTSCHLEIFE ************** // ******************************************* void loop() { myGLCD.setColor(255, 255, 0); myGLCD.fillRect(0, 0, 479, 13); myGLCD.setColor(0, 0, 0); myGLCD.setBackColor(255, 255, 0); myGLCD.print("Lasermikroskop - stoppi", CENTER, 1); AnalogOutput1.setValue(0); AnalogOutput2.setValue(0); while (digitalRead(pushButton) == HIGH) { // Warte so lange, bis der Startknopf gedrückt wurde } /* for (int i = 0; i < 4096; i += 16) { //Serial.println(i * 5.0 / 4096.0,2); AnalogOutput1.setValue(i); // set voltage for AnalogOutput1 = pin 14 AnalogOutput2.setValue(i); // set volateg for AnalogOutput2 = pin 10 delay(10); } */ for (yPos = 0; yPos < 154; yPos++) { AnalogOutput2.setValue(yPos * 17); // set voltage for AnalogOutput1 = IC-pin 10 for (xPos = 0; xPos < 240; xPos++) { AnalogOutput1.setValue(xPos * 17); // set volateg for AnalogOutput2 = IC-pin 14 //delay(2); value = analogRead(sensorPin); // Einlesen des Spannungswerts von der Photodiode //value = random(1023); value = map(value,0,1023,0,255); myGLCD.setColor(value, value, value); myGLCD.fillRect(xPos * 2, 15 + yPos * 2, xPos * 2 + 1, 15 + yPos * 2 + 1); /* Serial.print(xPos); Serial.print(","); Serial.print(yPos); Serial.print(","); Serial.println(value); */ } yPos++; AnalogOutput2.setValue(yPos * 17); // set voltage for AnalogOutput1 = IC-pin 10 for (xPos = 239; xPos >= 0; xPos--) { AnalogOutput1.setValue(xPos * 17); // set volateg for AnalogOutput2 = IC-pin 14 //delay(2); value = analogRead(sensorPin); // Einlesen des Spannungswerts von der Photodiode //value = random(1023); value = map(value,0,1023,0,255); myGLCD.setColor(value, value, value); myGLCD.fillRect(xPos * 2, 15 + yPos * 2, xPos * 2 + 1, 15 + yPos * 2 + 1); /* Serial.print(xPos); Serial.print(","); Serial.print(yPos); Serial.print(","); Serial.println(value); */ } } } |