Ham Radio in STEM Education The Montgomery College Satellite Antenna Rotator Project Daniel Albuquerque, Raymond Botty, KK4HDR, Jordan Deuser, Kyle Nathan, Dennis Ngo presented by David Bern, W2LNX, adviser Montgomery College, Rockville, Maryland David.Bern @ MontgomeryCollege.edu W2LNX @ AMSAT.org 1 of 27
Introduction agenda using ham radio in STEM education desire to play with Raspberry Pis a solution looking for a problem organize a hacker/maker/diy/robotics/ham radio club summer student workshop at Montgomery College At the AMSAT-DC Spring 2013 Workshop Tom K3IO, suggested to use DiSEqC antenna rotators as inexpensive azimuth and elevation rotator system a problem to solve with a Raspberry Pi? 2 of 27
DiSEqC rotator Eagle Aspen Pro Brand International rotator runs on 13 V DC, 450 degrees 3 of 27
Raspberry Pi computer software Raspbian Linux with Python, C/C++ installed hardware GPIO pins, Ethernet and USB ports 4 of 27
DiSEqC protocol Eutelsat Digital Satellite Equipment Control DiSEqC DiSEqC signal and power on same wire 22±4 KHz pulse train 650±250 mv peak-to-peak one-third bit Pulse Width Keying (PWK) 0 bit: 1.0 ms followed by 0.5 ms silence 1 bit: 0.5 ms followed by 1.0 ms silence 6 ms between DiSEqC commands 5 of 27
DiSEqC protocol DiSEqC signal from Eagle Aspen controller DiSEqC signal to TTL level converter circuit 6 of 27
DiSEqC protocol DiSEqC commands bytes unidirectional to Eagle Aspen rotator does not use parity bit five command bytes to set position example: GO TO 255.0 DEGREES E0 31 6E 0F F0 E0 framing byte: command from master, no reply required 31 address byte: polar/azimuth positioner 6E drive motor to angular position ( ) 0F F0 255 x 16 7 of 27
DiSEqC protocol Raspberry generates pulse width modulated (PWM) DiSEqC signals on its GPIO pins gates a 22 KHz square wave oscillator DiSEqC command and 22 KHz square wave 8 of 27
DiSEqC protocol TTL level to DiSEqC signal converter simplified circuit prototype 9 of 27
Raspberry Pi software Python scripts about 600 lines of code diseqc_rotator_control.py reads from standard input ASCII AZ-EL position data and converts to DiSEqC commands sent to rotators schedule_pass.py translates ASCII AZ-EL position data from a file generated by PREDICT of a satellite pass and writes to standard output handles cases when azimuth position goes below zero degree or beyond 450 degrees read_serial_port.py translates ASCII AZ-EL position data read from serial port and writes to standard output EASYCOMM I and II protocol 10 of 27
Raspberry Pi software PREDICT 11 of 27
Raspberry Pi software gsat and EZ-EL tracking 12 of 27
Software tools Ethernet router connect to Internet for current time dhcp server Ethernet cables to desktop computer and Raspberry Pi On Raspberry Pi sshfs mounts Linux file directory over ssh On Linux computer my development environment gedit programmer text editor ssh, scp secure shell and ssh copy On Windows computer MobaXterm provides ssh, xterm, scp, and text editor 13 of 27
Raspberry Pi software Python scripts about 600 lines of code diseqc_rotator_control.py reads from standard input ASCII AZ-EL position data and converts to DiSEqC commands sent to rotators schedule_pass.py translates ASCII AZ-EL position data from PREDICT satellite pass file and writes to standard output handles cases when azimuth position goes below zero degree or beyond 450 degrees read_serial_port.py translates ASCII AZ-EL position data read from serial port ASCII AZ-EL position commands and writes to standard output EASYCOMM I and II protocol 14 of 27
diseqc_rotator_control.py # # main routine # initialize() azimuth_rotator = Eagle_Aspen_rotator(0, 450, AZIMUTH_PIN) elevation_rotator = Eagle_Aspen_rotator(0, 180, ELEVATION_PIN) run_interactive_mode(azimuth_rotator, elevation_rotator) print sys.argv[0], "finished... goodbye" 15 of 27
diseqc_rotator_control.py # # this routine runs this program in interactive mode # def run_interactive_mode(azimuth_rotator, elevation_rotator): while (True): print try: input = raw_input('command: '); print input except EOFError: break input = input.split() azimuth_rotator.update_position(input[1]) elevation_rotator.update_position(input[2]) if (azimuth_rotator.check_limits() == True and elevation_rotator.check_limits() == True): run_diseqc_command(azimuth_rotator, elevation_rotator) else: azimuth_rotator.position = azimuth_rotator.last_position elevation_rotator.position = elevation_rotator.last_position 16 of 27
diseqc_rotator_control.py # # this routine runs the DiSEqC command for the azimuth and elevation... # def run_diseqc_command(azimuth_rotator, elevation_rotator): azimuth_rotator.run_diseqc_command() time.sleep(0.1) elevation_rotator.run_diseqc_command() time.sleep(0.1) 17 of 27
diseqc_rotator_control.py import RPi.GPIO as GPIO import time import sys import os from configuration import * from Eagle_Aspen_rotator import Eagle_Aspen_rotator from routines import * PULSE_TIMING = DiSEqC.PULSE_TIMING AZIMUTH_PIN = GPIO_pin.AZIMUTH_PIN ELEVATION_PIN = GPIO_pin.ELEVATION_PIN STATUS_PIN = GPIO_pin.STATUS_PIN # # this routine initializes the program # def initialize(): GPIO.setmode(GPIO.BCM) GPIO.setwarnings(False) GPIO.setup(AZIMUTH_PIN, GPIO.OUT) GPIO.setup(ELEVATION_PIN, GPIO.OUT) GPIO.setup(STATUS_PIN, GPIO.OUT) print sys.argv[0], "starting... hello" 18 of 27
Eagle_Aspen_rotator.py class Eagle_Aspen_rotator: def init (self, lower_limit, upper_limit, GPIO_pin):... def update_position(self, input):... def calc_stop_position(self):... def run_diseqc_command(self):... def make_diseqc_command(self):... def check_limits(self):... 19 of 27
Recommendations and conclusion Recommendations Eagle Aspen rotators are fine for demonstrations and for casual amateur satellite work rotators occasionally wander around the correct position during a pass mitigated by sending position when it changes by at least two degrees needed to reset to zero position with its controller happened once Conclusion agenda of using ham radio for STEM education this was a great experience for the students 20 of 27
Continuing work We plan to develop a printed circuit board for the Eagle Aspen rotators if there is interest explore motors, stepper motors and rotary encoders explore interfacing Raspberry Pi to G-5500 rotator control box assemble the least expensive satellite ground station home made antennas using WA5VJB's Cheap Yagis 21 of 27
Availability All source code, schematics, and documentation are available on The Montgomery College Satellite Antenna Rotator Project Website at http://code.google.com/p/mc-satellite-antenna-rotator-project/ Questions, ideas, suggestions, requests and comments are welcome by sending email to mc.antenna.rotator.project @ gmail.com 22 of 27
My students 23 of 27
My students Kyle, Daniel, Jordan, Dennis, Ray, KK4HDR 24 of 27
Acknowledgments Tom Clark, K3IO, for inspiring and advising us on this project Gilbert Mackall, N3RZN, for lending us his Yaesu G5500 rotator and a Yaesu GS232A Dr. Muhammad Kehnemouyi, the chairman of the Department of Physics, Engineering, and Geosciences at Montgomery College, Rockville for his encouragement and support others... 25 of 27
Questions? demonstration in the demonstration room 26 of 27
Thank you! I received this book when I was a child... Thank you! 27 of 27