Monday 29 December 2014

Eyepiece - some thoughts on GUI interfaces using Python

What a nightmare ...

As a long-term user of IDE (Integrated Development Environment) programming tools, and specifically Visual Basic on Windows, I'm used to being able to drag and drop controls, insert modules and pop-up forms and so on without having to write more than a line or two of code - and to then to add the functionality wherever I need.

With Python, it seems that everything has to be hand-coded using library classes that have multiple rules about how anything is placed, a hierarchy of grids, stickies and classes that are ill-documented. It felt like I was programming back in the 1970's without the benefit of being able to preview what I was doing.

the standard tk (Tkinter) library that is an integral part of Python is a hoary old set of widgets (graphical control objects) and cruft that requires some arcane knowledge and a lot of practice to use - especially since anything more complex than a 'Hello World' application seems to require swathes of code to manage.

Indeed, it was to the point where I was considering using Curses - a kind of text-mode interface that creates forms just using colour and text (including the box-drawing characters).

Then I found wx.Python - a somewhat more modern GUI interface with a larger choice of widgets. It still requires a library of arcane knowledge, and the documentation is just as confusing to a Python newbie like me.

Google (my best friend) turned up a number of IDEs for Python, and specifically for wx.Python. Some were form generators, others were supposedly IDEs

I tried several that completely failed to do anything useful - either they didn't load, or they didn't do what it said on the box.

Then I found Boa Constructor - a Windows IDE specifically for Python (Boa and Python are both big snakes of the constrictor variety). Boa not only does what it says on the virtual box, it is free, and it resembles nothing more nor less than the old Delphi interface, using a mosaic of windows rather than a single one with multiple panes.

The range of widgets is excellent (and can be expanded), it generates the necessary code on the fly and will allow a preview. The form designer is also drag and drop (a bit clunky in places, but still excellent). It even allows you to preview the controls in action while designing the form.

I now have an interface of sorts, but I still have to figure out where to put the various bits and pieces of actual code. What's more, the same code runs on both Windows and the Raspberry Pi ...

Version 0.01 prototype interface on Windows 7
As you can see, the windows interface features the nice, rounded corners, semi-transparent top-bar and windows-style controls, while -

Version 0.01 prototype interface on Raspberry Pi
the Raspberry Pi's Linux interface has the square frame, foursquare controls and the same look and feel as the operating system's GUI (LXDE in this case). On a full Linux system where speed, memory and disc space was less of an issue, the window would take on the look and feel of whatever Desktop Environment was in use be it LXDE, Gnome, KDE etc.

Incidentally, while the interface reacts to input, it doesn't actually do anything useful - yet.

Boa Constructor can be found at:
Boa Constructor at Sourceforge


Thursday 18 December 2014

Eyepiece - Problems and Successes

For some reason during the past couple of days, while trying to get the configuration on the Pi right, the automatic graphical log-in on the console decided that it wasn't going to work - resulting in the display switching off.

I finally discovered that I could disable the graphical desktop on the console and get the screen to remain switched on indefinitely.

Strangely, (or maybe no so strangely) this speeds up the system by a marked amount.

Rather than have a permanent mess of system messages littering the console when not displaying a camera preview, I have created an ASCII-graphic that displays some information and something to identify the appliance.


The version should be shown as v 0.xx.xx, but whenever I get a production system will be the first release.



I have had a chance to play around with the camera - exploring the dozens of settings that can be changed from software. Some highlights are as follows:

The Automatic White Balance has a selection of profiles that will correct for a  range of lighting conditions.

There is a setting that allows Dynamic Range Compression - giving an insight into shadows and highlights.

There are settings for Shutter Speed, Film Speed, Colour Saturation, Contrast, Brightness and Sharpness amongst other settings.

It is possible to capture images without any of the usual corrections, indeed, it is possible to capture the whole image effectively as it comes out of the image sensor.



I have started writing the camera control software in Python - a language that I have never used before. I have been pleasantly surprised at how easy it is compared with other languages that I have used.

I have reached the point where the camera is switched on, will display a full-screen preview, will warm up before capturing a series of images (with timestamps on the image and on the file name) and will then switch off the camera.

Next comes the work on the user interface - and a way of setting all the controls without having to type in python commands.



