Fix PlayStation 2 not reading discs

Open housing

product info

To avoid short-circuiting, remove the power plug before you open the housing!

The PlayStation 2 (PS 2) uses an external power supply so it was not designed with concern for hazardous voltages inside the enclosure. However, to avoid short-circuiting, remove the power plug before you open the housing!

To open the housing, remove the five screw covers on the back of the PS 2. One of the screw covers is hidden behind the guarantee sticker. Please note that products with their warranty labels and barcodes removed or altered are not covered by the warranty any more.

The screws can be easily removed using a Phillips-tip screwdriver. After removal, use a special soft-plastic housing opening tool to lift the lid.

Clean-up

Clean housing

After removing the housing, use a slightly damp cloth to clean the inside of the PS 2.

Let the device dry for several hours in order to avoid a short-circuiting.

Clean laser lens

lense

Never look into the lens!

Avoid touching the lens or some of the fat from your fingers will stick on it. Use a clean cotton bud, dip it into denatured alcohol (methylated spirits) and gently clean the lens. It should appear completely clean.

Check DVD drive motors

  • Never look into the laser beam inside the PS 2!

power_plug

The DVD reader has two motors, one to spin the DVD (left rectangle) and one to move the laser unit (right rectangle) back and forth. Obviously, both motors have to work properly to guarantee an error-free operation of the DVD drive. A special safety mechanism avoids motor spinning while the cover is removed.

Put a DVD into the PS 2 (onto the spindle) and attach the power plug. Inserting a DVD has two advantages, the DVD will cover the laser and it will be easier to check if the DVD motor is spinning. The red LED should indicate that the PlayStation 2 is powered properly.

power_plug

Push the power button (see picture on the right) to power up the PS 2. As usal, the green status LED should indicate the device start-up.

Notice the small black push-botton on the top of the power button PCB. It gets pushed when the DVD tray gets closed.

front push-button

As noted before, a special safety mechanism avoids motor spinning while the cover is removed. The safety mechanism consists of two push-buttons, one on the top of the power button PCB (left picture) and one on the mainboard (right picture). Both buttons normaly get pushed when the DVD tray gets closes. To be able to check if the motors work properly, the buttons have to be pushed manually. Press and hold both buttons simultaneously. The DVD should start spinning and the optical unit containing the laser should start moving.

mainboard push-button

If both motors do not start to spin, remove the power plug and use the continuity test mode of your digital multimeter to check both switches. If both are working correctly, your housing might be the problem. Check if one of the plastic pins (pushing the buttons when you close the housing) is broken. If one of the pins is broken, you may want to either fix it (glue) or just short-circuit the corresponding push-button.

Send SMS from Python on the Nokia N900

The script

The following Python script can be used to send a SMS on the Nokia N900.

#!/usr/bin/python

import pexpect # Python module for controlling other programms.
import time
import sys
from subprocess import * # Pyton module for spwaning new processes.

tmp  = raw_input("Enter mobile number:\n");
tmp = tmp.rstrip('\n')

if (tmp[0] == tmp[1] == "0"):
    number = tmp
elif (tmp[0] == "0" ) and (tmp[1] != "0"):
    number = "+49"+tmp[1:]
else:
    print "[-] This does not seem to be a mobile phone number. "
    sys.exit()

string = 'at+cmgs='+"\""+number+"\""+'\r'
string = string.rstrip('\n')

#print string
Message = raw_input("Enter text:\n")

child = pexpect.spawn('pnatd');
child.send('at\r');
time.sleep(0.25);
child.send('at+cmgf=1\r');
time.sleep(0.25);
child.send(string);
child.send(Message);
child.send(chr(26));
child.send(chr(26));
child.sendeof();

Issues

'module' object has no attribute 'GPSDControl'

The Python script name shall not be 'location.py' otherwise the interpreter will fail with the following error message:

Traceback (most recent call last):
File "location.py", line 1, in <module>
import location
File "/home/user/location.py", line 25, in <module>
control = location.GPSDControl.get_default()
AttributeError: 'module' object has no attribute 'GPSDControl'

Position dependent event triggering on the Nokia N900

alternate text

Retrieve destination's coordinates

The program is first served with a destination address, the user input is realized as follows:

addr = raw_input('\nAddress: ') # Read destination address.

A sample input could be "Karl-Wilhelm-Strasse 4, Karlsruhe". The destination's coordinates can be retrieved by starting a Google Maps request.

