Posted on 8 Comments

Contec CMS-50F Pulse Oximeter Teardown

Rear Case
Rear Case

The rear has the specifications, laser-marked into the plastic. The serial numbers are just sticky labels though, and will come off easily with use.

Contec CMS-50F
Contec CMS-50F

This is the Contec CMS-50F wrist-mounted pulse oximeter unit, which has the capability to record data continuously to onboard memory, to be read out at a later time via a USB-Serial link. There is software supplied with the unit for this purpose, although it suffers from the usual Chinese quality problems. The hardware of this unit is rather well made, the firmware has some niggles but is otherwise fully functional, however the PC software looks completely rushed, is of low quality & just has enough functionality to kind-of pass as usable.

Top Cover Removed
Top Cover Removed

A total of 4 screws hold the casing together, once these are removed the top comes off. The large colour OLED display covers nearly all of the board here. The single button below is the user interface. The connection to the probe is made via the Lemo-style connector on the lower right.

Lithium Cell
Lithium Cell

Power is provided by a relatively large lithium-ion cell, rated at 1.78Wh.

Main Processor
Main Processor

All the heavy lifting work of the LCD, serial comms, etc are handled by this large Texas Instruments microcontroller, a MSP430F247. The clock crystal is just to the left, with the programming pins. I’m not sure of the purpose of the small IC in the top left corner, I couldn’t find any reference to the markings.

Aux Processor
Aux Processor

The actual pulse oximetry sensor readings seem to be dealth with by a secondary microcontroller, a Texas Instruments M430F1232 Mixed-Signal micro. This has it’s own clock crystal just underneath. The connections to the probe socket are to the right of this µC, while the programming bus is broken out to vias just above. The final devices on this side of the board are 3 linear regulators, supplying the rails to run all the logic in this device.

Main PCB Rear
Main PCB Rear

The rear of the PCB has the SiLabs CL2102 USB-Serial interface IC, the large Winbond 25X40CLNIG 512KByte SPI flash for recording oximetry data, and some of the power support components. The RTC crystal is also located here at the top of the board. Up in the top left corner is a Texas Instruments TPS61041 Boost converter, with it’s associated components. This is probably supplying the main voltage for the OLED display module.

Posted on 10 Comments

3M Microtouch 17″ Raspberry Pi Touch PC

A while back I posted about a 3M Touch Systems industrial monitor that I’d been given. I had previously paired it with a Raspberry Pi Model B+, but for general desktop use it was just a little on the slow side.

Since the release of the Raspberry Pi 2, with it’s 4-core ARM Cortex CPU, things are much improved, so I figured I’d post an update with the latest on the system.

The monitor I’ve used is a commercial one, used in such things as POS terminals, service kiosks, etc. It’s a fairly old unit, but it’s built like a tank.

3M Panel
3M Panel

It’s built around a Samsung LTM170EI-A01 System-On-Panel, these are unusual in that all the control electronics & backlighting are built into the panel itself, instead of requiring an external converter board to take VGA to the required LVDS that LCD panels use for their interface.

The touch section is a 3M Microtouch EXII series controller, with a surface capacitive touch overlay.

Touch Controller
Touch Controller

Above is the touch controller PCB, with it’s USB-Serial converter to interface with the Pi.

As there is much spare space inside the back of this monitor, I have mounted the Pi on a couple of spare screw posts, fitted USB ports where the original VGA & Serial connectors were in the casing, and added voltage regulation to provide the Pi with it’s required 5v.


Here’s the entire back of the panel, the Pi in the middle interfaces with a HDMI-VGA adaptor for the monitor, and the serial adaptor on the right for the touch. A small voltage regulator at the bottom of the unit is providing the 5v rail. There’s a switch at the bottom next to one of the USB ports to control power to the Pi itself. The panel won’t detect the resolution properly if they’re both powered on at the same time.

At 13.8v, the device pulls about 2A from the supply, which seems to be typical for a CCFL backlighted LCD.
Now the Raspberry Pi 2 has been released, it’s much more responsive for desktop applications, especially with a slight overclock.

Shameless Plug
Shameless Plug

A full disk image enabled for Desktop & 3M touch monitors is available below for others that have similar panels. This image only works for the Pi 2!

[download id=”5591″]

Posted on Leave a comment

Raspberry Pi Geiger Counter

Geiger Counter Setup
Geiger Counter Setup

Here’s my latest project with the Pi: interfacing it with the Sparkfun Geiger counter & outputting the resulting data to a character LCD.

The geiger counter is interfaced with it’s USB port, with the random number generator firmware. A Python script reads from the serial port & every minute outputs CPM & µSv/h data to the display.

The Python code is a mash of a few different projects I found online, for different geiger counters & some of my own customisations & code to write the info to the display & convert CPM into µSv/h.

This also writes all the data into a file at /var/log/radlog.txt

The code for this is below:

import time
import sys
import serial
import os
import RPIO
from RPLCD import CharLCD
from subprocess import * 
from datetime import datetime

# configuration settings

logfile = "/var/log/radlog" # location to save log data
serial_port = "/dev/ttyUSB0"
lcd = CharLCD(pin_rs=15, pin_rw=18, pin_e=16, pins_data=[21, 22, 23, 24], numbering_mode=RPIO.BOARD, cols=16, rows=4, dotsize=10) #Init LCD with physical parameters

f = open(logfile,"a")

ser = serial.Serial(serial_port,9600,timeout=1)

one = 0

#Init LCD with initial values.
lcd.cursor_pos = (0, 1)
lcd.write_string("Geiger Counter")
lcd.cursor_pos = (1, 2)
lcd.cursor_pos = (2,-3)
lcd.write_string("Please Wait...")
lcd.cursor_pos = (3, 0)
lcd.write_string(str(0) +" uSv/h")
f.write("Geiger Counter Initialized\n")
while 1==1:
  stamp = int(time.time())
  stamp == round(stamp,0)
  stamp = stamp + 60
  count = 0  
  while 1==1:
      ct = int(time.time())
      ct == round(ct,0)
      if ct > stamp:  break
      #Read from serial port
      bit =
      if bit != "":
          count = count + 1
          #Conversion of counts per minute to uSv/hr
          usvh = count * 0.01
  at = str(time.asctime())
  t = str(time.time())
  #Write line to log file & print info to console
  f.write("["+at+"."+t+"] "+str(count) + " CPM " +str(usvh) + " uSv/h\n")
  print "["+at+"."+t+"] Count "+str(count) + " " + str(usvh) +" uSv/hr"
  #Send measurement info to LCD
  lcd.cursor_pos = (0, 0)
  lcd.write_string('%b %d  %H:%M:%S\n'))
  lcd.cursor_pos = (1, 0)
  lcd.write_string("Radiation Level:")
  lcd.cursor_pos = (2, 1)
  lcd.write_string(str(count) +" CPM")
  lcd.cursor_pos = (3, -1)
  lcd.write_string(str(usvh) +" uSv/h")
Info Display
Info Display