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
}