Lasermikroskop

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:

/*************************************************************************
**  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);
            */              
           }       
        
       } 
       
   }