# Encode query string into URL
url = 'http://maps.google.com/?q=' + urllib.quote(addr) + '&amp;output=js'
# Get location as XML file
xml = urllib.urlopen(url).read()

Google Maps responds with a XML-file, the following code extracts longitude and latitude to the variables latDest and longDest:

# Strip lat/long coordinates from XML
latDest, longDest = 0.0,0.0
center = xml[xml.find('{center')+9:xml.find('}',xml.find('{center'))]
center = center.replace('lat:', '').replace('lng:', '')
latDest, longDest = center.split(',')
latDest, longDest = float(latDest), float(longDest)

Given the example user input from above, variables latDest and longDest will contain the following coordinates:

  • latDest: 49.010149 # Destination latitude

  • longDest: 8.420162 # Destination longitude

The Python API googlemaps leads to the same result:

from googlemaps import GoogleMaps
gmaps = GoogleMaps(API_KEY) # Set API_KEY to your Google Maps API Key
address = 'Karl-Wilhelm-Strasse 4, Karlsruhe'
lat, lng = gmaps.address_to_latlng(address)

The API can only be used with a valid Google accout and a valid API key.

Get actual position

The actual position can be retrieved from the Nokia N900 GPS receiver GPS5030 (Texas Instruments). The receiver supports Assisted GPS (A-GPS) and can be controlled by liblocation. The library is availlable as C and Python implementation and provides two objects control and device that have to be initialized as follows:

control = location.GPSDControl.get_default()
device = location.GPSDevice()

GPSDControl can be used to start and stop the receiver. The position update interval can be set by method set_properties() and has to fit the form of movement. The following code snippet sets the interval to 60 s (suitable for pedestrians):

control.set_properties(preferred_interval=location.INTERVAL_DEFAULT)

GPSDevice provides information about the receiver status and the actual GPS data (the fix) as tuple (immutable list). This fix-tuple contains the following information:

  • time stamp

  • latitude and longitude of the actual position

  • height

  • velocity

After initialization of GPSDControl and GPSDevice, latitude and longitute can be accessed as follows:

latPosition = float(device.fix[4])  # Latitude of actual position
longPosition = float(device.fix[5]) # Longitude of actual position.

Great-circle distance (orthodromic distance)

alternate text

The great-circle distance or orthodromic distance is the shortest distance between two points on the surface of a sphere, measured along the surface of the sphere. In other words: the great-circle distance is the the shortest connection between two GPS coordinates.

By calculating the orthodromic distance, one can calculate the distance between the actual position (A) and the final destination (B). Longitude and latitude have to be converted into radian measure. The central angle between them, is given by the spherical law of cosines. The distance in meters can be calculated by mutliplying the central angle by the earth radius (approx. 6370 km).

def SphericalDistance(latPosition,longPosition):
  longDestRad = (longDest * (2 * pi / 360))
  latDestRad = (latDest * (2 * pi / 360))
  longPositionRad = (longPosition * (2 * pi / 360))
  latPositionRad = (latPosition * (2 * pi / 360))

  distance = sin(latDestRad) * sin(latPositionRad) + cos(latDestRad) * \
             cos(latPositionRad) * cos(abs(longPositionRad - longDestRad))
  if ((distance >= 1) or (distance <= -1)):
      distance = 0
  else:
      distance = acos(distance)
      distance = distance * 6370000 # Change this for other planets.
  return distance # orthodromic distance

Position dependent event triggering

Variable distance returned by method SphericalDistance() contains the air-line distance between the actual position and the final destination in meters. Comparing distance with a given minimal distance makes it possible to trigger one of the following events when distance is lower or equal to the minimal distance:

  • Play an audio file ("You will arrive in about 5 minutes").

  • Toggle one or more LEDs (at night).

  • Send SMS ("I will arrive in about 5 minutes").

The following code listing shows how the Nokia N900 can be forced to send a SMS.

def SendSMS():
  string = 'at+cmgs='+"\""+number+"\""+'\r'
  child = pexpect.spawn('pnatd');
  child.send('at\r');
  time.sleep(0.25);
  child.send('at+cmgf=1\r');
  time.sleep(0.25);
  child.send(string);
  child.send('Schatz mach das Essen warm!');
  child.send(chr(26));
  child.send(chr(26));
  child.sendeof();