I have turned up a salvaged stepper motor that I will be able to use to drive the fine focus knob. It is rated at 24volts, but it should run at 5v with sufficient torque to turn the knob (a very free motion), and to stall at the ends of the fine focus travel - thus allowing detection of the upper and lower limits of motion.

As it is a 4-phase motor, I will be able to drive it with a unipolar control board (so much simpler than H-bridges).

Monday 15 December 2014

Some festive thoughts on LED lighting.

As someone with a collection of things that I would like to photograph, I have long considered the question of suitable lighting.

For close-up work, including macro-photography, good daylight is unparallelled but, being Britain, good daylight is at a premium. When we have it, I want to be outside enjoying the sunshine and not indoors photographing small bits of rock.

Anyone who had done any macro-photography knows that the lighting is the most difficult part to arrange of the whole set-up. Flash tends to bleach out highlights and to cast stark, black shadows; incandescent light tends to be too yellow-orange and fluorescent light produces some weird colour casts.

Enter the LED.

For a while now, ice-white LEDs have been widely available in hand torches (flash-lights), work-lights and so on. While excellent for blue and green minerals, these LEDs produce poor earth-tones and dull reds, oranges and yellows.

Recently, warm-white LEDs have been available. These give a much better colour rendition for most subjects, but need to be combined with Ice White LEDs for a better overall effect.

Now comes the problem - buying warm-white and ice-white LEDs is a problem - they are generally advertised simply as white - and finding LEDs labelled by colour usually means expensive.


Today, I was shopping, and looking at Christmas Lights, and specifically cheap strings of LED lights. Lo and behold, there were strings of Ice White and strings of Warm White LEDs, as well as a range of other colours. I bought a string of ice white and a string of warm white (as well as a couple of other colours) - they were £2 per string of 20, batteries not included.

Now, LED fairy lights, instead of a dome-shaped lens, have a dimple in front of the chip to spread the light so that it is visible through a 270° angle.

What results is a pleasantly diffuse light similar to a coloured (or not) incandescent light with the appropriate colour tone.

A little time with a soldering iron and strip-board would quickly turn a string of festive LED lights into a macro-photographer's flood-light. Switching LEDs in and out could change the colour cast, brightness of illumination etc. - and all at 10p per LED. You even get a free battery box and switch with each pack of 20!


Incidentally, I have to say that the warm white LEDs are a little warmer than I would have expected, and really would make excellent display lighting without the starkness of the ice-white LEDs that are more commonly encountered.

Saturday 6 December 2014

Eyepiece - an interlude

The new PiCamera has arrived and, at first, I thought that it was dead on arrival ...

For anyone who receives one of these items that doesn't appear to work, you may need to re-seat the ribbon cable at the camera end, and to pop the nano-connector on the board out and back in.

The nano-connector is a little, flat, rectangular connector hidden under the flexi-circuit that emerges from the optical module (the actual camera).

A thumb-nail under the edge of this should separate the two parts, pinch between finger and thumb to re-seat the connector.

Also, for some reason, it takes a few seconds at cold-boot for the Pi to start up with the camera connected.

While I am working with the assembled electronics and doing the prototype work, I needed a temporary case for the camera. An off-cut of black, 1mm art board (cardboard) folded with a suitable hole for the optical module, held together with tape serves well. It is only to provide protection from handling (electrostatic discharge and stray signals from fingers), so it doesn't need to be a permanent (or even terribly attractive) feature.

..............................

I have also turned up a computer-mouse sized, wired, remote module already fitted with a push-to-make switch (to use as a shutter-release) and a neon which will accept a LED 'ready' indicator. The curly cable from an old, serial keyboard will serve for connection.

While waiting for the camera module and playing around with the settings on my Pi, I have been considering the interface between the computer (Raspberry Pi), the physical controls for the next stage of the project (for image-stacking), the remote shutter release and the stepper motor that will operate the fine-focus knob of the microscope.

Because the shutter control will eventually need to send a signal to two Raspberry Pi computers (when I get around to building an eyepiece spectrometer), the button will operate two transistor switches.

..............................

