Mikroskop i nyt lys

Jeg har opgraderet et gammelt lys-mikroskop med et digitalt kamera og en Raspberry Pi zero W (RPi 0w).

Der findes nok adaptere, som kan sætte en smartphone på mikroskopet eller en forstørrende linse direkte på smartphonens kamera. Så hvorfor sætte en Raspberry Pi med kamera på mikroskopet?

Hvorfor? Fordi jeg kan!, sekundært fordi Pi er en billig computer med wifi, som børnene nemt kan se skærmbilleder fra.

Lysmikroskopet fik lys gennem en ekstern glødelampe, som skulle lyse på et lille spejl under mikroskopet. Spejlet har jeg pillet af og erstattet med en hvid LED, serieforbundet til en 1kOhm modstand. LED’en er sat fast med gaffa.

Blænden på mikroskopet var rustet fast, den har jeg erstattet med et potentiometer (variabel modstand), som kan skue op og ned for lysstyrken på LED’en.

Her viser Raspberry Pi en af sine svagheder. Der er ingen analoge indgange til at modtage signalet fra potentiometer. Jeg kunne måske finde en løsning med noget PWM.

I stedet har jeg forbundet en Arduino Nano, som blot får strøm (5V) fra Pi’en, når denne er tændt. Forsøgte at give strøm fra en GPIO pin, så jeg kunne tænde og slukke Nano’en, men Pi’ens pins giver åbenbart kun 3,3V, hvilket er for lidt til en Nano.

Raspberry Pi’en bor i en kasse, som egentlig er til en Arduino Uno, men som passer godt i størrelse til Pi’en. Den er sat fast på mikroskopet med velcro og en plastikstrip, og er forbundet til et kamera, som startes fra et python-script, modificeret herfra: http://www.stuffaboutcode.com/2013/09/raspberry-pi-run-raspivid-with-python.html

På billederne ses krystaller af fint salt, uden og med baggrundsbelysning fra LED:

     

Forbindelser:

RPi 0W

Arduino Nano

 Andet

5V (GPIO4)

Vin

GND (GPIO6)

GND

 potentiometer, LED

A3

potentiometer

9

LED


Python-script på Raspberry Pi 0W:

import os
import subprocess
import threading
import time

RASPIVIDCMD = ["raspivid"]
TIMETOWAITFORABORT = 0.5

#class for controlling the running and shutting down of raspivid
class RaspiVidController(threading.Thread):
    def __init__(self, timeout, preview, otherOptions=None):
        threading.Thread.__init__(self)
        
        #setup the raspivid cmd
        self.raspividcmd = RASPIVIDCMD

        #add file path, timeout and preview to options
        self.raspividcmd.append("-t")
        self.raspividcmd.append(str(timeout))
        if preview == False: self.raspividcmd.append("-n")

        #if there are other options, add them
        if otherOptions != None:
            self.raspividcmd = self.raspividcmd + otherOptions

        #set state to not running
        self.running = False
        
    def run(self):
        #run raspivid
        raspivid = subprocess.Popen(self.raspividcmd)
        
        #loop until its set to stopped or it stops
        self.running = True
        while(self.running and raspivid.poll() is None):
            time.sleep(TIMETOWAITFORABORT)
        self.running = False
        
        #kill raspivid if still running
        if raspivid.poll() == True: raspivid.kill()

    def stopController(self):
        self.running = False

#test program
if __name__ == '__main__':

    #create raspivid controller
    vidcontrol = RaspiVidController(100000, True, ["-f"])

    try:
        print("Starting raspivid controller")
        #start up raspivid controller
        vidcontrol.start()
        #wait for it to finish
        while(vidcontrol.isAlive()):
            time.sleep(0.5)

    #Ctrl C
    except KeyboardInterrupt:
        print ("Cancelled")

    #Error
    except:
        print ("Unexpected error:"), sys.exc_info()[0]

        raise

    #if it finishes or Ctrl C, shut it down
    finally: 
        print ("Stopping raspivid controller")
        #stop the controller
        vidcontrol.stopController()
        #wait for the tread to finish if it hasn't already
        vidcontrol.join()
        
    print ("Done")

Arduino kode:

int ledPin = 9;      // LED connected to digital pin 9
int analogPin = 3;   // potentiometer connected to analog pin 3
int val = 500;         // variable to store the read value

void setup(){
  pinMode(ledPin, OUTPUT);   // sets the pin as output
}

void loop()
{
  val = analogRead(analogPin);   // read the input pin
  analogWrite(ledPin, val / 4);  // analogRead values go from 0 to 1023, analogWrite values from 0 to 255
}

Dette indlæg blev udgivet i Arduino, Biologi, Elektronik, Raspberry Pi. Bogmærk permalinket.