Kraksat team in CanSat 2014 European Competition

See old 2013 site...

Blog Posts

Campaign on

at 26 Apr 2014

We started a crowd-funding campaign on Polish portal Support us at

APC 230 transcievers

Michał Zieliński at 16 Mar 2014
A transceiver is a device comprising both a transmitter and a receiver which are combined and share common circuitry or a single housing.
Connecting APC-220 to DFRobot's USB to Serial. The white wire connects SET to GND, turning device into configuration mode

Cansat probe needs to send data it collects back to the ground station. We hae choosen to use APC 230, as they are relatively inexpensive and have long transmission range (the manufacturer claims 1.8 km at 2400 bits per second). However, the program that is supposed to change APC's settings (RF-Magic), was probably written for Windows XP (or earlier) and it miserably fails on Windows 7.

Also, we didn't like the fact that we need to reboot into Windows from our favorite Linux distributions so we read datasheet and wrote a script that works everywhere where PySerial is available. It should work on all transcievers from APC-2x0 series.

import serial
import os
import glob
import sys

dev = os.environ.get('APC_DEV', '/dev/ttyUSB*')
dev = glob.glob(dev)[0]
print 'Using', dev

s = serial.Serial(dev, 9600, timeout=1)

proc = sys.argv[0]
print 'Usage:'
print '  %s                          display settings' % proc
print '  %s --set-uart-rate rate' % proc
print '  %s --set-rf-rate rate' % proc
print '  %s --set-freq freq          freq in KHz between 418000 to 455000' % proc
print 'Short SET to GND.'
print '(Or try shorting SET to VCC and back to GND)'
while True:
    line = s.readline()
    if line:
        print '[recv]', repr(line)[:35]
    if line.startswith('PARA '):

RFRATES = [-1, 2400, 4800, 9600, 19200]
UARATES = [1200, 2400, 4800, 9600, 19200, 38400, 57600]
PARITY = ['no', 'even', 'odd']

freq, rf, power, ua, checkout = map(int, line.split()[1:])
print 'Settings:'
print '  Frequency:', freq, 'kHz'
print '  RF rate:', RFRATES[rf]
print '  Power:', power / 9. * 20, 'mW'
print '  UART rate:', UARATES[rf]
print '  Parity:', PARITY[checkout]

args  = sys.argv[1:]
if not args:
while args:
    key = args[0]
    val = args[1]
    del args[0:2]
    if key == '--set-uart-rate':
        ua = UARATES.index(int(val))
    elif key == '--set-rf-rate':
        rf = RFRATES.index(int(val))
    elif key == '--set-freq':
        freq = int(val)
        print 'Warning: unknown option %s - ignoring' % key

line = ' '.join(['WR'] + map(str, [freq, rf, power, ua, checkout])) + '\r\n'
print 'change settings:', repr(line)

print 'Short SET to GND and press enter.'
# Read previous transmission from input buffer:
print 'junk:', repr([:35]
while True:
    line = s.readline()
    if line:
        print '[recv]', repr(line)
    if line.startswith('PARA '):

print 'Ok.'

First render of the probe

Michał Zieliński at 22 Feb 2014
Cansat 3d model This year, our CanSat probe is going to collect a lot of data!

Telemetric data

  • pressure and temperature - these two are required by ESA to participate in a contest.
  • 9-axis IMU (inertial measurement unit) - it's an integrated beast that is used for navigation. It's called 9-axis, because it measures acceleration, angular speed, magnetic field - and all of these are 3 dimensional.
As a bonus, we will determine location using GPS/GLONASS receiver, which is most reliable on Earth, so it will allow organizers to find the probes more easily.


  • ionising radiation. We will use Soviet Union produced STS-5 Geiger tube (the dark blue cyllinder on 3D render). They are very inexpensive in Poland and they get the job done.
  • live video - we are going to use HD camera (the red box on 3D render) and trasmit the video live to the ground station.
  • light spectrum - we will construct a spectroscope based on diffration grating - more on that later.


at 22 Jan 2014

Welcome to Kraksat team blog!