On the subject of the microscope spectrometer, I have decided that, since I will be using a camera as the detector (a PiNoir, infrared-sensitive version of the Pi Camera), there will be sufficient sensor space to handle four simultaneous channels of data - one being the light passing through the specimen. The other three will be a neon discharge tube, a mercury discharge tube and a beam of light direct from the microscope illuminator (delivered via  fibre-optic light-pipe).

This will allow each spectrometer frame to have sufficient calibration data in it to enable direct measurements without having to set up calibration shots and reference illumination sources each time the device is used. Now all I have to do is to find myself a decent, linear transmission grating, since the DVD I was originally planning to use isn't a sufficiently high quality grating for anything but testing (the grating is curved, after all).


Friday 21 November 2014

Eyepiece - Part 4 - Building from a clean install.


This is the approach when using a Windows system - users of Linux and Mac will need to look for their own software.



NOTE:

There is an issue with automatic log-in when running XDM on Raspbian. The workaround is not to start the XDM service until after the system has logged on the primary user.





Preparing your Raspberry Pi.

After downloading the latest build of Raspbian (Debian Linux for Raspberry Pi), you will need to unzip the disk image and install it onto a SD card with a capacity of at least 4 GB. The download is about 1000MB (1GB) in size.



http://www.raspberrypi.org/downloads/
Raspberry Pi Downloads (O.S.Images)
http://www.7-zip.org/
For unzipping, I use 7zip, a free utility. 


http://sourceforge.net/projects/win32diskimager/To transfer the operating system image onto the bootable SD card, you will need Win 32 Disk Imager.

Once your image is transferred, insert the SD card into the socket on your Raspberry Pi and boot it up. You will need a monitor and keyboard attached just this once.

A screen will appear asking you to choose a number of setup options. Make sure that you change the Host Name to something distinctive so that you can find it in the next step.

Complete your set up and reboot you Pi.

http://www.advanced-ip-scanner.com/At this point, you will need to know the network address of your Raspberry Pi. I use a product called Advanced IP Scanner, though you may have another program that you prefer.

Run this program  (or something similar) for your local network, and make a note of the IP address of your Raspberry Pi. You will need this IP address for the next part.


Updating your Pi.

At this point, you will need to run PuTTY, a program that operates as a remote terminal to communicate with a Linux computer. You will also need to have an active Internet connection on your network.

http://www.chiark.greenend.org.uk/~sgtatham/putty/ PuTTY is also free software, and has more uses than just this.
http://www.chiark.greenend.org.uk/~sgtatham/putty/

When PuTTY starts, you will be presented with a window that asks for Host Name or IP Address. Enter the address you were supplied with by Advanced IP Scanner (above). Make sure that the option SSH is selected (just below where you entered the IP Address).

Click OPEN at the bottom of the window. Accept any warnings about identity and security, this is perfectly normal the first time you communicate with a new computer.

A new window will open and, after a few moments you will be invited to


Logon as:█

As this is a brand new install, the user name is Pi. Type this in and press enter.

You will be asked for a password. 

pi@192.168.1.39's password:█

Enter the password, the default being raspberry. Again, press enter.

You will be given a block of text disclaiming any liability for anything at all and you will be presented with a prompt:

pi@(none) ~ $

You are now able to do things with your Raspberry Pi ... things like getting the remote graphical interface working.

 Now, enter

sudo apt-get update

This command will take a couple of minutes to complete while it installs all of the updates to your new machine - some of the programs on the Pi are updated almost weekly.

Next, enter

sudo apt-get upgrade

You might as well go and make a coffee since this typically takes 10 to 15 minutes to complete.

Your operating system is now fully up to date.

enter

sudo shutdown -r now
This will restart the Raspberry pi.


Installing a Desktop Manager

Once your Pi is up and running again, log in using PuTTY and your previous credentials. Once you get to the system prompt, enter

sudo passwd root
You will then need to type in a password for the root user (super user, administrator, head honcho etc.) ...

... twice.

This is not normally recommended, but since we will be accessing the computer remotely, then this is necessary (at least for now).

Now, you need to enter
su -
Which command logs you in as the root user, who is allowed to do anything at all - including deleting the whole operating system. You have been warned.

Enter

apt-get install xdm
This installs the X Desktop Manager, which will give us remote access to the system's graphical interface. It will also run dpkg-reconfigure xdm.

