├── .gitignore ├── .gitmodules ├── BOM.txt ├── LICENSE ├── README.md ├── cmd-n-ctl ├── rotator-lib │ ├── README.md │ ├── __init__.py │ ├── requirements.txt │ ├── rotator.py │ └── setup.py └── utils │ ├── calib.py │ ├── interface.py │ ├── rotator_test │ └── rotator_test.ino │ ├── scanpwm │ ├── stitcher.sh │ ├── test_stepper.py │ ├── unstitcher.sh │ └── zero.py ├── documentation ├── A4988.pdf ├── A4988_wiring.PNG ├── MyDAQ_Parameters.txt ├── PC817.pdf ├── PiGPIO_ReliablePulsing.PNG ├── RPi-GPIO_DutyCycle.PNG ├── gpredict_manual.PDF ├── nema17_manual.pdf └── rpi_MECH_3bplus.pdf ├── electrical ├── protoshield_schematic.pdf └── rotator_shield │ ├── eagle.epf │ ├── rotator.s#1 │ ├── rotator.s#2 │ ├── rotator.s#3 │ ├── rotator.s#4 │ ├── rotator.s#5 │ ├── rotator.s#6 │ ├── rotator.s#7 │ ├── rotator.s#8 │ ├── rotator.s#9 │ └── rotator.sch ├── installers ├── install.sh └── uninstall.sh ├── mechanical ├── antenna │ ├── dipole │ │ ├── dipole_mount.AI │ │ ├── dipole_mount.SLDDRW │ │ └── dipole_mount.SLDPRT │ └── yagi │ │ ├── yagi_base.AI │ │ ├── yagi_base.SLDDRW │ │ └── yagi_base.SLDPRT ├── azel_controller │ ├── AxleBracket.SLDPRT │ ├── BottomBracket.SLDPRT │ ├── Bracket-SameAxisServos.SLDPRT │ ├── Final.SLDASM │ ├── Housing.SLDPRT │ ├── Rotator.SLDASM │ ├── RotorCover.SLDPRT │ ├── Servo.SLDPRT │ ├── ServoWithBrackets.SLDASM │ ├── Stepper.SLDPRT │ └── StepperConnector.SLDPRT ├── drawings │ ├── Housing.AI │ ├── Housing.SLDDRW │ ├── Servo.SLDDRW │ ├── controller.PDF │ ├── controller.SLDDRW │ ├── dipole.PDF │ └── dipole.SLDDRW └── stl │ ├── Final.STL │ ├── Housing.STL │ ├── HousingMk2.STL │ ├── README.md │ ├── StepperConnector.STL │ └── dipole.STL ├── run.sh └── sdr ├── rx ├── apt_dump.grc ├── apt_processor_full.grc └── fm_apt_demod.grc └── test ├── fm_raw_processer.grc └── fmradio_dump.grc /.gitignore: -------------------------------------------------------------------------------- 1 | # Temp files 2 | *~$*\.SLD* 3 | *.swp 4 | 5 | # Python compiled files 6 | *.pyc 7 | /__pycache__/ 8 | *.egg-info* 9 | 10 | # venv files directory 11 | *satcomm/ 12 | 13 | # vscode settings 14 | .vscode/ 15 | 16 | # my hamlib logger file 17 | # could show up anywhere now that I've generalized the paths 18 | *rotlog.log 19 | 20 | # gnuradio files 21 | apt_dump_sink 22 | *build 23 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "sdr/gr-gpredict-doppler"] 2 | path = sdr/gr-gpredict-doppler 3 | url = https://github.com/wnagele/gr-gpredict-doppler.git 4 | -------------------------------------------------------------------------------- /BOM.txt: -------------------------------------------------------------------------------- 1 | Control Components: 2 | ------------------- 3 | 3x SainSmart SR319 Servomotors or Equivalent 4 | https://www.sainsmart.com/collections/robotics-cnc/products/copy-of-all-purpose-digital-servo-sr318 5 | https://smile.amazon.com/gp/product/B072KCZXNW/ref=oh_aui_detailpage_o00_s00?ie=UTF8&psc=1 6 | 7 | 1x Raspberry Pi Model 3 8 | https://smile.amazon.com/CanaKit-Raspberry-Power-Supply-Listed/dp/B07BC6WH7V/ref=sr_1_3?s=pc&ie=UTF8&qid=1528080387&sr=1-3&keywords=raspberry+pi+3+b%2B 9 | 10 | 1x Breadboard/Solderboard Raspberry Pi Shield 11 | https://smile.amazon.com/Electronics-Salon-Prototype-Breakout-Raspberry-Breadboard/dp/B07BF8Z3HS/ref=sr_1_fkmr1_3?s=electronics&ie=UTF8&qid=1529453925&sr=1-3-fkmr1&keywords=raspberry+pi+solder+shied 12 | https://smile.amazon.com/Alchemy-Power-Pi-EzConnect-Raspberry-connector/dp/B01FE9EQ88/ref=pd_sim_147_3?_encoding=UTF8&pd_rd_i=B01FE9EQ88&pd_rd_r=86KQE2WA1MN76Z2TXF9V&pd_rd_w=NqZpm&pd_rd_wg=JkzAv&psc=1&refRID=86KQE2WA1MN76Z2TXF9V 13 | https://smile.amazon.com/dp/B013SPEXSI/ref=psdc_3015426011_t2_B01G8DPGWY 14 | 15 | AA Battery Holder - 7.4V 16 | https://smile.amazon.com/gp/product/B073XC52BG/ref=oh_aui_detailpage_o00_s00?ie=UTF8&psc=1 17 | 18 | 10x ech. Jumper Wires (m-m and m-f) 19 | https://smile.amazon.com/Haitronic-Multicolored-Breadboard-Arduino-raspberry/dp/B01LZF1ZSZ/ref=sr_1_1?s=electronics&ie=UTF8&qid=1528080443&sr=1-1&keywords=jumper+wires 20 | 21 | 22 | Antenna Components: 23 | ------------------- 24 | Min. 2' PVC (1/2" Diameter) 25 | See mechanical/antenna/dipole for fabrication specs 26 | 27 | Min. 15' Conductive Wire (Coat hangers work for this as well) 28 | (Dipole wires cut to 1.7' length) 29 | 30 | Min. 3' M-M Coax Cable 31 | https://smile.amazon.com/Cable-Matters-3-Pack-Shielded-Coaxial/dp/B00LETAIAI/ref=sr_1_3?s=audio-video-accessories&ie=UTF8&qid=1528080847&sr=1-3&keywords=coax+cable 32 | 33 | 1x F-Wire Antenna Matching Transformer 34 | https://smile.amazon.com/Comidox-Antenna-Adapter-Matching-Transformer/dp/B0785WDZW5/ref=sr_1_14?s=electronics&ie=UTF8&qid=1528081016&sr=1-14&keywords=coax+to+wire 35 | 36 | 1x M-F BNC to Coax Adapter 37 | https://smile.amazon.com/Eightnoo-Adapter-Connector-Coupler-adapters/dp/B01LW369ZW/ref=sr_1_3?ie=UTF8&qid=1528080928&sr=8-3&keywords=coax+to+bnc 38 | 39 | 1x F-M BNC to MCX 40 | https://smile.amazon.com/gp/product/B00CSCTU40/ref=oh_aui_detailpage_o00_s00?ie=UTF8&psc=1 41 | 42 | Radio Components: 43 | ----------------- 44 | 1x NooElec SDR Mini 45 | https://www.nooelec.com/store/sdr/sdr-receivers/nesdr-mini2-rtl2832u-r820t2.html] 46 | 47 | 48 | Software: 49 | --------- 50 | GNU Radio Companion 51 | https://www.gnuradio.org/ 52 | 53 | GPredict 54 | http://gpredict.oz9aec.net/ 55 | 56 | Some CAD software with STL read/export capability 57 | https://www.freecadweb.org/ 58 | https://www.solidworks.com/ 59 | https://www.autodesk.com/products/inventor/overview 60 | 61 | Recommended Tools: 62 | Hand Saw 63 | Soldering Iron 64 | Drill 65 | 3D Printer (for easier bracket fabrication) 66 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Marion Anderson 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # mySatComm 2 | Homebrew groundstation for receiving data from satellites. Servos are controlled via Raspberry Pi; DSP is handled through the GNU Radio and GPredict. Go [here](mechanical/stl) to see STL models in GitHub. 3 | 4 | ## Project Overview 5 | This is a farm-to-table amateur radio project composed of 3 major subprojects: 6 | 7 | * Mechanical Design 8 | * Antenna Rig 9 | * Orientation Controller 10 | * Command & Control Software 11 | * Servomotor low-level control 12 | * GPredict command interface 13 | * Rotator trajectory generation 14 | * Digital Signal Processing 15 | * Radio demodulation and doppler shifting 16 | * Information decoding 17 | 18 | ## Installation 19 | Clone this repo to your Raspberry Pi and run [install.sh](installers/install.sh). All Python dependencies will be installed in a virtual environment at `$HOME/.satcomm`. Additionally, 20 | 21 | To uninstall, run the corresponding [uninstall.sh](installers/uninstall.sh) script. 22 | 23 | On your PC, install [GPredict](http://gpredict.oz9aec.net/), [GNU Radio](https://www.gnuradio.org/), and download the [SDR folder](sdr). 24 | 25 | ## Using the programs 26 | 1. Create a GPredict module tracking some satellites of interest. Be sure to look at the [manual](documentation/gpredict_manual.PDF) and [website](http://gpredict.oz9aec.net/). 27 | 28 | 2. Configure GPredict to interface with your Raspberry Pi as a networked rotator (you'll need its IP address). 29 | 30 | 3. Configue GPredict to work with your SDR. If you don't have a go-to, I recommend using the [NooElec NESDR Mini 2](https://www.nooelec.com/store/sdr/sdr-receivers/nesdr-mini2-rtl2832u-r820t2.html). 31 | 32 | 4. Wait for a satellite to pass within range, then activate GPredict radio and rotator control programs and run `./run.sh` on your Pi. 33 | 34 | 5. Watch it go! 35 | 36 | ## Software/Retailer Links 37 | * [GPredict](http://gpredict.oz9aec.net/) - Satellite tracking and antenna actuation software 38 | * [PiGPIO](http://abyz.me.uk/rpi/pigpio/index.html) - Provides hardware-timed GPIO control on Raspberry Pi 39 | * [Raspberry Pi](https://www.raspberrypi.org/) - Hobbyist-oriented single-board computer 40 | * [SolidWorks](https://www.solidworks.com/) - CAD software 41 | * [SainSmart](https://www.com.sainsmart) - Robotic components manufacturer 42 | 43 | ## Project Subfolders 44 | * [Antenna Design](mechanical/antenna) 45 | * [Az-El Controller](mechanical/azel_controller) 46 | * [Control Software](cmd-n-ctl/) 47 | * [Data Reception](sdr/rx) 48 | * [Data Decoding](sdr/decoder) 49 | 50 | ### Mechanical Quick Reference 51 | * [GitHub-viewable Models](mechanical/stl) 52 | * [Antenna Rotator](mechanical/drawings/controller.PDF) 53 | * [Base Dipole](mechanical/drawings/dipole.PDF) 54 | * [Bill of Materials](BOM.txt) 55 | 56 | ### Software Quick Reference 57 | * [HamLib (GPredict Command Library)](http://hamlib.sourceforge.net/manuals/1.2.15/index.html) 58 | * [HamLib on RPi](https://kb9mwr.blogspot.com/2013/04/raspberry-pi-web-based-rig-control.html) 59 | * [Servo Characterization](cmd-n-ctl/servo-tests) 60 | 61 | ## Design Decisions 62 | ### Antenna 63 | * 3-element linearly polarized yagi antenna 64 | * Directionality recommended for satellite reception 65 | * Circular polarization is annoying (for me) to get right 66 | * Homebrew dipole antenna base made from PVC, AWG14 wire, and screws 67 | * COTS parts increase accessiblity and homebrew aesthetic 68 | * Thicker wire chosen for increased rigidity 69 | 70 | ### Controller 71 | * Custom housing 72 | * Convenient mount point for rotator 73 | * Minimizes wiring connecting Pi and servos 74 | * 3D printed for rapid prototyping 75 | * Solderboard Pi shield 76 | * More reliable wiring of servo battery power 77 | * Faster connect/disconnect of servos from Pi 78 | 79 | ### Software 80 | * GPredict 81 | * Open source satellite tracking software 82 | * Computes necessary antenna orientation automatically 83 | * Sends antenna orientation commands over TCP/IP 84 | * [Manual here](documentation/gpredict_manual.PDF) 85 | * PiGPIO 86 | * Provides almost-hardware-timed PWM (important for servo control) 87 | * PWM less noisy and more reliable than RPi-GPIO or wiringPi 88 | * Simple Python interface 89 | 90 | ## SDR Sources & Acknowledgements 91 | * Wolfgang Nagele for his [GRC Gpredict Doppler shift correction block](https://github.com/wnagele/gr-gpredict-doppler) 92 | * Alexandru Csete for [this tutorial for an APT decoder in GRC](http://oz9aec.net/radios/gnu-radio/simple-apt-decoder-prototype) 93 | 94 | ## Author 95 | Marion Anderson - [lowdrant](https://github.com/lowdrant) 96 | 97 | ## License 98 | This project is licensed under the MIT License - see the [LICENSE](LICENSE.md) file for details 99 | -------------------------------------------------------------------------------- /cmd-n-ctl/rotator-lib/README.md: -------------------------------------------------------------------------------- 1 | # rotator-lib 2 | 3 | Python class unique to this repo. Used to communicate with servos in my homebrew setup 4 | 5 | ## Design Notes 6 | 7 | This interface relies on 1 servo and 1 stepper. The servo controls elevation rotation, as it can only support ~180 degrees of rotation, and the stepper handles rotation, as it can rotate 360 degrees in either direction. 8 | 9 | During setup, I recommend running the calibrate method. It will set the rotator to 0 degrees Azimuth, 0 degrees Elevation. You should then align the rotator with Absolute North for GPredict's oritentation calculations. 10 | 11 | Due to the use of the `pigpiod` daemon, the detach method **must** be called at the end of rotator scripts. Otherwise the resources used won't be release and the Pi must be restarted. 12 | 13 | ## Methods 14 | 15 | These methods are pretty similar to the Arduino servo methods. 16 | 17 | ```python 18 | rotator() 19 | ``` 20 | 21 | Initializes rotator interface class. 22 | 23 | ```python 24 | attach(int pin_az1, int pin_az2, int pin_el) 25 | ``` 26 | 27 | Reserves PWM resources and sets servo pin numbers. Call this before sending any commands to servo. 28 | 29 | ```python 30 | detach() 31 | ``` 32 | 33 | Releases PWM resources. This **must** be called at the end of all interface scripts. 34 | 35 | ```python 36 | writeRotator(int deg_az, int deg_el)W 37 | ``` 38 | 39 | Sends position command to rotator in units of degrees. 40 | 41 | ```python 42 | readAz(), readEl() 43 | ``` 44 | 45 | Returns input to the last writeRotator() call. This class does not allow for servo feedback, so returning last command position is the only feasible read option. 46 | -------------------------------------------------------------------------------- /cmd-n-ctl/rotator-lib/__init__.py: -------------------------------------------------------------------------------- 1 | """File deliberately left empty.""" 2 | -------------------------------------------------------------------------------- /cmd-n-ctl/rotator-lib/requirements.txt: -------------------------------------------------------------------------------- 1 | pigpio>=1.40.post1 2 | -------------------------------------------------------------------------------- /cmd-n-ctl/rotator-lib/rotator.py: -------------------------------------------------------------------------------- 1 | #! /usr/bin/env python3 2 | """ 3 | Object file for class interfacing with antenna rotator 4 | 5 | author: Marion Anderson 6 | date: 2018-06-17 7 | file: rotator.py 8 | """ 9 | from __future__ import absolute_import, print_function 10 | 11 | import os 12 | import time 13 | from multiprocessing import Lock, Process 14 | 15 | import pigpio 16 | 17 | 18 | class RotatorClassException(Exception): 19 | """Provide exceptions for Rotator class""" 20 | pass 21 | 22 | 23 | class Rotator(object): 24 | """ 25 | Interface to antenna rotator using a stepper motor and a servo. 26 | 27 | See this link for PiGPIO documentation: 28 | http://abyz.me.uk/rpi/pigpio/index.html 29 | 30 | See Raspberry Pi pinout here: 31 | https://pinout.xyz/# 32 | """ 33 | 34 | def __init__(self, pin_az, pin_el, pin_dir, step_angle=1.8, step_delay=5): 35 | """Create basic antenna rotator instancece 36 | 37 | :param pin_az: GPIO pin for incrementing step 38 | :type pin_azfwd: length-4 int array 39 | :param pin_el: GPIO pin for elevation servo 40 | :type pin_el: int 41 | :param pin_dir: GPIO pin controlling stepper direction 42 | :type pin_dir: int 43 | 44 | :param step_angle: Az control step angle in degrees (Default: 1.8) 45 | :type step_angle: float 46 | :param step_delay: Delay between phases in milliseconds (Default: 5) 47 | :type step_delay: float 48 | 49 | .. note:: 50 | See Raspberry Pi and your motors' documentation for acceptable 51 | parameter values for your equipment. 52 | 53 | .. note:: 54 | Servos are not attached by default. Run `rotator.attach()` to reserve 55 | system resources. 56 | """ 57 | # Assigning motor params 58 | self.pin_az = pin_az 59 | self.pin_el = pin_el 60 | self.pin_dir = pin_dir 61 | self.step_angle = step_angle 62 | self.step_delay = step_delay 63 | 64 | # Determining current position 65 | homepath = os.environ['HOME'] 66 | self.statepath = homepath + '/.satcomm/rotator-state.conf' 67 | # Check state file exists and is valid, otherwise assume zero position 68 | if os.path.isfile(self.statepath): 69 | self.statefile = open(self.statepath, 'r') 70 | state = self.statefile.read() 71 | try: 72 | self.az = float(state[state.index('Az:')+3:state.index('El:')]) 73 | self.el = float(state[state.index('El:')+3:]) 74 | except ValueError: 75 | print('Bad state file! Assuming zero position.') 76 | self.az = 0 77 | self.el = 0 78 | self.statefile.close() 79 | self.statefile = open(self.statepath, 'w') 80 | else: 81 | self.az = 0 82 | self.el = 0 83 | self.statefile = open(self.statepath, 'w') # write first 84 | self._savestate() 85 | 86 | # other parameters 87 | self.pi = None # pigpio interface object 88 | self.num_pts = 4 # internal const for _spline_trajectory() 89 | self.attached = False 90 | self.mutex = Lock() 91 | 92 | def attach(self): 93 | """Initiate rotator control interface. 94 | 95 | .. note:: 96 | See Raspberry Pi pinout here: https://pinout.xyz/# 97 | """ 98 | self.pi = pigpio.pi() # reserving daemon resources 99 | 100 | # Set all pins to output 101 | self.pi.set_mode(self.pin_az, pigpio.OUTPUT) 102 | self.pi.set_mode(self.pin_dir, pigpio.OUTPUT) 103 | self.pi.set_mode(self.pin_el, pigpio.OUTPUT) 104 | 105 | # Force output low 106 | self.pi.set_servo_pulsewidth(self.pin_el, 0) 107 | self.pi.write(self.pin_az, 0) 108 | self.pi.write(self.pin_dir, 0) 109 | self.attached = True 110 | 111 | def detach(self): 112 | """Stop servo and release PWM resources.""" 113 | self.pi.stop() # releases resources used by pigpio daemon 114 | self.statefile.close() # close file stream 115 | self.attached = False 116 | 117 | def zero(self): 118 | """Move rotator to default position: 0deg Az, 0deg El.""" 119 | if not self.attached: 120 | raise RotatorClassException('Rotator not attached') 121 | self.write(0, 0) 122 | 123 | def calibrate(self): 124 | """Calibrate rotator by sequentially moving it to 125 | well-defined positions. 126 | """ 127 | input('Press enter to zero rotator: ') 128 | self.zero() 129 | 130 | # Azimuth calibration 131 | for az in (90, 180, 270): 132 | input('Press enter to move to {0} degrees Azimuth: '.format(az)) 133 | time.sleep(0.01) 134 | self.write(az, 0) 135 | 136 | input('Press enter to zero rotator again: ') 137 | time.sleep(0.25) 138 | self.zero() 139 | 140 | # Elevation calibration 141 | for el in (-10, 30, 45, 60, 80): 142 | input('Press enter to move to {0} degrees Elevation: '.format(el)) 143 | time.sleep(0.01) 144 | self.write(0, el) 145 | 146 | # Return to home position 147 | input('Calibration finished!\nPress enter to return to zero: ') 148 | self.zero() 149 | 150 | def write(self, az, el): 151 | """Move rotator to an orientation given in degrees. 152 | 153 | Handles input processing and commanding. The individual commands 154 | update the state variables. 155 | 156 | :param az: Azimuth angle 157 | :type az: float 158 | :param el: Elevation angle 159 | :type el: float 160 | 161 | .. note:: 162 | The interal az and el methods process input and save the state 163 | """ 164 | if not self.attached: 165 | raise RotatorClassException('Rotator not attached!') 166 | 167 | # Command motors 168 | # use threading to allow simultaneous execution 169 | # TODO: Implement splining 170 | thread_az = Process(target=self._write_az, args=(az,)) 171 | thread_el = Process(target=self._write_el, args=(el,)) 172 | thread_az.start() 173 | thread_el.start() 174 | thread_az.join() 175 | thread_el.join() 176 | 177 | def _write_el(self, degrees): 178 | """Lowlevel servo elevation control (internal method). 179 | 180 | :param degrees: Angle to move servo 181 | :type degrees: float 182 | 183 | .. note:: 184 | This is the only function that directly writes to the servos (which 185 | must be done in microseconds). This allows the rest of the class to 186 | operate in degrees. It also keeps the code more Pythonic. 187 | 188 | .. note:: 189 | The degrees to microseconds conversion uses a line fit with two points: 190 | (0deg, 500us), (180deg, 2500us). 191 | Therefore the coefficients are: 192 | m = (2500 - 500) / (180 - 0) = 200 / 18 193 | b = 500 194 | """ 195 | # Input processing 196 | degrees += 90 # 0deg el is the servo midpoint, no 90deg servo 197 | if degrees > 180 or degrees < 0: 198 | exceptstr = 'Servo angle is constrained between -10 and 90deg' 199 | raise RotatorClassException(exceptstr) 200 | if degrees == self.el: # don't write if not moving 201 | return 202 | 203 | # Move servo and then hold it in that position 204 | # TODO: Decide if resetting pulsewidth is necessary 205 | us = 200 / 18.0 * degrees + 500 # eq: (2500-500)/(180-0) + 500 206 | self.mutex.acquire() 207 | self.pi.set_servo_pulsewidth(self.pin_el, us) 208 | # time.sleep(0.2) # experimentally determined delay 209 | # self.pi.set_servo_pulsewidth(self.pin_el, 0) 210 | self.mutex.release() 211 | 212 | # Save state 213 | self.el = degrees - 90 214 | self.mutex.acquire() 215 | self._savestate() 216 | self.mutex.release() 217 | 218 | def _write_az(self, degrees): 219 | """Low level stepper azimuth control (internal method). 220 | 221 | :param degrees: Desired azimuth position in degrees 222 | :type degrees: float 223 | """ 224 | # Input Processing 225 | degrees %= 360 # azimuth wraps at 2pi 226 | if degrees == self.az: # don't write if not moving 227 | return 228 | 229 | # Decide direction by minimizing angular distance 230 | # Lots of if cases for figuring out what the right calculation is 231 | # basically figuring out which side of the line between pos and its 232 | # antipode you're on will tell 233 | degrees %= 360 # wrap at 2pi 234 | posmirror = (degrees + 180) % 360 # antipode of degrees 235 | if self.az < posmirror and self.az > degrees: 236 | cw = True 237 | dist = self.az - degrees 238 | elif degrees > 180 and self.az > degrees: 239 | cw = True 240 | dist = self.az - degrees 241 | elif degrees > 180 and self.az < posmirror: 242 | cw = True 243 | dist = 360 + self.az - degrees 244 | elif self.az < degrees and self.az > posmirror: 245 | cw = False 246 | dist = degrees - self.az 247 | elif degrees < 180 and self.az < degrees: 248 | cw = False 249 | dist = degrees - self.az 250 | elif degrees < 180 and self.az > posmirror: 251 | cw = False 252 | dist = 360 + degrees - self.az 253 | else: # just compute distance and go ccw if pos dist, cw if neg dist 254 | dist = abs(degrees - self.az) 255 | cw = True if self.az < degrees else False 256 | 257 | # Step motor 258 | if cw: 259 | self.pi.write(self.dir_pin, 1) 260 | else: 261 | self.pi.write(self.dir_pin, 0) 262 | time.sleep(self.step_delay) # setup time 263 | 264 | # Determine num steps and rotate 265 | # CW 266 | if cw: 267 | self.pi.write(self.pin_dir, 1) # CW mode 268 | time.sleep(0.001) # propagation delay 269 | steps = round(dist / self.step_angle) # how many steps 270 | for i in range(steps): 271 | self.mutex.acquire() 272 | self.pi.write(self.pin_az, 1) 273 | time.sleep(self.step_delay / 1000.0) # delay in ms 274 | self.pi.write(self.pin_az, 0) 275 | self.mutex.release() 276 | time.sleep(self.step_delay / 1000.0) 277 | # CCW 278 | else: 279 | self.pi.write(self.pin_dir, 0) # CCW mode 280 | time.sleep(0.001) # propagation delay 281 | steps = round(dist / self.step_angle) # how many steps 282 | for i in range(steps): 283 | self.mutex.acquire() 284 | self.pi.write(self.pin_az, 1) 285 | time.sleep(self.step_delay / 1000.0) 286 | self.pi.write(self.pin_az, 0) 287 | self.mutex.release() 288 | time.sleep(self.step_delay / 1000.0) 289 | 290 | # Record actual azimuth 291 | self.az = steps * self.step_angle # save actual azimuth 292 | self.mutex.acquire() 293 | self._savestate() 294 | self.mutex.release() 295 | 296 | def _savestate(self): 297 | """Overwrites rotator position to persistent file (internal method). 298 | 299 | .. note:: 300 | Update az and el BEFORE calling this method. 301 | """ 302 | self.statefile.truncate(0) # wipe file 303 | self.statefile.write('Az:{:.0f}El:{:.0f}'.format(self.az, self.el)) 304 | self.statefile.flush() 305 | 306 | # TODO: Test spline generation 307 | def _spline_trajectory(self, p0, pf, dt=0.25): 308 | """Generate a smoothed servo movement trajectory over time dt. 309 | 310 | :param p0: Initial angular position of servo in degrees. 311 | :type p0: float 312 | :param pf: Final angular position of servo in degrees. 313 | :type pf: float 314 | :param dt: Time to reach final position in seconds. (Default 0.25) 315 | :type dt: float 316 | 317 | :returns: tuple of positions in degrees 318 | :rtype: float tuple 319 | 320 | .. note:: 321 | These equations use the assumption that initial and final velocities 322 | are 0. You should be able to find them in any robotics text covering 323 | trajectory generation for manipulators. 324 | 325 | .. note:: 326 | The delay time between movements should be dt / Rotator.num_pts. 327 | All movements are in equal amounts of time 328 | """ 329 | # default case: p0 = pf 330 | coeffs = [0] * self.num_pts # spline coefficient array 331 | degrees = [p0] * self.num_pts # trajectory 332 | 333 | # movement case 334 | if p0 != pf: 335 | # spline coefficients in degrees: 336 | coeffs[3] = p0 337 | coeffs[2] = 0 338 | coeffs[1] = 3/pow(dt, 2) * (pf - p0) 339 | coeffs[0] = 2/pow(dt, 3) * (-pf + p0) 340 | 341 | # computing trajectory points: 342 | # skip 1st value because it's just p0, and that is covered in 343 | # the default case above 344 | for i in range(1, self.num_pts): 345 | t = dt / self.num_pts * i # time in trajectory 346 | degrees[i] = (coeffs[0] * pow(t, 3) + coeffs[1] * pow(t, 2) + 347 | coeffs[2] * t + coeffs[3]) 348 | 349 | return tuple(degrees) 350 | 351 | 352 | if __name__ == '__main__': 353 | print('This is the Rotator class file!') 354 | -------------------------------------------------------------------------------- /cmd-n-ctl/rotator-lib/setup.py: -------------------------------------------------------------------------------- 1 | #! /usr/bin/env python3 2 | """ 3 | Package install script for Rotator servo class on Raspberry Pi 4 | 5 | Author: Marion Anderson 6 | Date: 2018-06-17 7 | """ 8 | from __future__ import absolute_import 9 | 10 | from setuptools import setup 11 | 12 | setup( 13 | name='rotator', 14 | version='1.0', 15 | description='Python interface to SainSmart servos via Raspberry Pi', 16 | url='http://github.com/lmander42/mySatComm/cmd-n-ctl/rotator-lib', 17 | author='lmander42', 18 | license='MIT', 19 | py_modules=['rotator'], 20 | install_requires=['pigpio'], 21 | classifiers=( 22 | "Programming Language :: Python :: 3", 23 | "License :: OSI Approved :: MIT License", 24 | "Operating System :: Raspbian" 25 | ), 26 | ) 27 | -------------------------------------------------------------------------------- /cmd-n-ctl/utils/calib.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | """ 3 | Runs rotator calibration sequence 4 | 5 | author: Marion Anderson 6 | date: 2018-07-29 7 | file: calib.py 8 | """ 9 | from __future__ import absolute_import, print_function 10 | 11 | from rotator import Rotator 12 | 13 | # Rotator setup 14 | rot = Rotator(23, 17, 22) 15 | rot.attach() 16 | rot.calibrate() # zero before doing anything 17 | -------------------------------------------------------------------------------- /cmd-n-ctl/utils/interface.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | """ 3 | Hardcoded script for connecting the rotator to hamlib 4 | 5 | Run stitcher.sh before this and unstitcher.sh after 6 | 7 | author: Marion Anderson 8 | date: 2018-06-12 9 | file: interface.py 10 | """ 11 | from __future__ import absolute_import, print_function 12 | 13 | import os 14 | import signal 15 | import sys 16 | 17 | import serial 18 | 19 | from rotator import Rotator 20 | 21 | print('\nStarting interface.py') 22 | 23 | # Rotator setup 24 | rot = Rotator(23, 17, 22) 25 | rot.attach() 26 | print(' Rotator attached') 27 | rot.zero() # zero before doing anything 28 | homedir = os.environ['HOME'] 29 | ser = serial.Serial(port=homedir + '/.satcomm/ttySatR', 30 | baudrate=38400, timeout=0.5) 31 | print(' Serial port open') 32 | 33 | # SIGINT Handling 34 | def SIGINT_handler(sig, frame): 35 | """Gracefully exits from C-c.""" 36 | print('Releasing resources and exiting interface') 37 | rot.detach() 38 | # ser.close() 39 | sys.exit(0) 40 | signal.signal(signal.SIGINT, SIGINT_handler) 41 | 42 | # Reading input and Commanding servos 43 | print(' Interfacing now') 44 | while True: 45 | try: 46 | serdata = ser.readlines() 47 | if len(serdata) < 1: # don't try to parse a lack of commands 48 | continue 49 | 50 | # parse input 51 | cmdstr = serdata[-1].decode('utf-8')[0:-2] # get last instruction 52 | az_str, el_str = cmdstr.split(' ')[0:2] 53 | az_angle = int(float(az_str[2:])) # fmt: AZxxx.x 54 | el_angle = int(float(el_str[2:])) # fmt: ELxxx.x 55 | 56 | # execute 57 | print('Az', az_angle, 'El', el_angle) 58 | rot.write(az_angle, el_angle) 59 | 60 | # if something goes wrong with the serial port, just exit 61 | # user likely closed the port and 62 | # there's probably no need for a long stack trace 63 | except serial.SerialException: 64 | print('Serial port closed unexpectedly!') 65 | break 66 | 67 | # There is no need for a delay or sleep command at loop end because 68 | # Serial.readline causes a delay on its own. 69 | # From the PySerial documentation, readline waits for the timeout to expire 70 | # before returning read data from the serial port. 71 | -------------------------------------------------------------------------------- /cmd-n-ctl/utils/rotator_test/rotator_test.ino: -------------------------------------------------------------------------------- 1 | /** 2 | * Rotator test script for mySatComm using 3 | * A4988 Stepper Motor Controller breakout board 4 | * and an optoisolator controlling a servo. 5 | * 6 | * connect Pin12 to STEP 7 | * connect Pin13 to DIRECTION 8 | * connect Pin9 to SERVO 9 | * Author: Marion Anderson 10 | * Date: 2018-08-11 11 | */ 12 | #include 13 | const int dir_pin = 13; 14 | const int step_pin = 12; 15 | bool clockwise = true; 16 | Servo testServo; 17 | int pos = 0; 18 | int posstep = 5; 19 | 20 | void setup() 21 | { 22 | pinMode(dir_pin, OUTPUT); 23 | pinMode(step_pin, OUTPUT); 24 | testServo.attach(9); 25 | Serial.begin(9600); 26 | } 27 | 28 | void loop() 29 | { 30 | // Switch direction command 31 | if (Serial.available()) { 32 | int incoming = Serial.read(); 33 | if (incoming == '-') { 34 | clockwise = !clockwise; 35 | Serial.print("Changing direction to "); 36 | if (clockwise) { 37 | Serial.println("clockwise!"); 38 | } else { 39 | Serial.println("counter clockwise!"); 40 | } 41 | } 42 | } 43 | 44 | // Direction control 45 | if (clockwise) { 46 | digitalWrite(dir_pin, LOW); 47 | } else { 48 | digitalWrite(dir_pin, HIGH); 49 | } 50 | delayMicroseconds(1); // 200ns setup t 51 | 52 | // Step motor 53 | digitalWrite(step_pin, HIGH); 54 | delayMicroseconds(3); // 1us setup time 55 | digitalWrite(step_pin, LOW); 56 | delayMicroseconds(3); 57 | Serial.println("Step!"); 58 | 59 | testServo.write(pos); 60 | if (pos+posstep > 180 || pos+posstep < 0) { 61 | posstep *= -1; 62 | } 63 | pos += posstep; 64 | Serial.print("pos: "); 65 | Serial.println(pos); 66 | delay(30); // wait between steps 67 | 68 | 69 | } 70 | -------------------------------------------------------------------------------- /cmd-n-ctl/utils/scanpwm: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | """ 3 | CLI for automatically varying PWM on a specified pin 4 | 5 | author: Marion Anderson 6 | date: 2018-06-18 7 | file: scanpwm 8 | """ 9 | from __future__ import absolute_import 10 | 11 | import click 12 | import pigpio 13 | 14 | 15 | @click.command() 16 | @click.argument('pin') 17 | def main(pin): 18 | """Scans pwm settings on a Broadcom-numbered pin.""" 19 | print('Starting scanpwm!') 20 | 21 | 22 | # startup 23 | pin = int(pin) 24 | pi = pigpio.pi() 25 | pi.set_servo_pulsewidth(pin, 0) # force error if bad pin 26 | print('scanpwm initialized!\n') # notify user of startup 27 | 28 | # control 29 | go = True 30 | while go: 31 | for i in range(500, 3000, 500): 32 | pi.set_servo_pulsewidth(pin, i) 33 | click.echo("Wrote {1}us to pin {0}".format(pin, i)) 34 | 35 | val = input('Press enter to continue or type \'q\' to exit: ') 36 | if val == 'q' or val == 'exit' or val == 'quit': 37 | go = False 38 | break 39 | 40 | # shutdown 41 | pi.stop() 42 | 43 | if __name__ == '__main__': 44 | main() 45 | -------------------------------------------------------------------------------- /cmd-n-ctl/utils/stitcher.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | # 3 | # This file "stitches" together the resources needed to interface with hamlib 4 | # Intended only for experimentation/learning. There are are a number of 5 | # hardcoded and bad code practices here that are not nearly robust enough to 6 | # run on a given setup without some assembly and sudo access 7 | # 8 | # author: Marion Anderson 9 | # date: 2018-06-12 10 | # file: stitcher.sh 11 | 12 | set -o errexit 13 | set -o pipefail 14 | echo "Running stitcher.sh" 15 | 16 | # servo control daemon 17 | if [ $(ps aux | grep pigpiod | wc --lines) -gt 1 ] 18 | then 19 | echo " pigpiod daemon already running" 20 | else 21 | sudo pigpiod 22 | echo " pigpiod activated" 23 | fi 24 | 25 | # stitch custom serial ports together 26 | if [ $(ps aux | grep socat | wc --lines) -gt 1 ] 27 | then 28 | echo " socat already running" 29 | else 30 | sudo socat PTY,link="$HOME/.satcomm/ttySatT",user="$USER"\ 31 | PTY,link="$HOME/.satcomm/ttySatR",user="$USER" & 32 | echo " socat started" 33 | fi 34 | 35 | # rotator control 36 | # use EasyComm I protocol 37 | if [ $(ps aux | grep rotctld | wc --lines) -gt 1 ] 38 | then 39 | echo " rotctld already running" 40 | else 41 | sudo rotctld -m 201 -T "raspberrypi.local" -vvvvv -r "$HOME/.satcomm/ttySatT" &> rotlog.log & 42 | echo " rotctld activated using EasyComm I protocol" 43 | fi 44 | 45 | echo "Resources successfully stitched" 46 | exit 0 47 | -------------------------------------------------------------------------------- /cmd-n-ctl/utils/test_stepper.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | """Simple CLI for testing a stepper motor 3 | 4 | author: Marion Anderson 5 | date: 2018-08-09 6 | file: test_stepper.py 7 | """ 8 | from __future__ import absolute_import 9 | 10 | import time 11 | 12 | import click 13 | import pigpio 14 | 15 | 16 | @click.command() 17 | @click.option('--step-pin', default=23, 18 | help='GPIO pin number connected to STEP on the driver') 19 | @click.option('--dir-pin', default=22, 20 | help='GPIO pin number connected to DIRECTION on the driver') 21 | def main(step_pin, dir_pin): 22 | """Steps a stepper motor and can change the direction.""" 23 | print('Starting steppertest!') 24 | 25 | pi = pigpio.pi() 26 | pi.set_mode(step_pin, pigpio.OUTPUT) 27 | pi.set_mode(dir_pin, pigpio.OUTPUT) 28 | pi.write(dir_pin, 1) 29 | 30 | # control 31 | state = 1 32 | go = True 33 | while go: 34 | cmd = input('Press enter to step or \'-\' to switch direction: ') 35 | # Direction 36 | if cmd == '-': 37 | if state == 1: 38 | pi.write(dir_pin, 0) 39 | state = 0 40 | else: 41 | pi.write(dir_pin, 1) 42 | state = 1 43 | # Exiting 44 | elif cmd == 'q' or cmd == 'quit' or cmd == 'exit': 45 | go = False 46 | # Stepping 47 | pi.write(step_pin, 1) 48 | time.sleep(0.005) 49 | pi.write(step_pin, 0) 50 | time.sleep(0.005) 51 | 52 | # Shutdown 53 | pi.stop() 54 | 55 | if __name__ == '__main__': 56 | main() 57 | -------------------------------------------------------------------------------- /cmd-n-ctl/utils/unstitcher.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | # 3 | # This file "unstitches" the resources needed to interface with hamlib 4 | # Intended only for experimentation/learning. There are things here that should 5 | # not be hardcoded and it is not nearly robust enough to run on a given setup 6 | # without heavy care 7 | # 8 | # author: Marion Anderson 9 | # date: 2018-06-12 10 | # file: unstitcher.sh 11 | 12 | set -o errexit -o pipefail 13 | 14 | # Helper function to get pid of satcomm BASH commands 15 | # takes one arg, the input string 16 | # usage: `get_pid "input str"`` 17 | get_pid() { 18 | str=$(ps aux | grep "$1" | head --lines=1) 19 | str=$(tr --squeeze-repeats " " <<< "$str") 20 | pid=$(cut --delimiter=' ' --fields=2 <<< "$str") 21 | } 22 | 23 | # Loop through process names 24 | declare -a proc_names=("pigpiod" "socat" "rotctld") # from stack overflow 25 | for name in "${proc_names[@]}"; do 26 | 27 | # check if actually running 28 | if ! [ $(ps aux | grep "$name" | wc --lines) -gt 1 ]; then 29 | echo " $name isn't running?" 30 | 31 | # killing process 32 | else 33 | get_pid "$name" 34 | sudo kill $pid 35 | if [ $? ]; then 36 | echo " $name killed!" 37 | else 38 | echo " Failed to kill $name!" 39 | fi 40 | fi 41 | done 42 | 43 | exit 0 44 | -------------------------------------------------------------------------------- /cmd-n-ctl/utils/zero.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | """ 3 | CLI for zeroing the rotator. 4 | Intended for testing and setup uses. 5 | 6 | author: Marion Anderson 7 | date: 2018-07-28 8 | file: zero.py 9 | """ 10 | from __future__ import absolute_import, print_function 11 | 12 | from rotator import Rotator 13 | 14 | # Rotator setup 15 | rot = Rotator() 16 | rot.attach(23, 17, 22) # from my soldershield design 17 | rot.zero() # zero before doing anything 18 | -------------------------------------------------------------------------------- /documentation/A4988.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lowdrant/mySatComm/ff8367a7449865121f061bec93ceecf4d5bdc675/documentation/A4988.pdf -------------------------------------------------------------------------------- /documentation/A4988_wiring.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lowdrant/mySatComm/ff8367a7449865121f061bec93ceecf4d5bdc675/documentation/A4988_wiring.PNG -------------------------------------------------------------------------------- /documentation/MyDAQ_Parameters.txt: -------------------------------------------------------------------------------- 1 | 1. Connecting AGND to Arduino GND and AO0 to servo power causes a short, forcing AO0 to give ~3.5V 2 | - MyDAQ cannot supply power to servos with Arduino controller 3 | - Hopefully Raspberry Pi does not have this issue 4 | 5 | 2. AGND confirmed to be ground to +15V and -15V supplies 6 | - Can use AGND as reference when using MyDAQ as power supply 7 | 8 | 3. MyDAQ can be powered from Ubuntu, without NI Instrument launcher 9 | - Can run GPredict (more natively) in Ubuntu and still use MyDAQ as power supply -------------------------------------------------------------------------------- /documentation/PC817.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lowdrant/mySatComm/ff8367a7449865121f061bec93ceecf4d5bdc675/documentation/PC817.pdf -------------------------------------------------------------------------------- /documentation/PiGPIO_ReliablePulsing.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lowdrant/mySatComm/ff8367a7449865121f061bec93ceecf4d5bdc675/documentation/PiGPIO_ReliablePulsing.PNG -------------------------------------------------------------------------------- /documentation/RPi-GPIO_DutyCycle.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lowdrant/mySatComm/ff8367a7449865121f061bec93ceecf4d5bdc675/documentation/RPi-GPIO_DutyCycle.PNG -------------------------------------------------------------------------------- /documentation/gpredict_manual.PDF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lowdrant/mySatComm/ff8367a7449865121f061bec93ceecf4d5bdc675/documentation/gpredict_manual.PDF -------------------------------------------------------------------------------- /documentation/nema17_manual.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lowdrant/mySatComm/ff8367a7449865121f061bec93ceecf4d5bdc675/documentation/nema17_manual.pdf -------------------------------------------------------------------------------- /documentation/rpi_MECH_3bplus.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lowdrant/mySatComm/ff8367a7449865121f061bec93ceecf4d5bdc675/documentation/rpi_MECH_3bplus.pdf -------------------------------------------------------------------------------- /electrical/protoshield_schematic.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lowdrant/mySatComm/ff8367a7449865121f061bec93ceecf4d5bdc675/electrical/protoshield_schematic.pdf -------------------------------------------------------------------------------- /electrical/rotator_shield/eagle.epf: -------------------------------------------------------------------------------- 1 | [Eagle] 2 | Version="08 06 00" 3 | Platform="Linux" 4 | Globals="Globals" 5 | Desktop="Desktop" 6 | 7 | [Globals] 8 | AutoSaveProject=1 9 | UsedLibraryUrn="urn:adsk.eagle:library:79" 10 | UsedLibraryUrn="urn:adsk.eagle:library:88" 11 | UsedLibraryUrn="urn:adsk.eagle:library:178" 12 | UsedLibraryUrn="urn:adsk.eagle:library:179" 13 | UsedLibraryUrn="urn:adsk.eagle:library:180" 14 | UsedLibraryUrn="urn:adsk.eagle:library:181" 15 | UsedLibraryUrn="urn:adsk.eagle:library:182" 16 | UsedLibraryUrn="urn:adsk.eagle:library:183" 17 | UsedLibraryUrn="urn:adsk.eagle:library:184" 18 | UsedLibraryUrn="urn:adsk.eagle:library:185" 19 | UsedLibraryUrn="urn:adsk.eagle:library:186" 20 | UsedLibraryUrn="urn:adsk.eagle:library:187" 21 | UsedLibraryUrn="urn:adsk.eagle:library:89" 22 | UsedLibraryUrn="urn:adsk.eagle:library:188" 23 | UsedLibraryUrn="urn:adsk.eagle:library:189" 24 | UsedLibraryUrn="urn:adsk.eagle:library:190" 25 | UsedLibraryUrn="urn:adsk.eagle:library:191" 26 | UsedLibraryUrn="urn:adsk.eagle:library:192" 27 | UsedLibraryUrn="urn:adsk.eagle:library:193" 28 | UsedLibraryUrn="urn:adsk.eagle:library:194" 29 | UsedLibraryUrn="urn:adsk.eagle:library:195" 30 | UsedLibraryUrn="urn:adsk.eagle:library:196" 31 | UsedLibraryUrn="urn:adsk.eagle:library:197" 32 | UsedLibraryUrn="urn:adsk.eagle:library:90" 33 | UsedLibraryUrn="urn:adsk.eagle:library:198" 34 | UsedLibraryUrn="urn:adsk.eagle:library:199" 35 | UsedLibraryUrn="urn:adsk.eagle:library:200" 36 | UsedLibraryUrn="urn:adsk.eagle:library:201" 37 | UsedLibraryUrn="urn:adsk.eagle:library:202" 38 | UsedLibraryUrn="urn:adsk.eagle:library:203" 39 | UsedLibraryUrn="urn:adsk.eagle:library:204" 40 | UsedLibraryUrn="urn:adsk.eagle:library:205" 41 | UsedLibraryUrn="urn:adsk.eagle:library:206" 42 | UsedLibraryUrn="urn:adsk.eagle:library:207" 43 | UsedLibraryUrn="urn:adsk.eagle:library:91" 44 | UsedLibraryUrn="urn:adsk.eagle:library:208" 45 | UsedLibraryUrn="urn:adsk.eagle:library:209" 46 | UsedLibraryUrn="urn:adsk.eagle:library:210" 47 | UsedLibraryUrn="urn:adsk.eagle:library:211" 48 | UsedLibraryUrn="urn:adsk.eagle:library:212" 49 | UsedLibraryUrn="urn:adsk.eagle:library:213" 50 | UsedLibraryUrn="urn:adsk.eagle:library:214" 51 | UsedLibraryUrn="urn:adsk.eagle:library:215" 52 | UsedLibraryUrn="urn:adsk.eagle:library:216" 53 | UsedLibraryUrn="urn:adsk.eagle:library:217" 54 | UsedLibraryUrn="urn:adsk.eagle:library:92" 55 | UsedLibraryUrn="urn:adsk.eagle:library:218" 56 | UsedLibraryUrn="urn:adsk.eagle:library:219" 57 | UsedLibraryUrn="urn:adsk.eagle:library:220" 58 | UsedLibraryUrn="urn:adsk.eagle:library:221" 59 | UsedLibraryUrn="urn:adsk.eagle:library:222" 60 | UsedLibraryUrn="urn:adsk.eagle:library:223" 61 | UsedLibraryUrn="urn:adsk.eagle:library:224" 62 | UsedLibraryUrn="urn:adsk.eagle:library:225" 63 | UsedLibraryUrn="urn:adsk.eagle:library:226" 64 | UsedLibraryUrn="urn:adsk.eagle:library:227" 65 | UsedLibraryUrn="urn:adsk.eagle:library:93" 66 | UsedLibraryUrn="urn:adsk.eagle:library:228" 67 | UsedLibraryUrn="urn:adsk.eagle:library:229" 68 | UsedLibraryUrn="urn:adsk.eagle:library:230" 69 | UsedLibraryUrn="urn:adsk.eagle:library:231" 70 | UsedLibraryUrn="urn:adsk.eagle:library:232" 71 | UsedLibraryUrn="urn:adsk.eagle:library:233" 72 | UsedLibraryUrn="urn:adsk.eagle:library:234" 73 | UsedLibraryUrn="urn:adsk.eagle:library:235" 74 | UsedLibraryUrn="urn:adsk.eagle:library:236" 75 | UsedLibraryUrn="urn:adsk.eagle:library:237" 76 | UsedLibraryUrn="urn:adsk.eagle:library:94" 77 | UsedLibraryUrn="urn:adsk.eagle:library:238" 78 | UsedLibraryUrn="urn:adsk.eagle:library:239" 79 | UsedLibraryUrn="urn:adsk.eagle:library:240" 80 | UsedLibraryUrn="urn:adsk.eagle:library:241" 81 | UsedLibraryUrn="urn:adsk.eagle:library:242" 82 | UsedLibraryUrn="urn:adsk.eagle:library:243" 83 | UsedLibraryUrn="urn:adsk.eagle:library:244" 84 | UsedLibraryUrn="urn:adsk.eagle:library:245" 85 | UsedLibraryUrn="urn:adsk.eagle:library:246" 86 | UsedLibraryUrn="urn:adsk.eagle:library:247" 87 | UsedLibraryUrn="urn:adsk.eagle:library:95" 88 | UsedLibraryUrn="urn:adsk.eagle:library:248" 89 | UsedLibraryUrn="urn:adsk.eagle:library:249" 90 | UsedLibraryUrn="urn:adsk.eagle:library:250" 91 | UsedLibraryUrn="urn:adsk.eagle:library:251" 92 | UsedLibraryUrn="urn:adsk.eagle:library:252" 93 | UsedLibraryUrn="urn:adsk.eagle:library:253" 94 | UsedLibraryUrn="urn:adsk.eagle:library:254" 95 | UsedLibraryUrn="urn:adsk.eagle:library:255" 96 | UsedLibraryUrn="urn:adsk.eagle:library:256" 97 | UsedLibraryUrn="urn:adsk.eagle:library:257" 98 | UsedLibraryUrn="urn:adsk.eagle:library:96" 99 | UsedLibraryUrn="urn:adsk.eagle:library:258" 100 | UsedLibraryUrn="urn:adsk.eagle:library:259" 101 | UsedLibraryUrn="urn:adsk.eagle:library:260" 102 | UsedLibraryUrn="urn:adsk.eagle:library:261" 103 | UsedLibraryUrn="urn:adsk.eagle:library:262" 104 | UsedLibraryUrn="urn:adsk.eagle:library:263" 105 | UsedLibraryUrn="urn:adsk.eagle:library:264" 106 | UsedLibraryUrn="urn:adsk.eagle:library:265" 107 | UsedLibraryUrn="urn:adsk.eagle:library:266" 108 | UsedLibraryUrn="urn:adsk.eagle:library:267" 109 | UsedLibraryUrn="urn:adsk.eagle:library:97" 110 | UsedLibraryUrn="urn:adsk.eagle:library:268" 111 | UsedLibraryUrn="urn:adsk.eagle:library:269" 112 | UsedLibraryUrn="urn:adsk.eagle:library:270" 113 | UsedLibraryUrn="urn:adsk.eagle:library:271" 114 | UsedLibraryUrn="urn:adsk.eagle:library:272" 115 | UsedLibraryUrn="urn:adsk.eagle:library:273" 116 | UsedLibraryUrn="urn:adsk.eagle:library:274" 117 | UsedLibraryUrn="urn:adsk.eagle:library:275" 118 | UsedLibraryUrn="urn:adsk.eagle:library:276" 119 | UsedLibraryUrn="urn:adsk.eagle:library:277" 120 | UsedLibraryUrn="urn:adsk.eagle:library:80" 121 | UsedLibraryUrn="urn:adsk.eagle:library:98" 122 | UsedLibraryUrn="urn:adsk.eagle:library:278" 123 | UsedLibraryUrn="urn:adsk.eagle:library:279" 124 | UsedLibraryUrn="urn:adsk.eagle:library:280" 125 | UsedLibraryUrn="urn:adsk.eagle:library:281" 126 | UsedLibraryUrn="urn:adsk.eagle:library:282" 127 | UsedLibraryUrn="urn:adsk.eagle:library:283" 128 | UsedLibraryUrn="urn:adsk.eagle:library:284" 129 | UsedLibraryUrn="urn:adsk.eagle:library:285" 130 | UsedLibraryUrn="urn:adsk.eagle:library:286" 131 | UsedLibraryUrn="urn:adsk.eagle:library:287" 132 | UsedLibraryUrn="urn:adsk.eagle:library:99" 133 | UsedLibraryUrn="urn:adsk.eagle:library:288" 134 | UsedLibraryUrn="urn:adsk.eagle:library:289" 135 | UsedLibraryUrn="urn:adsk.eagle:library:290" 136 | UsedLibraryUrn="urn:adsk.eagle:library:291" 137 | UsedLibraryUrn="urn:adsk.eagle:library:292" 138 | UsedLibraryUrn="urn:adsk.eagle:library:293" 139 | UsedLibraryUrn="urn:adsk.eagle:library:294" 140 | UsedLibraryUrn="urn:adsk.eagle:library:295" 141 | UsedLibraryUrn="urn:adsk.eagle:library:296" 142 | UsedLibraryUrn="urn:adsk.eagle:library:297" 143 | UsedLibraryUrn="urn:adsk.eagle:library:100" 144 | UsedLibraryUrn="urn:adsk.eagle:library:298" 145 | UsedLibraryUrn="urn:adsk.eagle:library:299" 146 | UsedLibraryUrn="urn:adsk.eagle:library:300" 147 | UsedLibraryUrn="urn:adsk.eagle:library:301" 148 | UsedLibraryUrn="urn:adsk.eagle:library:302" 149 | UsedLibraryUrn="urn:adsk.eagle:library:303" 150 | UsedLibraryUrn="urn:adsk.eagle:library:304" 151 | UsedLibraryUrn="urn:adsk.eagle:library:305" 152 | UsedLibraryUrn="urn:adsk.eagle:library:306" 153 | UsedLibraryUrn="urn:adsk.eagle:library:307" 154 | UsedLibraryUrn="urn:adsk.eagle:library:101" 155 | UsedLibraryUrn="urn:adsk.eagle:library:308" 156 | UsedLibraryUrn="urn:adsk.eagle:library:309" 157 | UsedLibraryUrn="urn:adsk.eagle:library:310" 158 | UsedLibraryUrn="urn:adsk.eagle:library:311" 159 | UsedLibraryUrn="urn:adsk.eagle:library:312" 160 | UsedLibraryUrn="urn:adsk.eagle:library:313" 161 | UsedLibraryUrn="urn:adsk.eagle:library:314" 162 | UsedLibraryUrn="urn:adsk.eagle:library:315" 163 | UsedLibraryUrn="urn:adsk.eagle:library:316" 164 | UsedLibraryUrn="urn:adsk.eagle:library:317" 165 | UsedLibraryUrn="urn:adsk.eagle:library:102" 166 | UsedLibraryUrn="urn:adsk.eagle:library:318" 167 | UsedLibraryUrn="urn:adsk.eagle:library:319" 168 | UsedLibraryUrn="urn:adsk.eagle:library:320" 169 | UsedLibraryUrn="urn:adsk.eagle:library:321" 170 | UsedLibraryUrn="urn:adsk.eagle:library:322" 171 | UsedLibraryUrn="urn:adsk.eagle:library:323" 172 | UsedLibraryUrn="urn:adsk.eagle:library:324" 173 | UsedLibraryUrn="urn:adsk.eagle:library:325" 174 | UsedLibraryUrn="urn:adsk.eagle:library:326" 175 | UsedLibraryUrn="urn:adsk.eagle:library:327" 176 | UsedLibraryUrn="urn:adsk.eagle:library:103" 177 | UsedLibraryUrn="urn:adsk.eagle:library:328" 178 | UsedLibraryUrn="urn:adsk.eagle:library:329" 179 | UsedLibraryUrn="urn:adsk.eagle:library:330" 180 | UsedLibraryUrn="urn:adsk.eagle:library:331" 181 | UsedLibraryUrn="urn:adsk.eagle:library:332" 182 | UsedLibraryUrn="urn:adsk.eagle:library:333" 183 | UsedLibraryUrn="urn:adsk.eagle:library:334" 184 | UsedLibraryUrn="urn:adsk.eagle:library:335" 185 | UsedLibraryUrn="urn:adsk.eagle:library:336" 186 | UsedLibraryUrn="urn:adsk.eagle:library:337" 187 | UsedLibraryUrn="urn:adsk.eagle:library:104" 188 | UsedLibraryUrn="urn:adsk.eagle:library:338" 189 | UsedLibraryUrn="urn:adsk.eagle:library:339" 190 | UsedLibraryUrn="urn:adsk.eagle:library:340" 191 | UsedLibraryUrn="urn:adsk.eagle:library:341" 192 | UsedLibraryUrn="urn:adsk.eagle:library:342" 193 | UsedLibraryUrn="urn:adsk.eagle:library:343" 194 | UsedLibraryUrn="urn:adsk.eagle:library:344" 195 | UsedLibraryUrn="urn:adsk.eagle:library:345" 196 | UsedLibraryUrn="urn:adsk.eagle:library:346" 197 | UsedLibraryUrn="urn:adsk.eagle:library:347" 198 | UsedLibraryUrn="urn:adsk.eagle:library:105" 199 | UsedLibraryUrn="urn:adsk.eagle:library:348" 200 | UsedLibraryUrn="urn:adsk.eagle:library:349" 201 | UsedLibraryUrn="urn:adsk.eagle:library:350" 202 | UsedLibraryUrn="urn:adsk.eagle:library:351" 203 | UsedLibraryUrn="urn:adsk.eagle:library:352" 204 | UsedLibraryUrn="urn:adsk.eagle:library:353" 205 | UsedLibraryUrn="urn:adsk.eagle:library:354" 206 | UsedLibraryUrn="urn:adsk.eagle:library:355" 207 | UsedLibraryUrn="urn:adsk.eagle:library:356" 208 | UsedLibraryUrn="urn:adsk.eagle:library:357" 209 | UsedLibraryUrn="urn:adsk.eagle:library:106" 210 | UsedLibraryUrn="urn:adsk.eagle:library:358" 211 | UsedLibraryUrn="urn:adsk.eagle:library:359" 212 | UsedLibraryUrn="urn:adsk.eagle:library:360" 213 | UsedLibraryUrn="urn:adsk.eagle:library:361" 214 | UsedLibraryUrn="urn:adsk.eagle:library:362" 215 | UsedLibraryUrn="urn:adsk.eagle:library:363" 216 | UsedLibraryUrn="urn:adsk.eagle:library:364" 217 | UsedLibraryUrn="urn:adsk.eagle:library:365" 218 | UsedLibraryUrn="urn:adsk.eagle:library:366" 219 | UsedLibraryUrn="urn:adsk.eagle:library:367" 220 | UsedLibraryUrn="urn:adsk.eagle:library:107" 221 | UsedLibraryUrn="urn:adsk.eagle:library:368" 222 | UsedLibraryUrn="urn:adsk.eagle:library:369" 223 | UsedLibraryUrn="urn:adsk.eagle:library:370" 224 | UsedLibraryUrn="urn:adsk.eagle:library:371" 225 | UsedLibraryUrn="urn:adsk.eagle:library:372" 226 | UsedLibraryUrn="urn:adsk.eagle:library:373" 227 | UsedLibraryUrn="urn:adsk.eagle:library:374" 228 | UsedLibraryUrn="urn:adsk.eagle:library:375" 229 | UsedLibraryUrn="urn:adsk.eagle:library:376" 230 | UsedLibraryUrn="urn:adsk.eagle:library:377" 231 | UsedLibraryUrn="urn:adsk.eagle:library:81" 232 | UsedLibraryUrn="urn:adsk.eagle:library:108" 233 | UsedLibraryUrn="urn:adsk.eagle:library:378" 234 | UsedLibraryUrn="urn:adsk.eagle:library:379" 235 | UsedLibraryUrn="urn:adsk.eagle:library:380" 236 | UsedLibraryUrn="urn:adsk.eagle:library:381" 237 | UsedLibraryUrn="urn:adsk.eagle:library:382" 238 | UsedLibraryUrn="urn:adsk.eagle:library:383" 239 | UsedLibraryUrn="urn:adsk.eagle:library:384" 240 | UsedLibraryUrn="urn:adsk.eagle:library:385" 241 | UsedLibraryUrn="urn:adsk.eagle:library:386" 242 | UsedLibraryUrn="urn:adsk.eagle:library:387" 243 | UsedLibraryUrn="urn:adsk.eagle:library:109" 244 | UsedLibraryUrn="urn:adsk.eagle:library:388" 245 | UsedLibraryUrn="urn:adsk.eagle:library:389" 246 | UsedLibraryUrn="urn:adsk.eagle:library:390" 247 | UsedLibraryUrn="urn:adsk.eagle:library:391" 248 | UsedLibraryUrn="urn:adsk.eagle:library:392" 249 | UsedLibraryUrn="urn:adsk.eagle:library:393" 250 | UsedLibraryUrn="urn:adsk.eagle:library:394" 251 | UsedLibraryUrn="urn:adsk.eagle:library:395" 252 | UsedLibraryUrn="urn:adsk.eagle:library:396" 253 | UsedLibraryUrn="urn:adsk.eagle:library:397" 254 | UsedLibraryUrn="urn:adsk.eagle:library:110" 255 | UsedLibraryUrn="urn:adsk.eagle:library:398" 256 | UsedLibraryUrn="urn:adsk.eagle:library:399" 257 | UsedLibraryUrn="urn:adsk.eagle:library:400" 258 | UsedLibraryUrn="urn:adsk.eagle:library:401" 259 | UsedLibraryUrn="urn:adsk.eagle:library:402" 260 | UsedLibraryUrn="urn:adsk.eagle:library:403" 261 | UsedLibraryUrn="urn:adsk.eagle:library:404" 262 | UsedLibraryUrn="urn:adsk.eagle:library:405" 263 | UsedLibraryUrn="urn:adsk.eagle:library:406" 264 | UsedLibraryUrn="urn:adsk.eagle:library:407" 265 | UsedLibraryUrn="urn:adsk.eagle:library:111" 266 | UsedLibraryUrn="urn:adsk.eagle:library:408" 267 | UsedLibraryUrn="urn:adsk.eagle:library:409" 268 | UsedLibraryUrn="urn:adsk.eagle:library:410" 269 | UsedLibraryUrn="urn:adsk.eagle:library:411" 270 | UsedLibraryUrn="urn:adsk.eagle:library:412" 271 | UsedLibraryUrn="urn:adsk.eagle:library:413" 272 | UsedLibraryUrn="urn:adsk.eagle:library:414" 273 | UsedLibraryUrn="urn:adsk.eagle:library:415" 274 | UsedLibraryUrn="urn:adsk.eagle:library:416" 275 | UsedLibraryUrn="urn:adsk.eagle:library:417" 276 | UsedLibraryUrn="urn:adsk.eagle:library:112" 277 | UsedLibraryUrn="urn:adsk.eagle:library:418" 278 | UsedLibraryUrn="urn:adsk.eagle:library:419" 279 | UsedLibraryUrn="urn:adsk.eagle:library:527439" 280 | UsedLibraryUrn="urn:adsk.eagle:library:113" 281 | UsedLibraryUrn="urn:adsk.eagle:library:114" 282 | UsedLibraryUrn="urn:adsk.eagle:library:115" 283 | UsedLibraryUrn="urn:adsk.eagle:library:116" 284 | UsedLibraryUrn="urn:adsk.eagle:library:117" 285 | UsedLibraryUrn="urn:adsk.eagle:library:82" 286 | UsedLibraryUrn="urn:adsk.eagle:library:118" 287 | UsedLibraryUrn="urn:adsk.eagle:library:119" 288 | UsedLibraryUrn="urn:adsk.eagle:library:120" 289 | UsedLibraryUrn="urn:adsk.eagle:library:121" 290 | UsedLibraryUrn="urn:adsk.eagle:library:122" 291 | UsedLibraryUrn="urn:adsk.eagle:library:123" 292 | UsedLibraryUrn="urn:adsk.eagle:library:124" 293 | UsedLibraryUrn="urn:adsk.eagle:library:125" 294 | UsedLibraryUrn="urn:adsk.eagle:library:126" 295 | UsedLibraryUrn="urn:adsk.eagle:library:127" 296 | UsedLibraryUrn="urn:adsk.eagle:library:83" 297 | UsedLibraryUrn="urn:adsk.eagle:library:128" 298 | UsedLibraryUrn="urn:adsk.eagle:library:129" 299 | UsedLibraryUrn="urn:adsk.eagle:library:130" 300 | UsedLibraryUrn="urn:adsk.eagle:library:131" 301 | UsedLibraryUrn="urn:adsk.eagle:library:132" 302 | UsedLibraryUrn="urn:adsk.eagle:library:133" 303 | UsedLibraryUrn="urn:adsk.eagle:library:134" 304 | UsedLibraryUrn="urn:adsk.eagle:library:135" 305 | UsedLibraryUrn="urn:adsk.eagle:library:136" 306 | UsedLibraryUrn="urn:adsk.eagle:library:137" 307 | UsedLibraryUrn="urn:adsk.eagle:library:84" 308 | UsedLibraryUrn="urn:adsk.eagle:library:138" 309 | UsedLibraryUrn="urn:adsk.eagle:library:139" 310 | UsedLibraryUrn="urn:adsk.eagle:library:140" 311 | UsedLibraryUrn="urn:adsk.eagle:library:141" 312 | UsedLibraryUrn="urn:adsk.eagle:library:142" 313 | UsedLibraryUrn="urn:adsk.eagle:library:143" 314 | UsedLibraryUrn="urn:adsk.eagle:library:144" 315 | UsedLibraryUrn="urn:adsk.eagle:library:145" 316 | UsedLibraryUrn="urn:adsk.eagle:library:146" 317 | UsedLibraryUrn="urn:adsk.eagle:library:147" 318 | UsedLibraryUrn="urn:adsk.eagle:library:85" 319 | UsedLibraryUrn="urn:adsk.eagle:library:148" 320 | UsedLibraryUrn="urn:adsk.eagle:library:149" 321 | UsedLibraryUrn="urn:adsk.eagle:library:150" 322 | UsedLibraryUrn="urn:adsk.eagle:library:151" 323 | UsedLibraryUrn="urn:adsk.eagle:library:152" 324 | UsedLibraryUrn="urn:adsk.eagle:library:153" 325 | UsedLibraryUrn="urn:adsk.eagle:library:154" 326 | UsedLibraryUrn="urn:adsk.eagle:library:155" 327 | UsedLibraryUrn="urn:adsk.eagle:library:156" 328 | UsedLibraryUrn="urn:adsk.eagle:library:157" 329 | UsedLibraryUrn="urn:adsk.eagle:library:86" 330 | UsedLibraryUrn="urn:adsk.eagle:library:158" 331 | UsedLibraryUrn="urn:adsk.eagle:library:159" 332 | UsedLibraryUrn="urn:adsk.eagle:library:160" 333 | UsedLibraryUrn="urn:adsk.eagle:library:161" 334 | UsedLibraryUrn="urn:adsk.eagle:library:162" 335 | UsedLibraryUrn="urn:adsk.eagle:library:163" 336 | UsedLibraryUrn="urn:adsk.eagle:library:164" 337 | UsedLibraryUrn="urn:adsk.eagle:library:165" 338 | UsedLibraryUrn="urn:adsk.eagle:library:166" 339 | UsedLibraryUrn="urn:adsk.eagle:library:167" 340 | UsedLibraryUrn="urn:adsk.eagle:library:87" 341 | UsedLibraryUrn="urn:adsk.eagle:library:168" 342 | UsedLibraryUrn="urn:adsk.eagle:library:169" 343 | UsedLibraryUrn="urn:adsk.eagle:library:170" 344 | UsedLibraryUrn="urn:adsk.eagle:library:171" 345 | UsedLibraryUrn="urn:adsk.eagle:library:172" 346 | UsedLibraryUrn="urn:adsk.eagle:library:173" 347 | UsedLibraryUrn="urn:adsk.eagle:library:174" 348 | UsedLibraryUrn="urn:adsk.eagle:library:175" 349 | UsedLibraryUrn="urn:adsk.eagle:library:176" 350 | UsedLibraryUrn="urn:adsk.eagle:library:177" 351 | UsedLibrary="/home/marion/opt/eagle-8.6.0/lbr/Allegro_By_element14_Batch_1.lbr" 352 | UsedLibrary="/home/marion/opt/eagle-8.6.0/lbr/Clean-Kong.lbr" 353 | UsedLibrary="/home/marion/opt/eagle-8.6.0/lbr/SparkFun-Batteries.lbr" 354 | UsedLibrary="/home/marion/opt/eagle-8.6.0/lbr/SparkFun-Boards.lbr" 355 | UsedLibrary="/home/marion/opt/eagle-8.6.0/lbr/SparkFun-Capacitors.lbr" 356 | UsedLibrary="/home/marion/opt/eagle-8.6.0/lbr/SparkFun-Coils.lbr" 357 | UsedLibrary="/home/marion/opt/eagle-8.6.0/lbr/SparkFun-Connectors.lbr" 358 | UsedLibrary="/home/marion/opt/eagle-8.6.0/lbr/SparkFun-DiscreteSemi.lbr" 359 | UsedLibrary="/home/marion/opt/eagle-8.6.0/lbr/SparkFun-Electromechanical.lbr" 360 | UsedLibrary="/home/marion/opt/eagle-8.6.0/lbr/SparkFun-IC-Logic.lbr" 361 | UsedLibrary="/home/marion/opt/eagle-8.6.0/lbr/SparkFun-IC-Microcontroller.lbr" 362 | UsedLibrary="/home/marion/opt/eagle-8.6.0/lbr/SparkFun-IC-Special-Function.lbr" 363 | UsedLibrary="/home/marion/opt/eagle-8.6.0/lbr/SparkFun-Resistors.lbr" 364 | UsedLibrary="/home/marion/opt/eagle-8.6.0/lbr/SparkFun-Switches.lbr" 365 | UsedLibrary="/home/marion/opt/eagle-8.6.0/lbr/User-Submitted.lbr" 366 | UsedLibrary="/home/marion/opt/eagle-8.6.0/lbr/pololu.lbr" 367 | 368 | [Win_1] 369 | Type="Schematic Editor" 370 | Number=1 371 | File="rotator.sch" 372 | View="33.8128 0.0624125 150.001 116.025" 373 | WireWidths=" 0.0762 0.1016 0.127 0.15 0.2 0.2032 0.254 0.3048 0.4064 0.508 0.6096 0.8128 1.016 1.27 2.54 0.1524" 374 | PadDiameters=" 0.254 0.3048 0.4064 0.6096 0.8128 1.016 1.27 1.4224 1.6764 1.778 1.9304 2.1844 2.54 3.81 6.4516 0" 375 | PadDrills=" 0.2 0.25 0.3 0.35 0.4 0.45 0.5 0.55 0.65 0.7 0.75 0.8 0.85 0.9 1 0.6" 376 | ViaDiameters=" 0.55 0.6 0.65 0.7 0.75 0.8 0.85 0.9 0.95 1 1.05 1.1 1.15 1.2 1.3 0" 377 | ViaDrills=" 0.2 0.25 0.3 0.4 0.45 0.5 0.55 0.6 0.65 0.7 0.75 0.8 0.85 0.9 1 0.35" 378 | HoleDrills=" 0.2 0.25 0.3 0.4 0.45 0.5 0.55 0.6 0.65 0.7 0.75 0.8 0.85 0.9 1 0.35" 379 | TextSizes=" 0.254 0.3048 0.4064 0.6096 0.8128 1.016 1.27 1.4224 1.6764 1.9304 2.1844 2.54 3.81 5.08 6.4516 1.778" 380 | PolygonSpacings=" 0.254 0.3048 0.4064 0.6096 0.8128 1.016 1.4224 1.6764 1.778 1.9304 2.1844 2.54 3.81 5.08 6.4516 1.27" 381 | PolygonIsolates=" 0.254 0.3048 0.4064 0.6096 0.8128 1.016 1.27 1.4224 1.6764 1.778 1.9304 2.1844 2.54 3.81 6.4516 0" 382 | MiterRadiuss=" 0.254 0.3175 0.635 1.27 2.54 1 2 2.5 5 7.5 10 0" 383 | DimensionWidths=" 0 0.127 0.254 0.1 0.26 0.13" 384 | DimensionExtWidths=" 0.127 0.254 0.1 0.13 0.26 0" 385 | DimensionExtLengths=" 1.27 2.54 1 2 3 0" 386 | DimensionExtOffsets=" 1.27 2.54 1 2 3 0" 387 | SmdSizes=" 0.3048 0.1524 0.4064 0.2032 0.6096 0.3048 0.8128 0.4064 1.016 0.508 1.27 0.6604 1.4224 0.7112 1.6764 0.8128 1.778 0.9144 1.9304 0.9652 2.1844 1.0668 2.54 1.27 3.81 1.9304 5.08 2.54 6.4516 3.2512 1.27 0.635" 388 | WireBend=3 389 | WireBendSet=31 390 | WireCap=1 391 | MiterStyle=0 392 | PadShape=0 393 | ViaShape=1 394 | PolygonPour=0 395 | PolygonRank=0 396 | PolygonThermals=1 397 | PolygonOrphans=0 398 | TextRatio=8 399 | DimensionUnit=1 400 | DimensionPrecision=2 401 | DimensionShowUnit=0 402 | PinDirection=3 403 | PinFunction=0 404 | PinLength=2 405 | PinVisible=3 406 | SwapLevel=0 407 | ArcDirection=0 408 | AddLevel=2 409 | PadsSameType=0 410 | Layer=91 411 | Views=" 1: 33.8128 0.0624125 150.001 116.025" 412 | Sheet="1" 413 | 414 | [Win_2] 415 | Type="Control Panel" 416 | Number=0 417 | 418 | [Desktop] 419 | Screen="1920 1080" 420 | Window="Win_1" 421 | Window="Win_2" 422 | -------------------------------------------------------------------------------- /installers/install.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | # Install script for cmd-n-ctl part of mySatComm github project 3 | # Creates and installs directly into a virtual environment 4 | # Intended to be run on Raspberry Pi system 5 | 6 | # Script Setup 7 | # ============ 8 | set -o errexit -o pipefail 9 | 10 | # Script Execution 11 | # ================ 12 | echo "Running cmd-n-ctl install.sh" 13 | script_path=$(dirname "$0") # for copying files 14 | 15 | # Install python3 16 | # --------------- 17 | echo 18 | echo "Checking for python3..." 19 | sudo apt install python3 20 | 21 | # Install pip3 22 | # ------------ 23 | echo 24 | echo "Checking for pip3..." 25 | sudo apt install python3-pip 26 | 27 | # Install hamlib 28 | # --------------- 29 | echo 30 | echo "Checking for hamlib..." 31 | sudo apt install libhamlib-doc libhamlib-dev libhamlib-utils 32 | 33 | # Install socat 34 | # ------------- 35 | echo 36 | echo "Checking for socat..." 37 | sudo apt install socat 38 | 39 | # Install pigpio daemon 40 | # --------------------- 41 | echo 42 | echo "Checking for pigpio daemon..." 43 | sudo apt install pigpio 44 | 45 | # Install & activate virtualenv 46 | # ----------------------------- 47 | echo 48 | echo "Checking for virtualenv..." 49 | sudo pip3 install virtualenv 50 | 51 | # activating virtualenv 52 | if ! [ -e "$HOME/.satcomm/bin/activate" ]; then 53 | echo; echo "Creating virtual environment..." 54 | python3 -m venv "$HOME/.satcomm/" 55 | fi 56 | source "$HOME/.satcomm/bin/activate" 57 | echo "Virtual environment activated!" 58 | echo; echo "Installing python packages..." 59 | 60 | # Install python packages 61 | # ----------------------- 62 | echo "Installing rotator-lib..." 63 | pip3 install -e "$script_path/../cmd-n-ctl/rotator-lib/" --no-cache-dir 64 | echo; echo "Installing pyserial..." 65 | pip3 install pyserial --no-cache-dir 66 | echo; echo "Installing click..." 67 | pip3 install click --no-cache-dir 68 | 69 | # Copy utils 70 | # ---------- 71 | # for loop is necessary because the dynamic path interferes with globbing 72 | # yes, it is hacky. If you have a more robust solution please let me know 73 | for i in $(ls "$script_path/../cmd-n-ctl/utils/"); do 74 | cp -r "$script_path/../cmd-n-ctl/utils/$i" "$HOME/.satcomm/bin/" 75 | done 76 | cp "../run.sh" "$HOME/.satcomm/bin/" 77 | 78 | # Cleanup 79 | # ------- 80 | deactivate 81 | echo 82 | echo "Installation Complete!" 83 | echo "Virtual environment stored in $HOME/.satcomm/bin/activate" 84 | 85 | exit 0 86 | -------------------------------------------------------------------------------- /installers/uninstall.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | # Uninstall script for cmd-n-ctl part of mySatComm github project 3 | # Intended to be run on a Raspberry Pi system 4 | 5 | # Script Setup 6 | # ============ 7 | set -o pipefail -o errexit 8 | 9 | function helpmsg() { 10 | echo "usage: uninstall.sh [--all]" 11 | echo "Uninstalls antenna controller python libraries and scripts" 12 | echo " --all Remove all packages, not just sainsmart-lib" 13 | } 14 | 15 | # Script Execution 16 | # ================ 17 | # Notify user script is running 18 | # ----------------------------- 19 | echo "Running cmd-n-ctl/uninstall.sh" 20 | goflag="n" 21 | 22 | if [ $# -gt 1 ]; then 23 | echo "Error: too many arguments" 24 | helpmsg 25 | exit 1 26 | elif [ $# -eq 1 ] && [ $1 = "-h" ]; then 27 | helpmsg 28 | exit 0 29 | elif [ $# -eq 1 ] && [ $1 = '--all' ]; then 30 | echo 31 | echo -n "--all flag selected. This WILL uninstall ALL system dependencies," 32 | echo " including pip." 33 | read -p "Continue? (y/n): " goflag 34 | if ! [ "$goflag" = "y" ]; then 35 | echo "Exiting" 36 | exit 0 37 | fi 38 | elif [ $# -ne 0 ]; then 39 | echo "Error: bad argument" 40 | helpmsg 41 | exit 1 42 | fi 43 | 44 | # Removing python packages 45 | # ------------------------ 46 | source /home/$USER/.satcomm/bin/activate 47 | echo; echo "Virtual environment activated" 48 | pip3 uninstall "rotator" --yes 49 | pip3 uninstall "pyserial" --yes 50 | pip3 uninstall "click" --yes 51 | deactivate 52 | rm -rf /home/$USER/.satcomm 53 | 54 | # Remove other packages as well 55 | # ----------------------------- 56 | if [ "$goflag" = 'y' ]; then 57 | sudo apt remove libhamlib-doc libhamlib-dev libhamlib-utils pigpio python3-pip python3-venv socat --purge 58 | echo 'All dependencies at system-level removed' 59 | fi 60 | 61 | echo; echo "Removal Complete!" 62 | exit 0 63 | -------------------------------------------------------------------------------- /mechanical/antenna/dipole/dipole_mount.AI: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lowdrant/mySatComm/ff8367a7449865121f061bec93ceecf4d5bdc675/mechanical/antenna/dipole/dipole_mount.AI -------------------------------------------------------------------------------- /mechanical/antenna/dipole/dipole_mount.SLDDRW: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lowdrant/mySatComm/ff8367a7449865121f061bec93ceecf4d5bdc675/mechanical/antenna/dipole/dipole_mount.SLDDRW -------------------------------------------------------------------------------- /mechanical/antenna/dipole/dipole_mount.SLDPRT: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lowdrant/mySatComm/ff8367a7449865121f061bec93ceecf4d5bdc675/mechanical/antenna/dipole/dipole_mount.SLDPRT -------------------------------------------------------------------------------- /mechanical/antenna/yagi/yagi_base.AI: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lowdrant/mySatComm/ff8367a7449865121f061bec93ceecf4d5bdc675/mechanical/antenna/yagi/yagi_base.AI -------------------------------------------------------------------------------- /mechanical/antenna/yagi/yagi_base.SLDDRW: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lowdrant/mySatComm/ff8367a7449865121f061bec93ceecf4d5bdc675/mechanical/antenna/yagi/yagi_base.SLDDRW -------------------------------------------------------------------------------- /mechanical/antenna/yagi/yagi_base.SLDPRT: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lowdrant/mySatComm/ff8367a7449865121f061bec93ceecf4d5bdc675/mechanical/antenna/yagi/yagi_base.SLDPRT -------------------------------------------------------------------------------- /mechanical/azel_controller/AxleBracket.SLDPRT: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lowdrant/mySatComm/ff8367a7449865121f061bec93ceecf4d5bdc675/mechanical/azel_controller/AxleBracket.SLDPRT -------------------------------------------------------------------------------- /mechanical/azel_controller/BottomBracket.SLDPRT: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lowdrant/mySatComm/ff8367a7449865121f061bec93ceecf4d5bdc675/mechanical/azel_controller/BottomBracket.SLDPRT -------------------------------------------------------------------------------- /mechanical/azel_controller/Bracket-SameAxisServos.SLDPRT: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lowdrant/mySatComm/ff8367a7449865121f061bec93ceecf4d5bdc675/mechanical/azel_controller/Bracket-SameAxisServos.SLDPRT -------------------------------------------------------------------------------- /mechanical/azel_controller/Final.SLDASM: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lowdrant/mySatComm/ff8367a7449865121f061bec93ceecf4d5bdc675/mechanical/azel_controller/Final.SLDASM -------------------------------------------------------------------------------- /mechanical/azel_controller/Housing.SLDPRT: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lowdrant/mySatComm/ff8367a7449865121f061bec93ceecf4d5bdc675/mechanical/azel_controller/Housing.SLDPRT -------------------------------------------------------------------------------- /mechanical/azel_controller/Rotator.SLDASM: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lowdrant/mySatComm/ff8367a7449865121f061bec93ceecf4d5bdc675/mechanical/azel_controller/Rotator.SLDASM -------------------------------------------------------------------------------- /mechanical/azel_controller/RotorCover.SLDPRT: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lowdrant/mySatComm/ff8367a7449865121f061bec93ceecf4d5bdc675/mechanical/azel_controller/RotorCover.SLDPRT -------------------------------------------------------------------------------- /mechanical/azel_controller/Servo.SLDPRT: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lowdrant/mySatComm/ff8367a7449865121f061bec93ceecf4d5bdc675/mechanical/azel_controller/Servo.SLDPRT -------------------------------------------------------------------------------- /mechanical/azel_controller/ServoWithBrackets.SLDASM: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lowdrant/mySatComm/ff8367a7449865121f061bec93ceecf4d5bdc675/mechanical/azel_controller/ServoWithBrackets.SLDASM -------------------------------------------------------------------------------- /mechanical/azel_controller/Stepper.SLDPRT: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lowdrant/mySatComm/ff8367a7449865121f061bec93ceecf4d5bdc675/mechanical/azel_controller/Stepper.SLDPRT -------------------------------------------------------------------------------- /mechanical/azel_controller/StepperConnector.SLDPRT: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lowdrant/mySatComm/ff8367a7449865121f061bec93ceecf4d5bdc675/mechanical/azel_controller/StepperConnector.SLDPRT -------------------------------------------------------------------------------- /mechanical/drawings/Housing.AI: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lowdrant/mySatComm/ff8367a7449865121f061bec93ceecf4d5bdc675/mechanical/drawings/Housing.AI -------------------------------------------------------------------------------- /mechanical/drawings/Housing.SLDDRW: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lowdrant/mySatComm/ff8367a7449865121f061bec93ceecf4d5bdc675/mechanical/drawings/Housing.SLDDRW -------------------------------------------------------------------------------- /mechanical/drawings/Servo.SLDDRW: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lowdrant/mySatComm/ff8367a7449865121f061bec93ceecf4d5bdc675/mechanical/drawings/Servo.SLDDRW -------------------------------------------------------------------------------- /mechanical/drawings/controller.PDF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lowdrant/mySatComm/ff8367a7449865121f061bec93ceecf4d5bdc675/mechanical/drawings/controller.PDF -------------------------------------------------------------------------------- /mechanical/drawings/controller.SLDDRW: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lowdrant/mySatComm/ff8367a7449865121f061bec93ceecf4d5bdc675/mechanical/drawings/controller.SLDDRW -------------------------------------------------------------------------------- /mechanical/drawings/dipole.PDF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lowdrant/mySatComm/ff8367a7449865121f061bec93ceecf4d5bdc675/mechanical/drawings/dipole.PDF -------------------------------------------------------------------------------- /mechanical/drawings/dipole.SLDDRW: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lowdrant/mySatComm/ff8367a7449865121f061bec93ceecf4d5bdc675/mechanical/drawings/dipole.SLDDRW -------------------------------------------------------------------------------- /mechanical/stl/Final.STL: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lowdrant/mySatComm/ff8367a7449865121f061bec93ceecf4d5bdc675/mechanical/stl/Final.STL -------------------------------------------------------------------------------- /mechanical/stl/Housing.STL: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lowdrant/mySatComm/ff8367a7449865121f061bec93ceecf4d5bdc675/mechanical/stl/Housing.STL -------------------------------------------------------------------------------- /mechanical/stl/HousingMk2.STL: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lowdrant/mySatComm/ff8367a7449865121f061bec93ceecf4d5bdc675/mechanical/stl/HousingMk2.STL -------------------------------------------------------------------------------- /mechanical/stl/README.md: -------------------------------------------------------------------------------- 1 | # stl 2 | Models for 3D printing. GitHub can also render them natively. 3 | 4 | ## 3D Printing 5 | The files here are already in a 3D-printer friendly format (STL). See this [video](https://www.youtube.com/watch?v=3LBTkLsjHGQ) for a how-to. 6 | 7 | ## Viewing in GitHub 8 | GitHub natively supports viewing STL models in the browser. Just click on any file like you would code and it will render it for you! 9 | -------------------------------------------------------------------------------- /mechanical/stl/StepperConnector.STL: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lowdrant/mySatComm/ff8367a7449865121f061bec93ceecf4d5bdc675/mechanical/stl/StepperConnector.STL -------------------------------------------------------------------------------- /mechanical/stl/dipole.STL: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lowdrant/mySatComm/ff8367a7449865121f061bec93ceecf4d5bdc675/mechanical/stl/dipole.STL -------------------------------------------------------------------------------- /run.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | # 3 | # Run script for antenna rotation 4 | # 5 | # Author: Marion Anderson 6 | # Date: 2018-07-06 7 | # File: run.sh 8 | 9 | 10 | # leave out `set -o errexit` so C-c during interfacing 11 | # leads directly to unstitcher 12 | set -o nounset -o pipefail 13 | 14 | # stitch resources 15 | stitcher.sh 16 | 17 | # begin interfacing 18 | interface.py 19 | 20 | # cleanup 21 | unstitcher.sh 22 | -------------------------------------------------------------------------------- /sdr/rx/apt_dump.grc: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Mon Jul 9 23:09:55 2018 5 | 6 | options 7 | 8 | author 9 | 10 | 11 | 12 | window_size 13 | 14 | 15 | 16 | category 17 | [GRC Hier Blocks] 18 | 19 | 20 | comment 21 | 22 | 23 | 24 | description 25 | 26 | 27 | 28 | _enabled 29 | True 30 | 31 | 32 | _coordinate 33 | (8, 8) 34 | 35 | 36 | _rotation 37 | 0 38 | 39 | 40 | generate_options 41 | qt_gui 42 | 43 | 44 | hier_block_src_path 45 | .: 46 | 47 | 48 | id 49 | top_block 50 | 51 | 52 | max_nouts 53 | 0 54 | 55 | 56 | qt_qss_theme 57 | 58 | 59 | 60 | realtime_scheduling 61 | 62 | 63 | 64 | run_command 65 | {python} -u {filename} 66 | 67 | 68 | run_options 69 | prompt 70 | 71 | 72 | run 73 | True 74 | 75 | 76 | thread_safe_setters 77 | 78 | 79 | 80 | title 81 | 82 | 83 | 84 | 85 | variable 86 | 87 | comment 88 | 89 | 90 | 91 | _enabled 92 | True 93 | 94 | 95 | _coordinate 96 | (328, 68) 97 | 98 | 99 | _rotation 100 | 0 101 | 102 | 103 | id 104 | center_freq 105 | 106 | 107 | value 108 | 137e6 109 | 110 | 111 | 112 | variable 113 | 114 | comment 115 | 116 | 117 | 118 | _enabled 119 | True 120 | 121 | 122 | _coordinate 123 | (424, 68) 124 | 125 | 126 | _rotation 127 | 0 128 | 129 | 130 | id 131 | data_samp_rate 132 | 133 | 134 | value 135 | 10e3 136 | 137 | 138 | 139 | variable 140 | 141 | comment 142 | 143 | 144 | 145 | _enabled 146 | True 147 | 148 | 149 | _coordinate 150 | (384, 4) 151 | 152 | 153 | _rotation 154 | 0 155 | 156 | 157 | id 158 | radio_samp_rate 159 | 160 | 161 | value 162 | 2e6 163 | 164 | 165 | 166 | analog_sig_source_x 167 | 168 | amp 169 | 1 170 | 171 | 172 | alias 173 | 174 | 175 | 176 | comment 177 | 178 | 179 | 180 | affinity 181 | 182 | 183 | 184 | _enabled 185 | True 186 | 187 | 188 | freq 189 | doppler_freq-center_freq 190 | 191 | 192 | _coordinate 193 | (216, 232) 194 | 195 | 196 | _rotation 197 | 0 198 | 199 | 200 | id 201 | analog_sig_source_x_0 202 | 203 | 204 | maxoutbuf 205 | 0 206 | 207 | 208 | minoutbuf 209 | 0 210 | 211 | 212 | offset 213 | 0 214 | 215 | 216 | type 217 | complex 218 | 219 | 220 | samp_rate 221 | data_samp_rate 222 | 223 | 224 | waveform 225 | analog.GR_COS_WAVE 226 | 227 | 228 | 229 | blocks_file_sink 230 | 231 | append 232 | False 233 | 234 | 235 | alias 236 | 237 | 238 | 239 | comment 240 | 241 | 242 | 243 | affinity 244 | 245 | 246 | 247 | _enabled 248 | True 249 | 250 | 251 | file 252 | raw_apt_dump 253 | 254 | 255 | _coordinate 256 | (56, 420) 257 | 258 | 259 | _rotation 260 | 0 261 | 262 | 263 | id 264 | blocks_file_sink_0 265 | 266 | 267 | type 268 | complex 269 | 270 | 271 | unbuffered 272 | False 273 | 274 | 275 | vlen 276 | 1 277 | 278 | 279 | 280 | blocks_multiply_xx 281 | 282 | alias 283 | 284 | 285 | 286 | comment 287 | 288 | 289 | 290 | affinity 291 | 292 | 293 | 294 | _enabled 295 | True 296 | 297 | 298 | _coordinate 299 | (472, 208) 300 | 301 | 302 | _rotation 303 | 0 304 | 305 | 306 | id 307 | blocks_multiply_xx_0 308 | 309 | 310 | type 311 | complex 312 | 313 | 314 | maxoutbuf 315 | 0 316 | 317 | 318 | minoutbuf 319 | 0 320 | 321 | 322 | num_inputs 323 | 2 324 | 325 | 326 | vlen 327 | 1 328 | 329 | 330 | 331 | gpredict_doppler 332 | 333 | alias 334 | 335 | 336 | 337 | comment 338 | 339 | 340 | 341 | _enabled 342 | True 343 | 344 | 345 | _coordinate 346 | (176, 8) 347 | 348 | 349 | _rotation 350 | 0 351 | 352 | 353 | gpredict_host 354 | localhost 355 | 356 | 357 | gpredict_port 358 | 4532 359 | 360 | 361 | id 362 | gpredict_doppler_0 363 | 364 | 365 | target 366 | doppler_freq 367 | 368 | 369 | verbose 370 | True 371 | 372 | 373 | 374 | rational_resampler_xxx 375 | 376 | alias 377 | 378 | 379 | 380 | comment 381 | 382 | 383 | 384 | affinity 385 | 386 | 387 | 388 | decim 389 | 200 390 | 391 | 392 | _enabled 393 | True 394 | 395 | 396 | fbw 397 | 0 398 | 399 | 400 | _coordinate 401 | (232, 144) 402 | 403 | 404 | _rotation 405 | 0 406 | 407 | 408 | id 409 | rational_resampler_xxx_0 410 | 411 | 412 | interp 413 | 1 414 | 415 | 416 | maxoutbuf 417 | 0 418 | 419 | 420 | minoutbuf 421 | 0 422 | 423 | 424 | taps 425 | 426 | 427 | 428 | type 429 | ccc 430 | 431 | 432 | 433 | rtlsdr_source 434 | 435 | alias 436 | 437 | 438 | 439 | ant0 440 | 441 | 442 | 443 | bb_gain0 444 | 20 445 | 446 | 447 | bw0 448 | 0 449 | 450 | 451 | dc_offset_mode0 452 | 0 453 | 454 | 455 | corr0 456 | 0 457 | 458 | 459 | freq0 460 | center_freq 461 | 462 | 463 | gain_mode0 464 | False 465 | 466 | 467 | if_gain0 468 | 20 469 | 470 | 471 | iq_balance_mode0 472 | 0 473 | 474 | 475 | gain0 476 | 10 477 | 478 | 479 | ant10 480 | 481 | 482 | 483 | bb_gain10 484 | 20 485 | 486 | 487 | bw10 488 | 0 489 | 490 | 491 | dc_offset_mode10 492 | 0 493 | 494 | 495 | corr10 496 | 0 497 | 498 | 499 | freq10 500 | 100e6 501 | 502 | 503 | gain_mode10 504 | False 505 | 506 | 507 | if_gain10 508 | 20 509 | 510 | 511 | iq_balance_mode10 512 | 0 513 | 514 | 515 | gain10 516 | 10 517 | 518 | 519 | ant11 520 | 521 | 522 | 523 | bb_gain11 524 | 20 525 | 526 | 527 | bw11 528 | 0 529 | 530 | 531 | dc_offset_mode11 532 | 0 533 | 534 | 535 | corr11 536 | 0 537 | 538 | 539 | freq11 540 | 100e6 541 | 542 | 543 | gain_mode11 544 | False 545 | 546 | 547 | if_gain11 548 | 20 549 | 550 | 551 | iq_balance_mode11 552 | 0 553 | 554 | 555 | gain11 556 | 10 557 | 558 | 559 | ant12 560 | 561 | 562 | 563 | bb_gain12 564 | 20 565 | 566 | 567 | bw12 568 | 0 569 | 570 | 571 | dc_offset_mode12 572 | 0 573 | 574 | 575 | corr12 576 | 0 577 | 578 | 579 | freq12 580 | 100e6 581 | 582 | 583 | gain_mode12 584 | False 585 | 586 | 587 | if_gain12 588 | 20 589 | 590 | 591 | iq_balance_mode12 592 | 0 593 | 594 | 595 | gain12 596 | 10 597 | 598 | 599 | ant13 600 | 601 | 602 | 603 | bb_gain13 604 | 20 605 | 606 | 607 | bw13 608 | 0 609 | 610 | 611 | dc_offset_mode13 612 | 0 613 | 614 | 615 | corr13 616 | 0 617 | 618 | 619 | freq13 620 | 100e6 621 | 622 | 623 | gain_mode13 624 | False 625 | 626 | 627 | if_gain13 628 | 20 629 | 630 | 631 | iq_balance_mode13 632 | 0 633 | 634 | 635 | gain13 636 | 10 637 | 638 | 639 | ant14 640 | 641 | 642 | 643 | bb_gain14 644 | 20 645 | 646 | 647 | bw14 648 | 0 649 | 650 | 651 | dc_offset_mode14 652 | 0 653 | 654 | 655 | corr14 656 | 0 657 | 658 | 659 | freq14 660 | 100e6 661 | 662 | 663 | gain_mode14 664 | False 665 | 666 | 667 | if_gain14 668 | 20 669 | 670 | 671 | iq_balance_mode14 672 | 0 673 | 674 | 675 | gain14 676 | 10 677 | 678 | 679 | ant15 680 | 681 | 682 | 683 | bb_gain15 684 | 20 685 | 686 | 687 | bw15 688 | 0 689 | 690 | 691 | dc_offset_mode15 692 | 0 693 | 694 | 695 | corr15 696 | 0 697 | 698 | 699 | freq15 700 | 100e6 701 | 702 | 703 | gain_mode15 704 | False 705 | 706 | 707 | if_gain15 708 | 20 709 | 710 | 711 | iq_balance_mode15 712 | 0 713 | 714 | 715 | gain15 716 | 10 717 | 718 | 719 | ant16 720 | 721 | 722 | 723 | bb_gain16 724 | 20 725 | 726 | 727 | bw16 728 | 0 729 | 730 | 731 | dc_offset_mode16 732 | 0 733 | 734 | 735 | corr16 736 | 0 737 | 738 | 739 | freq16 740 | 100e6 741 | 742 | 743 | gain_mode16 744 | False 745 | 746 | 747 | if_gain16 748 | 20 749 | 750 | 751 | iq_balance_mode16 752 | 0 753 | 754 | 755 | gain16 756 | 10 757 | 758 | 759 | ant17 760 | 761 | 762 | 763 | bb_gain17 764 | 20 765 | 766 | 767 | bw17 768 | 0 769 | 770 | 771 | dc_offset_mode17 772 | 0 773 | 774 | 775 | corr17 776 | 0 777 | 778 | 779 | freq17 780 | 100e6 781 | 782 | 783 | gain_mode17 784 | False 785 | 786 | 787 | if_gain17 788 | 20 789 | 790 | 791 | iq_balance_mode17 792 | 0 793 | 794 | 795 | gain17 796 | 10 797 | 798 | 799 | ant18 800 | 801 | 802 | 803 | bb_gain18 804 | 20 805 | 806 | 807 | bw18 808 | 0 809 | 810 | 811 | dc_offset_mode18 812 | 0 813 | 814 | 815 | corr18 816 | 0 817 | 818 | 819 | freq18 820 | 100e6 821 | 822 | 823 | gain_mode18 824 | False 825 | 826 | 827 | if_gain18 828 | 20 829 | 830 | 831 | iq_balance_mode18 832 | 0 833 | 834 | 835 | gain18 836 | 10 837 | 838 | 839 | ant19 840 | 841 | 842 | 843 | bb_gain19 844 | 20 845 | 846 | 847 | bw19 848 | 0 849 | 850 | 851 | dc_offset_mode19 852 | 0 853 | 854 | 855 | corr19 856 | 0 857 | 858 | 859 | freq19 860 | 100e6 861 | 862 | 863 | gain_mode19 864 | False 865 | 866 | 867 | if_gain19 868 | 20 869 | 870 | 871 | iq_balance_mode19 872 | 0 873 | 874 | 875 | gain19 876 | 10 877 | 878 | 879 | ant1 880 | 881 | 882 | 883 | bb_gain1 884 | 20 885 | 886 | 887 | bw1 888 | 0 889 | 890 | 891 | dc_offset_mode1 892 | 0 893 | 894 | 895 | corr1 896 | 0 897 | 898 | 899 | freq1 900 | 100e6 901 | 902 | 903 | gain_mode1 904 | False 905 | 906 | 907 | if_gain1 908 | 20 909 | 910 | 911 | iq_balance_mode1 912 | 0 913 | 914 | 915 | gain1 916 | 10 917 | 918 | 919 | ant20 920 | 921 | 922 | 923 | bb_gain20 924 | 20 925 | 926 | 927 | bw20 928 | 0 929 | 930 | 931 | dc_offset_mode20 932 | 0 933 | 934 | 935 | corr20 936 | 0 937 | 938 | 939 | freq20 940 | 100e6 941 | 942 | 943 | gain_mode20 944 | False 945 | 946 | 947 | if_gain20 948 | 20 949 | 950 | 951 | iq_balance_mode20 952 | 0 953 | 954 | 955 | gain20 956 | 10 957 | 958 | 959 | ant21 960 | 961 | 962 | 963 | bb_gain21 964 | 20 965 | 966 | 967 | bw21 968 | 0 969 | 970 | 971 | dc_offset_mode21 972 | 0 973 | 974 | 975 | corr21 976 | 0 977 | 978 | 979 | freq21 980 | 100e6 981 | 982 | 983 | gain_mode21 984 | False 985 | 986 | 987 | if_gain21 988 | 20 989 | 990 | 991 | iq_balance_mode21 992 | 0 993 | 994 | 995 | gain21 996 | 10 997 | 998 | 999 | ant22 1000 | 1001 | 1002 | 1003 | bb_gain22 1004 | 20 1005 | 1006 | 1007 | bw22 1008 | 0 1009 | 1010 | 1011 | dc_offset_mode22 1012 | 0 1013 | 1014 | 1015 | corr22 1016 | 0 1017 | 1018 | 1019 | freq22 1020 | 100e6 1021 | 1022 | 1023 | gain_mode22 1024 | False 1025 | 1026 | 1027 | if_gain22 1028 | 20 1029 | 1030 | 1031 | iq_balance_mode22 1032 | 0 1033 | 1034 | 1035 | gain22 1036 | 10 1037 | 1038 | 1039 | ant23 1040 | 1041 | 1042 | 1043 | bb_gain23 1044 | 20 1045 | 1046 | 1047 | bw23 1048 | 0 1049 | 1050 | 1051 | dc_offset_mode23 1052 | 0 1053 | 1054 | 1055 | corr23 1056 | 0 1057 | 1058 | 1059 | freq23 1060 | 100e6 1061 | 1062 | 1063 | gain_mode23 1064 | False 1065 | 1066 | 1067 | if_gain23 1068 | 20 1069 | 1070 | 1071 | iq_balance_mode23 1072 | 0 1073 | 1074 | 1075 | gain23 1076 | 10 1077 | 1078 | 1079 | ant24 1080 | 1081 | 1082 | 1083 | bb_gain24 1084 | 20 1085 | 1086 | 1087 | bw24 1088 | 0 1089 | 1090 | 1091 | dc_offset_mode24 1092 | 0 1093 | 1094 | 1095 | corr24 1096 | 0 1097 | 1098 | 1099 | freq24 1100 | 100e6 1101 | 1102 | 1103 | gain_mode24 1104 | False 1105 | 1106 | 1107 | if_gain24 1108 | 20 1109 | 1110 | 1111 | iq_balance_mode24 1112 | 0 1113 | 1114 | 1115 | gain24 1116 | 10 1117 | 1118 | 1119 | ant25 1120 | 1121 | 1122 | 1123 | bb_gain25 1124 | 20 1125 | 1126 | 1127 | bw25 1128 | 0 1129 | 1130 | 1131 | dc_offset_mode25 1132 | 0 1133 | 1134 | 1135 | corr25 1136 | 0 1137 | 1138 | 1139 | freq25 1140 | 100e6 1141 | 1142 | 1143 | gain_mode25 1144 | False 1145 | 1146 | 1147 | if_gain25 1148 | 20 1149 | 1150 | 1151 | iq_balance_mode25 1152 | 0 1153 | 1154 | 1155 | gain25 1156 | 10 1157 | 1158 | 1159 | ant26 1160 | 1161 | 1162 | 1163 | bb_gain26 1164 | 20 1165 | 1166 | 1167 | bw26 1168 | 0 1169 | 1170 | 1171 | dc_offset_mode26 1172 | 0 1173 | 1174 | 1175 | corr26 1176 | 0 1177 | 1178 | 1179 | freq26 1180 | 100e6 1181 | 1182 | 1183 | gain_mode26 1184 | False 1185 | 1186 | 1187 | if_gain26 1188 | 20 1189 | 1190 | 1191 | iq_balance_mode26 1192 | 0 1193 | 1194 | 1195 | gain26 1196 | 10 1197 | 1198 | 1199 | ant27 1200 | 1201 | 1202 | 1203 | bb_gain27 1204 | 20 1205 | 1206 | 1207 | bw27 1208 | 0 1209 | 1210 | 1211 | dc_offset_mode27 1212 | 0 1213 | 1214 | 1215 | corr27 1216 | 0 1217 | 1218 | 1219 | freq27 1220 | 100e6 1221 | 1222 | 1223 | gain_mode27 1224 | False 1225 | 1226 | 1227 | if_gain27 1228 | 20 1229 | 1230 | 1231 | iq_balance_mode27 1232 | 0 1233 | 1234 | 1235 | gain27 1236 | 10 1237 | 1238 | 1239 | ant28 1240 | 1241 | 1242 | 1243 | bb_gain28 1244 | 20 1245 | 1246 | 1247 | bw28 1248 | 0 1249 | 1250 | 1251 | dc_offset_mode28 1252 | 0 1253 | 1254 | 1255 | corr28 1256 | 0 1257 | 1258 | 1259 | freq28 1260 | 100e6 1261 | 1262 | 1263 | gain_mode28 1264 | False 1265 | 1266 | 1267 | if_gain28 1268 | 20 1269 | 1270 | 1271 | iq_balance_mode28 1272 | 0 1273 | 1274 | 1275 | gain28 1276 | 10 1277 | 1278 | 1279 | ant29 1280 | 1281 | 1282 | 1283 | bb_gain29 1284 | 20 1285 | 1286 | 1287 | bw29 1288 | 0 1289 | 1290 | 1291 | dc_offset_mode29 1292 | 0 1293 | 1294 | 1295 | corr29 1296 | 0 1297 | 1298 | 1299 | freq29 1300 | 100e6 1301 | 1302 | 1303 | gain_mode29 1304 | False 1305 | 1306 | 1307 | if_gain29 1308 | 20 1309 | 1310 | 1311 | iq_balance_mode29 1312 | 0 1313 | 1314 | 1315 | gain29 1316 | 10 1317 | 1318 | 1319 | ant2 1320 | 1321 | 1322 | 1323 | bb_gain2 1324 | 20 1325 | 1326 | 1327 | bw2 1328 | 0 1329 | 1330 | 1331 | dc_offset_mode2 1332 | 0 1333 | 1334 | 1335 | corr2 1336 | 0 1337 | 1338 | 1339 | freq2 1340 | 100e6 1341 | 1342 | 1343 | gain_mode2 1344 | False 1345 | 1346 | 1347 | if_gain2 1348 | 20 1349 | 1350 | 1351 | iq_balance_mode2 1352 | 0 1353 | 1354 | 1355 | gain2 1356 | 10 1357 | 1358 | 1359 | ant30 1360 | 1361 | 1362 | 1363 | bb_gain30 1364 | 20 1365 | 1366 | 1367 | bw30 1368 | 0 1369 | 1370 | 1371 | dc_offset_mode30 1372 | 0 1373 | 1374 | 1375 | corr30 1376 | 0 1377 | 1378 | 1379 | freq30 1380 | 100e6 1381 | 1382 | 1383 | gain_mode30 1384 | False 1385 | 1386 | 1387 | if_gain30 1388 | 20 1389 | 1390 | 1391 | iq_balance_mode30 1392 | 0 1393 | 1394 | 1395 | gain30 1396 | 10 1397 | 1398 | 1399 | ant31 1400 | 1401 | 1402 | 1403 | bb_gain31 1404 | 20 1405 | 1406 | 1407 | bw31 1408 | 0 1409 | 1410 | 1411 | dc_offset_mode31 1412 | 0 1413 | 1414 | 1415 | corr31 1416 | 0 1417 | 1418 | 1419 | freq31 1420 | 100e6 1421 | 1422 | 1423 | gain_mode31 1424 | False 1425 | 1426 | 1427 | if_gain31 1428 | 20 1429 | 1430 | 1431 | iq_balance_mode31 1432 | 0 1433 | 1434 | 1435 | gain31 1436 | 10 1437 | 1438 | 1439 | ant3 1440 | 1441 | 1442 | 1443 | bb_gain3 1444 | 20 1445 | 1446 | 1447 | bw3 1448 | 0 1449 | 1450 | 1451 | dc_offset_mode3 1452 | 0 1453 | 1454 | 1455 | corr3 1456 | 0 1457 | 1458 | 1459 | freq3 1460 | 100e6 1461 | 1462 | 1463 | gain_mode3 1464 | False 1465 | 1466 | 1467 | if_gain3 1468 | 20 1469 | 1470 | 1471 | iq_balance_mode3 1472 | 0 1473 | 1474 | 1475 | gain3 1476 | 10 1477 | 1478 | 1479 | ant4 1480 | 1481 | 1482 | 1483 | bb_gain4 1484 | 20 1485 | 1486 | 1487 | bw4 1488 | 0 1489 | 1490 | 1491 | dc_offset_mode4 1492 | 0 1493 | 1494 | 1495 | corr4 1496 | 0 1497 | 1498 | 1499 | freq4 1500 | 100e6 1501 | 1502 | 1503 | gain_mode4 1504 | False 1505 | 1506 | 1507 | if_gain4 1508 | 20 1509 | 1510 | 1511 | iq_balance_mode4 1512 | 0 1513 | 1514 | 1515 | gain4 1516 | 10 1517 | 1518 | 1519 | ant5 1520 | 1521 | 1522 | 1523 | bb_gain5 1524 | 20 1525 | 1526 | 1527 | bw5 1528 | 0 1529 | 1530 | 1531 | dc_offset_mode5 1532 | 0 1533 | 1534 | 1535 | corr5 1536 | 0 1537 | 1538 | 1539 | freq5 1540 | 100e6 1541 | 1542 | 1543 | gain_mode5 1544 | False 1545 | 1546 | 1547 | if_gain5 1548 | 20 1549 | 1550 | 1551 | iq_balance_mode5 1552 | 0 1553 | 1554 | 1555 | gain5 1556 | 10 1557 | 1558 | 1559 | ant6 1560 | 1561 | 1562 | 1563 | bb_gain6 1564 | 20 1565 | 1566 | 1567 | bw6 1568 | 0 1569 | 1570 | 1571 | dc_offset_mode6 1572 | 0 1573 | 1574 | 1575 | corr6 1576 | 0 1577 | 1578 | 1579 | freq6 1580 | 100e6 1581 | 1582 | 1583 | gain_mode6 1584 | False 1585 | 1586 | 1587 | if_gain6 1588 | 20 1589 | 1590 | 1591 | iq_balance_mode6 1592 | 0 1593 | 1594 | 1595 | gain6 1596 | 10 1597 | 1598 | 1599 | ant7 1600 | 1601 | 1602 | 1603 | bb_gain7 1604 | 20 1605 | 1606 | 1607 | bw7 1608 | 0 1609 | 1610 | 1611 | dc_offset_mode7 1612 | 0 1613 | 1614 | 1615 | corr7 1616 | 0 1617 | 1618 | 1619 | freq7 1620 | 100e6 1621 | 1622 | 1623 | gain_mode7 1624 | False 1625 | 1626 | 1627 | if_gain7 1628 | 20 1629 | 1630 | 1631 | iq_balance_mode7 1632 | 0 1633 | 1634 | 1635 | gain7 1636 | 10 1637 | 1638 | 1639 | ant8 1640 | 1641 | 1642 | 1643 | bb_gain8 1644 | 20 1645 | 1646 | 1647 | bw8 1648 | 0 1649 | 1650 | 1651 | dc_offset_mode8 1652 | 0 1653 | 1654 | 1655 | corr8 1656 | 0 1657 | 1658 | 1659 | freq8 1660 | 100e6 1661 | 1662 | 1663 | gain_mode8 1664 | False 1665 | 1666 | 1667 | if_gain8 1668 | 20 1669 | 1670 | 1671 | iq_balance_mode8 1672 | 0 1673 | 1674 | 1675 | gain8 1676 | 10 1677 | 1678 | 1679 | ant9 1680 | 1681 | 1682 | 1683 | bb_gain9 1684 | 20 1685 | 1686 | 1687 | bw9 1688 | 0 1689 | 1690 | 1691 | dc_offset_mode9 1692 | 0 1693 | 1694 | 1695 | corr9 1696 | 0 1697 | 1698 | 1699 | freq9 1700 | 100e6 1701 | 1702 | 1703 | gain_mode9 1704 | False 1705 | 1706 | 1707 | if_gain9 1708 | 20 1709 | 1710 | 1711 | iq_balance_mode9 1712 | 0 1713 | 1714 | 1715 | gain9 1716 | 10 1717 | 1718 | 1719 | comment 1720 | 1721 | 1722 | 1723 | affinity 1724 | 1725 | 1726 | 1727 | args 1728 | 1729 | 1730 | 1731 | _enabled 1732 | True 1733 | 1734 | 1735 | _coordinate 1736 | (8, 172) 1737 | 1738 | 1739 | _rotation 1740 | 0 1741 | 1742 | 1743 | id 1744 | rtlsdr_source_0 1745 | 1746 | 1747 | maxoutbuf 1748 | 0 1749 | 1750 | 1751 | clock_source0 1752 | 1753 | 1754 | 1755 | time_source0 1756 | 1757 | 1758 | 1759 | clock_source1 1760 | 1761 | 1762 | 1763 | time_source1 1764 | 1765 | 1766 | 1767 | clock_source2 1768 | 1769 | 1770 | 1771 | time_source2 1772 | 1773 | 1774 | 1775 | clock_source3 1776 | 1777 | 1778 | 1779 | time_source3 1780 | 1781 | 1782 | 1783 | clock_source4 1784 | 1785 | 1786 | 1787 | time_source4 1788 | 1789 | 1790 | 1791 | clock_source5 1792 | 1793 | 1794 | 1795 | time_source5 1796 | 1797 | 1798 | 1799 | clock_source6 1800 | 1801 | 1802 | 1803 | time_source6 1804 | 1805 | 1806 | 1807 | clock_source7 1808 | 1809 | 1810 | 1811 | time_source7 1812 | 1813 | 1814 | 1815 | minoutbuf 1816 | 0 1817 | 1818 | 1819 | nchan 1820 | 1 1821 | 1822 | 1823 | num_mboards 1824 | 1 1825 | 1826 | 1827 | type 1828 | fc32 1829 | 1830 | 1831 | sample_rate 1832 | radio_samp_rate 1833 | 1834 | 1835 | sync 1836 | 1837 | 1838 | 1839 | 1840 | analog_sig_source_x_0 1841 | blocks_multiply_xx_0 1842 | 0 1843 | 1 1844 | 1845 | 1846 | blocks_multiply_xx_0 1847 | blocks_file_sink_0 1848 | 0 1849 | 0 1850 | 1851 | 1852 | rational_resampler_xxx_0 1853 | blocks_multiply_xx_0 1854 | 0 1855 | 0 1856 | 1857 | 1858 | rtlsdr_source_0 1859 | rational_resampler_xxx_0 1860 | 0 1861 | 0 1862 | 1863 | 1864 | -------------------------------------------------------------------------------- /sdr/rx/fm_apt_demod.grc: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Sun Aug 26 16:17:20 2018 5 | 6 | options 7 | 8 | author 9 | 10 | 11 | 12 | window_size 13 | 14 | 15 | 16 | category 17 | [GRC Hier Blocks] 18 | 19 | 20 | comment 21 | 22 | 23 | 24 | description 25 | 26 | 27 | 28 | _enabled 29 | True 30 | 31 | 32 | _coordinate 33 | (8, 8) 34 | 35 | 36 | _rotation 37 | 0 38 | 39 | 40 | generate_options 41 | qt_gui 42 | 43 | 44 | hier_block_src_path 45 | .: 46 | 47 | 48 | id 49 | top_block 50 | 51 | 52 | max_nouts 53 | 0 54 | 55 | 56 | qt_qss_theme 57 | 58 | 59 | 60 | realtime_scheduling 61 | 62 | 63 | 64 | run_command 65 | {python} -u {filename} 66 | 67 | 68 | run_options 69 | prompt 70 | 71 | 72 | run 73 | True 74 | 75 | 76 | thread_safe_setters 77 | 78 | 79 | 80 | title 81 | 82 | 83 | 84 | 85 | variable 86 | 87 | comment 88 | 89 | 90 | 91 | _enabled 92 | True 93 | 94 | 95 | _coordinate 96 | (176, 12) 97 | 98 | 99 | _rotation 100 | 0 101 | 102 | 103 | id 104 | center_freq 105 | 106 | 107 | value 108 | 137e6 109 | 110 | 111 | 112 | variable 113 | 114 | comment 115 | 116 | 117 | 118 | _enabled 119 | True 120 | 121 | 122 | _coordinate 123 | (272, 12) 124 | 125 | 126 | _rotation 127 | 0 128 | 129 | 130 | id 131 | data_samp_rate 132 | 133 | 134 | value 135 | 10e3 136 | 137 | 138 | 139 | analog_wfm_rcv 140 | 141 | audio_decimation 142 | 1 143 | 144 | 145 | alias 146 | 147 | 148 | 149 | comment 150 | 151 | 152 | 153 | affinity 154 | 155 | 156 | 157 | _enabled 158 | True 159 | 160 | 161 | _coordinate 162 | (56, 340) 163 | 164 | 165 | _rotation 166 | 0 167 | 168 | 169 | id 170 | analog_wfm_rcv_0 171 | 172 | 173 | maxoutbuf 174 | 0 175 | 176 | 177 | minoutbuf 178 | 0 179 | 180 | 181 | quad_rate 182 | 1 183 | 184 | 185 | 186 | blocks_file_source 187 | 188 | alias 189 | 190 | 191 | 192 | comment 193 | 194 | 195 | 196 | affinity 197 | 198 | 199 | 200 | _enabled 201 | True 202 | 203 | 204 | file 205 | raw_apt_dump 206 | 207 | 208 | _coordinate 209 | (24, 132) 210 | 211 | 212 | _rotation 213 | 0 214 | 215 | 216 | id 217 | blocks_file_source_0 218 | 219 | 220 | maxoutbuf 221 | 0 222 | 223 | 224 | minoutbuf 225 | 0 226 | 227 | 228 | type 229 | complex 230 | 231 | 232 | repeat 233 | False 234 | 235 | 236 | vlen 237 | 1 238 | 239 | 240 | 241 | blocks_wavfile_sink 242 | 243 | bits_per_sample 244 | 8 245 | 246 | 247 | alias 248 | 249 | 250 | 251 | comment 252 | 253 | 254 | 255 | affinity 256 | 257 | 258 | 259 | _enabled 260 | True 261 | 262 | 263 | file 264 | apt_fmdemod 265 | 266 | 267 | _coordinate 268 | (248, 332) 269 | 270 | 271 | _rotation 272 | 0 273 | 274 | 275 | id 276 | blocks_wavfile_sink_0 277 | 278 | 279 | nchan 280 | 1 281 | 282 | 283 | samp_rate 284 | int(data_samp_rate) 285 | 286 | 287 | 288 | low_pass_filter 289 | 290 | beta 291 | 6.76 292 | 293 | 294 | alias 295 | 296 | 297 | 298 | comment 299 | 300 | 301 | 302 | affinity 303 | 304 | 305 | 306 | cutoff_freq 307 | 50e3 308 | 309 | 310 | decim 311 | 1 312 | 313 | 314 | _enabled 315 | True 316 | 317 | 318 | type 319 | fir_filter_ccf 320 | 321 | 322 | _coordinate 323 | (240, 96) 324 | 325 | 326 | _rotation 327 | 0 328 | 329 | 330 | gain 331 | 1 332 | 333 | 334 | id 335 | low_pass_filter_0 336 | 337 | 338 | interp 339 | 1 340 | 341 | 342 | maxoutbuf 343 | 0 344 | 345 | 346 | minoutbuf 347 | 0 348 | 349 | 350 | samp_rate 351 | data_samp_rate 352 | 353 | 354 | width 355 | 10e3 356 | 357 | 358 | win 359 | firdes.WIN_HAMMING 360 | 361 | 362 | 363 | analog_wfm_rcv_0 364 | blocks_wavfile_sink_0 365 | 0 366 | 0 367 | 368 | 369 | blocks_file_source_0 370 | low_pass_filter_0 371 | 0 372 | 0 373 | 374 | 375 | low_pass_filter_0 376 | analog_wfm_rcv_0 377 | 0 378 | 0 379 | 380 | 381 | -------------------------------------------------------------------------------- /sdr/test/fm_raw_processer.grc: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Sun Aug 26 17:13:15 2018 5 | 6 | options 7 | 8 | author 9 | 10 | 11 | 12 | window_size 13 | 14 | 15 | 16 | category 17 | [GRC Hier Blocks] 18 | 19 | 20 | comment 21 | 22 | 23 | 24 | description 25 | 26 | 27 | 28 | _enabled 29 | True 30 | 31 | 32 | _coordinate 33 | (8, 8) 34 | 35 | 36 | _rotation 37 | 0 38 | 39 | 40 | generate_options 41 | qt_gui 42 | 43 | 44 | hier_block_src_path 45 | .: 46 | 47 | 48 | id 49 | top_block 50 | 51 | 52 | max_nouts 53 | 0 54 | 55 | 56 | qt_qss_theme 57 | 58 | 59 | 60 | realtime_scheduling 61 | 62 | 63 | 64 | run_command 65 | {python} -u {filename} 66 | 67 | 68 | run_options 69 | prompt 70 | 71 | 72 | run 73 | True 74 | 75 | 76 | thread_safe_setters 77 | 78 | 79 | 80 | title 81 | 82 | 83 | 84 | 85 | variable 86 | 87 | comment 88 | 89 | 90 | 91 | _enabled 92 | True 93 | 94 | 95 | _coordinate 96 | (8, 140) 97 | 98 | 99 | _rotation 100 | 0 101 | 102 | 103 | id 104 | audio_interp 105 | 106 | 107 | value 108 | 8 109 | 110 | 111 | 112 | variable 113 | 114 | comment 115 | 116 | 117 | 118 | _enabled 119 | True 120 | 121 | 122 | _coordinate 123 | (8, 204) 124 | 125 | 126 | _rotation 127 | 0 128 | 129 | 130 | id 131 | audio_rate 132 | 133 | 134 | value 135 | 24e3 136 | 137 | 138 | 139 | variable_qtgui_range 140 | 141 | comment 142 | 143 | 144 | 145 | value 146 | 20 147 | 148 | 149 | _enabled 150 | 1 151 | 152 | 153 | _coordinate 154 | (136, 416) 155 | 156 | 157 | gui_hint 158 | 159 | 160 | 161 | _rotation 162 | 0 163 | 164 | 165 | id 166 | bb_g 167 | 168 | 169 | label 170 | bb_gain 171 | 172 | 173 | min_len 174 | 200 175 | 176 | 177 | orient 178 | Qt.Horizontal 179 | 180 | 181 | start 182 | 0 183 | 184 | 185 | step 186 | 1 187 | 188 | 189 | stop 190 | 100 191 | 192 | 193 | rangeType 194 | float 195 | 196 | 197 | widget 198 | counter_slider 199 | 200 | 201 | 202 | variable_qtgui_range 203 | 204 | comment 205 | 206 | 207 | 208 | value 209 | 98.5 210 | 211 | 212 | _enabled 213 | 1 214 | 215 | 216 | _coordinate 217 | (136, 536) 218 | 219 | 220 | gui_hint 221 | 222 | 223 | 224 | _rotation 225 | 0 226 | 227 | 228 | id 229 | fc 230 | 231 | 232 | label 233 | FM Frequency 234 | 235 | 236 | min_len 237 | 200 238 | 239 | 240 | orient 241 | Qt.Horizontal 242 | 243 | 244 | start 245 | 88.1 246 | 247 | 248 | step 249 | 0.2 250 | 251 | 252 | stop 253 | 107.5 254 | 255 | 256 | rangeType 257 | float 258 | 259 | 260 | widget 261 | counter_slider 262 | 263 | 264 | 265 | variable_qtgui_range 266 | 267 | comment 268 | 269 | 270 | 271 | value 272 | 20 273 | 274 | 275 | _enabled 276 | 1 277 | 278 | 279 | _coordinate 280 | (280, 416) 281 | 282 | 283 | gui_hint 284 | 285 | 286 | 287 | _rotation 288 | 0 289 | 290 | 291 | id 292 | if_g 293 | 294 | 295 | label 296 | if_gain 297 | 298 | 299 | min_len 300 | 200 301 | 302 | 303 | orient 304 | Qt.Horizontal 305 | 306 | 307 | start 308 | 0 309 | 310 | 311 | step 312 | 1 313 | 314 | 315 | stop 316 | 100 317 | 318 | 319 | rangeType 320 | float 321 | 322 | 323 | widget 324 | counter_slider 325 | 326 | 327 | 328 | variable_qtgui_range 329 | 330 | comment 331 | 332 | 333 | 334 | value 335 | 40 336 | 337 | 338 | _enabled 339 | 1 340 | 341 | 342 | _coordinate 343 | (8, 416) 344 | 345 | 346 | gui_hint 347 | 348 | 349 | 350 | _rotation 351 | 0 352 | 353 | 354 | id 355 | rf_g 356 | 357 | 358 | label 359 | rf_gain 360 | 361 | 362 | min_len 363 | 200 364 | 365 | 366 | orient 367 | Qt.Horizontal 368 | 369 | 370 | start 371 | 0 372 | 373 | 374 | step 375 | 1 376 | 377 | 378 | stop 379 | 100 380 | 381 | 382 | rangeType 383 | float 384 | 385 | 386 | widget 387 | counter_slider 388 | 389 | 390 | 391 | variable 392 | 393 | comment 394 | 395 | 396 | 397 | _enabled 398 | True 399 | 400 | 401 | _coordinate 402 | (8, 76) 403 | 404 | 405 | _rotation 406 | 0 407 | 408 | 409 | id 410 | samp_rate_0 411 | 412 | 413 | value 414 | 250e3 415 | 416 | 417 | 418 | variable_qtgui_range 419 | 420 | comment 421 | 422 | 423 | 424 | value 425 | 0.1 426 | 427 | 428 | _enabled 429 | 1 430 | 431 | 432 | _coordinate 433 | (280, 536) 434 | 435 | 436 | gui_hint 437 | 438 | 439 | 440 | _rotation 441 | 0 442 | 443 | 444 | id 445 | update_period 446 | 447 | 448 | label 449 | Update Period 450 | 451 | 452 | min_len 453 | 200 454 | 455 | 456 | orient 457 | Qt.Horizontal 458 | 459 | 460 | start 461 | 0.01 462 | 463 | 464 | step 465 | 0.01 466 | 467 | 468 | stop 469 | 0.1 470 | 471 | 472 | rangeType 473 | float 474 | 475 | 476 | widget 477 | counter_slider 478 | 479 | 480 | 481 | analog_wfm_rcv 482 | 483 | audio_decimation 484 | audio_interp 485 | 486 | 487 | alias 488 | 489 | 490 | 491 | comment 492 | 493 | 494 | 495 | affinity 496 | 497 | 498 | 499 | _enabled 500 | True 501 | 502 | 503 | _coordinate 504 | (304, 188) 505 | 506 | 507 | _rotation 508 | 0 509 | 510 | 511 | id 512 | analog_wfm_rcv_0 513 | 514 | 515 | maxoutbuf 516 | 0 517 | 518 | 519 | minoutbuf 520 | 0 521 | 522 | 523 | quad_rate 524 | audio_rate * audio_interp 525 | 526 | 527 | 528 | audio_sink 529 | 530 | alias 531 | 532 | 533 | 534 | comment 535 | 536 | 537 | 538 | affinity 539 | 540 | 541 | 542 | device_name 543 | 544 | 545 | 546 | _enabled 547 | True 548 | 549 | 550 | _coordinate 551 | (528, 132) 552 | 553 | 554 | _rotation 555 | 0 556 | 557 | 558 | id 559 | audio_sink_0 560 | 561 | 562 | num_inputs 563 | 1 564 | 565 | 566 | ok_to_block 567 | True 568 | 569 | 570 | samp_rate 571 | 24000 572 | 573 | 574 | 575 | blocks_file_source 576 | 577 | alias 578 | 579 | 580 | 581 | comment 582 | 583 | 584 | 585 | affinity 586 | 587 | 588 | 589 | _enabled 590 | True 591 | 592 | 593 | file 594 | fm_raw 595 | 596 | 597 | _coordinate 598 | (152, 188) 599 | 600 | 601 | _rotation 602 | 0 603 | 604 | 605 | id 606 | blocks_file_source_0 607 | 608 | 609 | maxoutbuf 610 | 0 611 | 612 | 613 | minoutbuf 614 | 0 615 | 616 | 617 | type 618 | complex 619 | 620 | 621 | repeat 622 | True 623 | 624 | 625 | vlen 626 | 1 627 | 628 | 629 | 630 | qtgui_freq_sink_x 631 | 632 | autoscale 633 | False 634 | 635 | 636 | average 637 | 1.0 638 | 639 | 640 | axislabels 641 | True 642 | 643 | 644 | bw 645 | 24000 646 | 647 | 648 | alias 649 | 650 | 651 | 652 | fc 653 | 0 654 | 655 | 656 | comment 657 | 658 | 659 | 660 | ctrlpanel 661 | False 662 | 663 | 664 | affinity 665 | 666 | 667 | 668 | _enabled 669 | 1 670 | 671 | 672 | fftsize 673 | 1024 674 | 675 | 676 | _coordinate 677 | (528, 180) 678 | 679 | 680 | gui_hint 681 | 682 | 683 | 684 | _rotation 685 | 0 686 | 687 | 688 | grid 689 | False 690 | 691 | 692 | id 693 | qtgui_freq_sink_x_0 694 | 695 | 696 | legend 697 | True 698 | 699 | 700 | alpha1 701 | 1.0 702 | 703 | 704 | color1 705 | "blue" 706 | 707 | 708 | label1 709 | 710 | 711 | 712 | width1 713 | 1 714 | 715 | 716 | alpha10 717 | 1.0 718 | 719 | 720 | color10 721 | "dark blue" 722 | 723 | 724 | label10 725 | 726 | 727 | 728 | width10 729 | 1 730 | 731 | 732 | alpha2 733 | 1.0 734 | 735 | 736 | color2 737 | "red" 738 | 739 | 740 | label2 741 | 742 | 743 | 744 | width2 745 | 1 746 | 747 | 748 | alpha3 749 | 1.0 750 | 751 | 752 | color3 753 | "green" 754 | 755 | 756 | label3 757 | 758 | 759 | 760 | width3 761 | 1 762 | 763 | 764 | alpha4 765 | 1.0 766 | 767 | 768 | color4 769 | "black" 770 | 771 | 772 | label4 773 | 774 | 775 | 776 | width4 777 | 1 778 | 779 | 780 | alpha5 781 | 1.0 782 | 783 | 784 | color5 785 | "cyan" 786 | 787 | 788 | label5 789 | 790 | 791 | 792 | width5 793 | 1 794 | 795 | 796 | alpha6 797 | 1.0 798 | 799 | 800 | color6 801 | "magenta" 802 | 803 | 804 | label6 805 | 806 | 807 | 808 | width6 809 | 1 810 | 811 | 812 | alpha7 813 | 1.0 814 | 815 | 816 | color7 817 | "yellow" 818 | 819 | 820 | label7 821 | 822 | 823 | 824 | width7 825 | 1 826 | 827 | 828 | alpha8 829 | 1.0 830 | 831 | 832 | color8 833 | "dark red" 834 | 835 | 836 | label8 837 | 838 | 839 | 840 | width8 841 | 1 842 | 843 | 844 | alpha9 845 | 1.0 846 | 847 | 848 | color9 849 | "dark green" 850 | 851 | 852 | label9 853 | 854 | 855 | 856 | width9 857 | 1 858 | 859 | 860 | maxoutbuf 861 | 0 862 | 863 | 864 | minoutbuf 865 | 0 866 | 867 | 868 | name 869 | "" 870 | 871 | 872 | nconnections 873 | 1 874 | 875 | 876 | showports 877 | True 878 | 879 | 880 | freqhalf 881 | True 882 | 883 | 884 | tr_chan 885 | 0 886 | 887 | 888 | tr_level 889 | 0.0 890 | 891 | 892 | tr_mode 893 | qtgui.TRIG_MODE_FREE 894 | 895 | 896 | tr_tag 897 | "" 898 | 899 | 900 | type 901 | float 902 | 903 | 904 | update_time 905 | update_period 906 | 907 | 908 | wintype 909 | firdes.WIN_BLACKMAN_hARRIS 910 | 911 | 912 | label 913 | Relative Gain 914 | 915 | 916 | ymax 917 | 10 918 | 919 | 920 | ymin 921 | -140 922 | 923 | 924 | units 925 | dB 926 | 927 | 928 | 929 | qtgui_time_sink_x 930 | 931 | autoscale 932 | False 933 | 934 | 935 | axislabels 936 | True 937 | 938 | 939 | alias 940 | 941 | 942 | 943 | comment 944 | 945 | 946 | 947 | ctrlpanel 948 | False 949 | 950 | 951 | affinity 952 | 953 | 954 | 955 | entags 956 | True 957 | 958 | 959 | _enabled 960 | 1 961 | 962 | 963 | _coordinate 964 | (528, 260) 965 | 966 | 967 | gui_hint 968 | 969 | 970 | 971 | _rotation 972 | 0 973 | 974 | 975 | grid 976 | False 977 | 978 | 979 | id 980 | qtgui_time_sink_x_0 981 | 982 | 983 | legend 984 | True 985 | 986 | 987 | alpha1 988 | 1.0 989 | 990 | 991 | color1 992 | "blue" 993 | 994 | 995 | label1 996 | 997 | 998 | 999 | marker1 1000 | -1 1001 | 1002 | 1003 | style1 1004 | 1 1005 | 1006 | 1007 | width1 1008 | 1 1009 | 1010 | 1011 | alpha10 1012 | 1.0 1013 | 1014 | 1015 | color10 1016 | "blue" 1017 | 1018 | 1019 | label10 1020 | 1021 | 1022 | 1023 | marker10 1024 | -1 1025 | 1026 | 1027 | style10 1028 | 1 1029 | 1030 | 1031 | width10 1032 | 1 1033 | 1034 | 1035 | alpha2 1036 | 1.0 1037 | 1038 | 1039 | color2 1040 | "red" 1041 | 1042 | 1043 | label2 1044 | 1045 | 1046 | 1047 | marker2 1048 | -1 1049 | 1050 | 1051 | style2 1052 | 1 1053 | 1054 | 1055 | width2 1056 | 1 1057 | 1058 | 1059 | alpha3 1060 | 1.0 1061 | 1062 | 1063 | color3 1064 | "green" 1065 | 1066 | 1067 | label3 1068 | 1069 | 1070 | 1071 | marker3 1072 | -1 1073 | 1074 | 1075 | style3 1076 | 1 1077 | 1078 | 1079 | width3 1080 | 1 1081 | 1082 | 1083 | alpha4 1084 | 1.0 1085 | 1086 | 1087 | color4 1088 | "black" 1089 | 1090 | 1091 | label4 1092 | 1093 | 1094 | 1095 | marker4 1096 | -1 1097 | 1098 | 1099 | style4 1100 | 1 1101 | 1102 | 1103 | width4 1104 | 1 1105 | 1106 | 1107 | alpha5 1108 | 1.0 1109 | 1110 | 1111 | color5 1112 | "cyan" 1113 | 1114 | 1115 | label5 1116 | 1117 | 1118 | 1119 | marker5 1120 | -1 1121 | 1122 | 1123 | style5 1124 | 1 1125 | 1126 | 1127 | width5 1128 | 1 1129 | 1130 | 1131 | alpha6 1132 | 1.0 1133 | 1134 | 1135 | color6 1136 | "magenta" 1137 | 1138 | 1139 | label6 1140 | 1141 | 1142 | 1143 | marker6 1144 | -1 1145 | 1146 | 1147 | style6 1148 | 1 1149 | 1150 | 1151 | width6 1152 | 1 1153 | 1154 | 1155 | alpha7 1156 | 1.0 1157 | 1158 | 1159 | color7 1160 | "yellow" 1161 | 1162 | 1163 | label7 1164 | 1165 | 1166 | 1167 | marker7 1168 | -1 1169 | 1170 | 1171 | style7 1172 | 1 1173 | 1174 | 1175 | width7 1176 | 1 1177 | 1178 | 1179 | alpha8 1180 | 1.0 1181 | 1182 | 1183 | color8 1184 | "dark red" 1185 | 1186 | 1187 | label8 1188 | 1189 | 1190 | 1191 | marker8 1192 | -1 1193 | 1194 | 1195 | style8 1196 | 1 1197 | 1198 | 1199 | width8 1200 | 1 1201 | 1202 | 1203 | alpha9 1204 | 1.0 1205 | 1206 | 1207 | color9 1208 | "dark green" 1209 | 1210 | 1211 | label9 1212 | 1213 | 1214 | 1215 | marker9 1216 | -1 1217 | 1218 | 1219 | style9 1220 | 1 1221 | 1222 | 1223 | width9 1224 | 1 1225 | 1226 | 1227 | name 1228 | "" 1229 | 1230 | 1231 | nconnections 1232 | 1 1233 | 1234 | 1235 | size 1236 | 1024 1237 | 1238 | 1239 | srate 1240 | 24e3 1241 | 1242 | 1243 | tr_chan 1244 | 0 1245 | 1246 | 1247 | tr_delay 1248 | 0 1249 | 1250 | 1251 | tr_level 1252 | 0.0 1253 | 1254 | 1255 | tr_mode 1256 | qtgui.TRIG_MODE_FREE 1257 | 1258 | 1259 | tr_slope 1260 | qtgui.TRIG_SLOPE_POS 1261 | 1262 | 1263 | tr_tag 1264 | "" 1265 | 1266 | 1267 | type 1268 | float 1269 | 1270 | 1271 | update_time 1272 | update_period 1273 | 1274 | 1275 | ylabel 1276 | Amplitude 1277 | 1278 | 1279 | yunit 1280 | "" 1281 | 1282 | 1283 | ymax 1284 | 1 1285 | 1286 | 1287 | ymin 1288 | -1 1289 | 1290 | 1291 | 1292 | qtgui_tab_widget 1293 | 1294 | alias 1295 | 1296 | 1297 | 1298 | comment 1299 | 1300 | 1301 | 1302 | _enabled 1303 | 0 1304 | 1305 | 1306 | _coordinate 1307 | (192, 12) 1308 | 1309 | 1310 | gui_hint 1311 | 1312 | 1313 | 1314 | _rotation 1315 | 0 1316 | 1317 | 1318 | id 1319 | tab 1320 | 1321 | 1322 | label0 1323 | Gain 1324 | 1325 | 1326 | label1 1327 | Vis 1328 | 1329 | 1330 | label10 1331 | Tab 10 1332 | 1333 | 1334 | label11 1335 | Tab 11 1336 | 1337 | 1338 | label12 1339 | Tab 12 1340 | 1341 | 1342 | label13 1343 | Tab 13 1344 | 1345 | 1346 | label14 1347 | Tab 14 1348 | 1349 | 1350 | label15 1351 | Tab 15 1352 | 1353 | 1354 | label16 1355 | Tab 16 1356 | 1357 | 1358 | label17 1359 | Tab 17 1360 | 1361 | 1362 | label18 1363 | Tab 18 1364 | 1365 | 1366 | label19 1367 | Tab 19 1368 | 1369 | 1370 | label2 1371 | Tab 2 1372 | 1373 | 1374 | label3 1375 | Tab 3 1376 | 1377 | 1378 | label4 1379 | Tab 4 1380 | 1381 | 1382 | label5 1383 | Tab 5 1384 | 1385 | 1386 | label6 1387 | Tab 6 1388 | 1389 | 1390 | label7 1391 | Tab 7 1392 | 1393 | 1394 | label8 1395 | Tab 8 1396 | 1397 | 1398 | label9 1399 | Tab 9 1400 | 1401 | 1402 | num_tabs 1403 | 2 1404 | 1405 | 1406 | 1407 | analog_wfm_rcv_0 1408 | audio_sink_0 1409 | 0 1410 | 0 1411 | 1412 | 1413 | analog_wfm_rcv_0 1414 | qtgui_freq_sink_x_0 1415 | 0 1416 | 0 1417 | 1418 | 1419 | analog_wfm_rcv_0 1420 | qtgui_time_sink_x_0 1421 | 0 1422 | 0 1423 | 1424 | 1425 | blocks_file_source_0 1426 | analog_wfm_rcv_0 1427 | 0 1428 | 0 1429 | 1430 | 1431 | --------------------------------------------------------------------------------