When  asked to choose a default desktop manager, select XDM and then OK.

You now need to change the contents of two files. Be very careful. You may need to read the simple editor tutorial page (coming soon).

Enter

cd /etc/X11/xdm 
ed xdm-config
 this opens the file /etc/X11/xdm/xdm-config in the default editor.

You need to change the line that reads

DisplayManager.requestPort: 0
to read as
! DisplayManager.requestPort: 0
so enter
,p
You should see the entire file being listed on your screen.  The last line should be the relevant line. If so, then you may use the following script:

l
s/Display/!Display/
,p
The line should have been correctly edited. if so, then you may enter
w
q
 which saves the file and quits the editor.

Now enter


ed /etc/X11/xdm/Xaccess


 the line that reads

#*                       #any host can get a login window
needs to be changed to read
*                        #any host can get a login window
entering
,p
will list the file. The line you want is a little under half way down.

Enter

46
This should display the correct line. If not, you can advance lines by entering + or go back by entering - (minus).

once the correct line is reached, enter:


s/#//
w
q
This should have configured the machine to allow remote desktop access. Be warned that this is an insecure method and anyone on your network would be able to intercept your data.

Enter the following three commands to start the X Desktop Manager service, and to install some useful applications.
service xdm start
apt-get install x11-apps
apt-get install x11-xserver-utils
apt-get install xscreensaver
apt-get install midori
apt-get install python-picamera
apt-get install python3-picamera
apt-get install python-picamera-docs


x11-apps and midori (a web browser) will take a few minutes to install. python3-picamera and python3-picamera are most likely to be already installed. 

Now is the time to check that that XDM is running correctly:

netstat -ulnp | grep 177
This should return the following information:

udp        0      0 0.0.0.0:177         0.0.0.0:*                  2864/xdm
if  you see udp, :177 and xdm then everything is running properly.

Enter
service xdm stop
shutdown -r now
and wait for the system to reboot

Next: Accessing your Pi with Xming and configuring your system

Wednesday 19 November 2014

Eyepiece - Part 3 - Where , oh where has my remote drive gone?

After two days of struggling to get the Raspberry Pi to log in automagically, to set up user accounts, to set up remote desktop access, disabling the screen saver and to try to get the camera working (even though is seems to be dead), it was time to get the computer to mount some network shared directories into the local file system.

I can do this in Windows in my sleep.

Seemingly, others can do this in Linux, in their sleep.

I ended up cheating.

After a day of fiddling with the settings inside the operating system (which requires hunting for all manner of different text files to edit), I could manually mount those directories wherever I wanted, just not automatically at boot-up.

Now, in Linux, when you attach a network share to your system, it gets linked into an empty directory (folder) that exists in the file system.

The command is:
mount.cifs {where from} {where to} -o {options}
Which worked fine. You can also tell the operating system to attach some remote directory to the file system - but if it can't do it, the entries are deleted, although you can tell it to mount them 'later', when mounting them becomes this command:
mount -a
Much easier, and again it works, but not automatically.


After trying all of the dozen or so methods of getting those remote shares to mount without human intervention, I gave up and cheated.


I wrote a script (a DOS Batch file) that starts a remote console (text only) session, logs in and does the job, it then closes the session and terminates itself. I also did the same thing to restart and shut down the Pi.


Happily, this isn't an issue, since the machine will always be run from another computer, I will set it up so that the main computer performs those tasks routinely itself.


eyepiece.bat
"C:\Program Files (x86)\PuTTY\putty.exe" -load M55 -l root -pw passwd -m mount.sh

"C:\Program Files (x86)\Xming\Xming.exe" :1 -terminate -clipboard  -query 192.168.1.72
 And the mount.sh script
#!/bin/bash
mount -a
exit 0
Now, all I need to do is do the whole thing over again with a clean install of the latest version of Raspbian from the Raspberry Pi site.

For more information on the Raspberry Pi ...
http://www.raspberrypi.org/

Next: Building from a clean install.

Eyepiece - Part 2 - The initial hoops and hurdles.

Before anything else, it was necessary to set up the computer and to find out how the camera worked.

I actually bought the camera module a year ago, but hadn't managed to get around to trying it out.

I intend to do a clean install later, and will go through the full set up again, this time taking notes and screen-shots. The full set up will be published, eventually.

So ...
I set up the SBC (Single Board Computer) and started it up. Now, a long time ago, I got fed up with a monitor, keyboard and mouse attached to every computer I used, and so I discovered the joys of the Remote Desktop.

For Microsoft Windows, there is a program (creatively named Remote Desktop) that will access a Windows computer as though you were sat at the desk it is on. Remote desktop doesn't work for non-Windows computers, so I went to start my copy of Xming, which does the same job but with a Linux computer at the other end of the network. Well, that had disappeared last time I rebuilt my laptop, so I had to re-install. Xming is available for free.

http://www.straightrunning.com/XmingNotes/


Now, getting two computers talking together when they are running very different operating systems is a bit of a chore, and I needed to make some changes using the command line interface (you remember DOS, don't you - this is similar, but very different.) - for that I needed an old friend called PuTTY, another fine piece of free software designed specifically for that purpose.

PuTTY: A Free Telnet/SSH Client

A complicated hour or two later, including an update of the whole operating system via the Internet, and I had remote access to the Raspberry Pi desktop.

Now, I could install the driver software, in the form of Python libraries.

Python is a programming language with which I am only passing familiar, so I followed the instructions in the tutorials. I managed to capture an image or two (dog's nose, the wall, my right foot etc.) without ever seeing the preview.

Down in the notes there were words to the effect that the preview image is only displayed on the primary display hardware. This required a monitor with an HDMI interface, and a suitable cable.

Some plugging and rebooting later, and I had an excellent view of the cables in which the SBC nestled. A good picture that moved in real time (unlike a traditional web-cam or other networked camera). It even captures still images when told!

Then the LED on the camera came on (as normal) during a simple script test, and the program hung.

Reboot, unplug and re-connect. check everything and then check the website. It seems that the magic smoke that the camera runs on had escaped. [Insert appropriate imprecations and incantations here.] So, I need to order a new camera module.

Undeterred, I start work on the other bits of the set up, and notice that the primary display has gone blank. Cue a bit more cussing while I tried to discover how to disable the screen saver. That took a couple more downloads and a strange discovery - it is impossible to disable the screen saver on the log-in screen on Debian. You also have to install the screen saver software in order to disable it on a user profile.

The solution turned out to be a bit of editing in order to log in a dummy user when the computer starts up. It only took me 48 hrs to figure out how to do this reliably.

Thank goodness for Google and people willing to share their expertise!

After that it took a few minutes to share folders from the SBC to the network using SAMBA (which meant another package download and install).

Next: Adventures in accessing files across the network.

Tuesday 18 November 2014

Eyepiece - Part 1 - the start of a new project

Now that winter has arrived, I am able to find time to start work on some of my planned indoor projects.

I have decided that the first project that I am going to work on is a camera eyepiece for my venerable Vickers M55 microscope - partly to save my poor aching eyes, and partly in order to allow me to do some micro photography.


Lacking the resources for purchase of a specialist microscope camera, I am going to put together a camera using an Raspberry Pi with its dedicated camera module (5 Mega pixel live feed, computer initiated capture including video). Later, I intend to add in a home-built spectrometer, but that's for another time.

This project will neatly encapsulate three of my interests - computers, microscopy and electronics.

I have had the computer for a couple of years. For anyone who doesn't know, this is a tiny single-board computer that runs the Linux operating system (amongst others). In this case, it will be running Raspbian the Raspberry Pi's custom distribution of Debian Linux.

It is a bit larger than a credit card and has a custom camera module that can be attached. The model B boasts both USB ports and a network port  as well as a high definition video output. Instead of a disc drive, it accepts a wafer-thin SD memory card.

In order for this minimalist system to be useful for large-scale image capture, it will need to have access to  a computer network which will allow it to use another computer's disc-drive for image storage. It will also allow access to the computer without having to have a keyboard and mouse attached to the Pi. The monitor, however, stays, as it is where the camera will send its preview video stream to.

It will also require quite a bit of programming in order for it to do its job.

While I am a more than competent computer user with some experience of using Linux computers as file servers, I am not that used to delving into the heart of the operating system in order to change the way it works.

Thus comes the first set of hurdles.

Next: Testing and initial setup.