resolve merge conflicts

pacsat-v2.2-tlm4
Alan Johnston 3 weeks ago
commit e3a54caf3b

7
.gitignore vendored

@ -41,4 +41,9 @@ transmit_dtmf
uptime
beacon_off
battery_saver
pi_zero2
image_file.bin
logt.txt
telem.txt.bk
failure_mode.txt
sim_mode_auto

@ -41,8 +41,10 @@ cubesatsim: libax5043.a
cubesatsim: afsk/ax25.o
cubesatsim: afsk/ax5043.o
cubesatsim: TelemEncoding.o
cubesatsim: sensor_extension.o
cubesatsim: main.o
gcc -std=gnu99 $(DEBUG_BEHAVIOR) -o cubesatsim -Wall -Wextra -L./ afsk/ax25.o afsk/ax5043.o TelemEncoding.o main.o -lwiringPi -lax5043 -lm
cubesatsim: codecAO40.o
gcc -std=gnu99 $(DEBUG_BEHAVIOR) -o cubesatsim -Wall -Wextra -L./ afsk/ax25.o afsk/ax5043.o TelemEncoding.o sensor_extension.o codecAO40.o main.o -lwiringPi -lax5043 -lm
telem: telem.o
gcc -std=gnu99 $(DEBUG_BEHAVIOR) -o telem -Wall -Wextra -L./ telem.o -lwiringPi
@ -51,6 +53,13 @@ TelemEncoding.o: TelemEncoding.c
TelemEncoding.o: TelemEncoding.h
gcc -std=gnu99 $(DEBUG_BEHAVIOR) -Wall -Wextra -c TelemEncoding.c
sensor_extension.o: sensor_extension.c
gcc -std=gnu99 $(DEBUG_BEHAVIOR) -Wall -Wextra -c sensor_extension.c
codecAO40.o: codecAO40.c
codecAO40.o: codecAO40.h
gcc -std=gnu99 $(DEBUG_BEHAVIOR) -Wall -Wextra -c codecAO40.c
ax5043/generated/configcommon.o: ax5043/generated/configcommon.c
ax5043/generated/configcommon.o: ax5043/generated/configrx.h
ax5043/generated/configcommon.o: ax5043/generated/configtx.h

@ -1,10 +1,16 @@
# CubeSatSim
The CubeSat Simulator https://github.com/alanbjohnston/CubeSatSim/wiki is a low cost satellite emulator that runs on solar panels and batteries, transmits UHF radio telemetry, has a 3D printed frame, and can be extended by additional sensors and modules. This project is sponsored by the not-for-profit [Radio Amateur Satellite Corporation, AMSAT®](https://amsat.org).
The CubeSat Simulator https://github.com/alanbjohnston/CubeSatSim/wiki is a low cost satellite emulator that runs on solar panels and batteries, transmits UHF radio telemetry, has a 3D printed frame, and can be extended by additional sensors and modules. This project is sponsored by the not-for-profit [Radio Amateur Satellite Corporation, AMSAT®](https://amsat.org) https://CubeSatSim.org
<img width="500" alt="CubeSatSim v2" src="https://CubeSatSim.org/v2/cubesatsim%20v2%20complete.png">
The three custom PCBs are the Main, Battery and Solar boards. Information including schematics and gerbers is in https://CubeSatSim.org/hardware
<img width="200" alt="cubesatsim-main-v2 0 1_top" src="https://github.com/alanbjohnston/CubeSatSim/blob/b3178fc979a88031f06365590ba47a358158fd73/hardware/v2.0/cubesatsim-main-v2.0_top.png"> <img width="200" alt="cubesatsim-battery-v2 0_top" src="https://github.com/alanbjohnston/CubeSatSim/blob/b3178fc979a88031f06365590ba47a358158fd73/hardware/v2.0/cubesatsim-battery-v2.0.1_top.png"> <img width="200" alt="cubesatsim-solar-v2 0_top" src="https://github.com/alanbjohnston/CubeSatSim/blob/b3178fc979a88031f06365590ba47a358158fd73/hardware/v2.0/cubesatsim-solar-v2.0.1_top.png">
<img width="200" alt="cubesatsim-main-v2 0 1_top" src="https://github.com/alanbjohnston/CubeSatSim/blob/628fd65edbb01fb772a9f223605d969a0aad14bd/hardware/v2.1/cubesatsim-main-v2.1.0_top.png"> <img width="200" alt="cubesatsim-battery-v2 0_top" src="https://github.com/alanbjohnston/CubeSatSim/blob/4d079b486116180071c4dbf64ae2464518a63bdd/hardware/v2.1/cubesatsim-battery-v2.1.0_top.png"> <img width="200" alt="cubesatsim-solar-v2 0_top" src="https://github.com/alanbjohnston/CubeSatSim/blob/c904c66d7c8fb44a3d088d0cbebf24903cf3572c/hardware/v2.1/cubesatsim-solar-v2.1.0_top.png">
For information about the AMSAT STEM education program based on the CubeSatSim, see https://CubeSatSim.org/EducatorsGuide
For STEM activities to do with the CubeSatSim, see the https://CubeSatSim.org/ActivityGuides
There are several hardware versions and software branches to go with them - see below for information.
@ -12,9 +18,9 @@ See the Wiki Software Install page for more details: https://github.com/alanbjoh
There are two ways to get the CubeSatSim(TM) software for your Pi.
One option is to download the disk image file and write it to a 16GB micro SD card or larger. The image is based on Raspberry Pi OS (Rasbian) Lite, dated December 2020. All software is installed, you just need to login to change your password and set your amateur radio callsign if you have one. You can run the ./update.sh script to update all packages and update and compile the latest CubeSatSim software.
One option is to download the disk image file and write it to a 16GB micro SD card or larger. The image is based on Raspberry Pi OS (Bulleye) Lite. All software is installed, you just need to login to change your password and set your amateur radio callsign if you have one. You can run the ./update.sh script to update all packages and update and compile the latest CubeSatSim software.
The other option is to start with a Raspberry Pi OS (Rasbian) image (Bullseye or Buster works) and run the installation script ./install.sh which will install and compile all the related software. This includes the following packages:
The other option is to start with a Raspberry Pi OS (Rasbian) image (only Bullseye works, Bookworm or Trixie are not compatible) and run the installation script ./install.sh which will install and compile all the related software. This includes the following packages:
- wiringpi
- git
- libasound2-dev
@ -30,11 +36,23 @@ See the Wiki Software Install page for details: [https://github.com/alanbjohnsto
## Installation Script Option Steps
CubeSatSim runs on the Bullseye or Buster version of Raspberry Pi OS (Desktop or Lite), although a Pi Zero or Pi Zero W should only run Lite. Your Pi will need to have internet access to update settings and install packages.
CubeSatSim runs on the Bullseye version of Raspberry Pi OS (Desktop or Lite), although a Pi Zero or Pi Zero W should only run Lite. Your Pi will need to have internet access to update settings and install packages.
For the status of our efforts to get the code running on Bookworm, see https://github.com/alanbjohnston/CubeSatSim/discussions/389
Here is a Bullseye Pi OS image that works: https://downloads.raspberrypi.org/raspios_full_armhf/images/raspios_full_armhf-2023-05-03/ Here is the file download link: https://downloads.raspberrypi.org/raspios_full_armhf/images/raspios_full_armhf-2023-05-03/2023-05-03-raspios-bullseye-armhf-full.img.xz
You can use this with the Raspberry Pi Imager, but under `OS` you need to choose the `Use Custom` option at the very bottom of the list, then select the downloaded image `2023-05-03-raspios-bullseye-armhf-full.img.xz`
Unfortunately, Customization is not supported with a Custom image, so you can't preset your username, password, localization, and WiFi settings.
So after you write this image to your microSD card, you will need to connect a monitor and keyboard to your Pi Zero 2 to set these things (make sure you set `pi` as the username). After that, you can connect it to your WiFi and turn on ssh and vnc for remote access.
You can then follow the software installation steps and it work work. The only hiccup is that if you run the installer script while running the Desktop, the Direwolf installation will freeze. But you can just cycle the power to the Pi Zero 2, then run the installer script again and it will complete successfully. Alternatively, if you use `sudo raspi-config` to change to Boot to Console (System/ Boot Auto Login/ Console or Console Auto Login) then the installer script will complete without any issues.
*Note:* CubeSatSim expects to be installed as the `pi` user and references many paths in `/home/pi/*`. Installing as a different user will result in configuration files not saving along with many other issues.
To get the software follow these steps:
To install the software follow these steps:
`sudo apt-get update`
@ -54,6 +72,8 @@ The installation script will run for quite a while. You will get prompted for y
See the Wiki for more details about the CubeSatSim [https://github.com/alanbjohnston/CubeSatSim/wiki](https://github.com/alanbjohnston/CubeSatSim/wiki/v1.3.2-0.-Home)
Here are some Quick Start Guides for operating the CubeSatSim: https://CubeSatSim.org/qsg
Older Versions
There are several versions of the hardware and software to go with them:

@ -0,0 +1,529 @@
#include <string.h>
#include "codecAO40.h"
/* ---------------------- */
/* AO40 Encoder - Decoder */
/* ---------------------- */
/* Scramble and RS encode 256 byte blocks of data into 5200 bits
* or Descramble and RS decode 5200 bits into the 256 bytes of data
*
* --------------------------------------------------------------------------
* This decoder has evolved extensively through the work of Phil Karn. It draws
* on his own ideas and optimisations, and on the work of others. The lineage
* is as below, and parts of the authors' notices are included here. (JRM)
* AO40 encoder / decoder
* Copyright 2002 Phil Karn, KA9Q
* May be used under the terms of the GNU General Public License (GPL)
*
* Reed-Solomon coding and decoding
* Phil Karn (karn@ka9q.ampr.org) September 1996
*
* This file is derived from the program "new_rs_erasures.c" by Robert
* Morelos-Zaragoza (robert@spectra.eng.hawaii.edu) and Hari Thirumoorthy
* (harit@spectra.eng.hawaii.edu), Aug 1995
* --------------------------------------------------------------------------
*
* From the RM-Z & HT program:
* The encoding and decoding methods are based on the
* book "Error Control Coding: Fundamentals and Applications",
* by Lin and Costello, Prentice Hall, 1983, ISBN 0-13-283796-X
* Portions of this program are from a Reed-Solomon encoder/decoder
* in C, written by Simon Rockliff (simon@augean.ua.oz.au) on 21/9/89.
* --------------------------------------------------------------------------
*
* From the 1989/1991 SR program (also based on Lin and Costello):
* This program may be freely modified and/or given to whoever wants it.
* A condition of such distribution is that the author's contribution be
* acknowledged by his name being left in the comments heading the program,
* Simon Rockliff, 26th June 1991
*
*/
/* Defines for RS Decoder(s) */
#ifndef min
#define min(a,b) ((a) < (b) ? (a) : (b))
#endif
/*
CCodecAO40::CCodecAO40(void)
{
}
CCodecAO40::~CCodecAO40(void)
{
}
*/
//int CCodecAO40::mod255(int x) {
int mod255(int x) {
while (x >= 255) {
x -= 255;
x = (x >> 8) + (x & 255);
}
return x;
}
//int CCodecAO40::decode_rs_8(char *data, int *eras_pos, int no_eras){
int decode_rs_8(char *data, int *eras_pos, int no_eras){
int deg_lambda, el, deg_omega;
int i, j, r,k;
unsigned char u,q,tmp,num1,num2,den,discr_r;
unsigned char lambda[NROOTS+1], s[NROOTS]; /* Err+Eras Locator poly and syndrome poly */
unsigned char b[NROOTS+1], t[NROOTS+1], omega[NROOTS+1];
unsigned char root[NROOTS], reg[NROOTS+1], loc[NROOTS];
int syn_error, count;
/* form the syndromes; i.e., evaluate data(x) at roots of g(x) */
for(i=0;i<NROOTS;i++)
s[i] = data[0];
for(j=1;j<NN;j++){
for(i=0;i<NROOTS;i++){
if(s[i] == 0){
s[i] = data[j];
} else {
s[i] = data[j] ^ ALPHA_TO[mod255(INDEX_OF[s[i]] + (FCR+i)*PRIM)];
}
}
}
/* Convert syndromes to index form, checking for nonzero condition */
syn_error = 0;
for(i=0;i<NROOTS;i++){
syn_error |= s[i];
s[i] = INDEX_OF[s[i]];
}
if (!syn_error) {
/* if syndrome is zero, data[] is a codeword and there are no
* errors to correct. So return data[] unmodified
*/
count = 0;
goto finish;
}
memset(&lambda[1],0,NROOTS*sizeof(lambda[0]));
lambda[0] = 1;
if (no_eras > 0) {
/* Init lambda to be the erasure locator polynomial */
lambda[1] = ALPHA_TO[mod255(PRIM*(NN-1-eras_pos[0]))];
for (i = 1; i < no_eras; i++) {
u = mod255(PRIM*(NN-1-eras_pos[i]));
for (j = i+1; j > 0; j--) {
tmp = INDEX_OF[lambda[j - 1]];
if(tmp != A0)
lambda[j] ^= ALPHA_TO[mod255(u + tmp)];
}
}
}
for(i=0;i<NROOTS+1;i++)
b[i] = INDEX_OF[lambda[i]];
/*
* Begin Berlekamp-Massey algorithm to determine error+erasure
* locator polynomial
*/
r = no_eras;
el = no_eras;
while (++r <= NROOTS) { /* r is the step number */
/* Compute discrepancy at the r-th step in poly-form */
discr_r = 0;
for (i = 0; i < r; i++){
if ((lambda[i] != 0) && (s[r-i-1] != A0)) {
discr_r ^= ALPHA_TO[mod255(INDEX_OF[lambda[i]] + s[r-i-1])];
}
}
discr_r = INDEX_OF[discr_r]; /* Index form */
if (discr_r == A0) {
/* 2 lines below: B(x) <-- x*B(x) */
memmove(&b[1],b,NROOTS*sizeof(b[0]));
b[0] = A0;
} else {
/* 7 lines below: T(x) <-- lambda(x) - discr_r*x*b(x) */
t[0] = lambda[0];
for (i = 0 ; i < NROOTS; i++) {
if(b[i] != A0)
t[i+1] = lambda[i+1] ^ ALPHA_TO[mod255(discr_r + b[i])];
else
t[i+1] = lambda[i+1];
}
if (2 * el <= r + no_eras - 1) {
el = r + no_eras - el;
/*
* 2 lines below: B(x) <-- inv(discr_r) *
* lambda(x)
*/
for (i = 0; i <= NROOTS; i++)
b[i] = (lambda[i] == 0) ? A0 : mod255(INDEX_OF[lambda[i]] - discr_r + NN);
} else {
/* 2 lines below: B(x) <-- x*B(x) */
memmove(&b[1],b,NROOTS*sizeof(b[0]));
b[0] = A0;
}
memcpy(lambda,t,(NROOTS+1)*sizeof(t[0]));
}
}
/* Convert lambda to index form and compute deg(lambda(x)) */
deg_lambda = 0;
for(i=0;i<NROOTS+1;i++){
lambda[i] = INDEX_OF[lambda[i]];
if(lambda[i] != A0)
deg_lambda = i;
}
/* Find roots of the error+erasure locator polynomial by Chien search */
memcpy(&reg[1],&lambda[1],NROOTS*sizeof(reg[0]));
count = 0; /* Number of roots of lambda(x) */
for (i = 1,k=IPRIM-1; i <= NN; i++,k = mod255(k+IPRIM)) {
q = 1; /* lambda[0] is always 0 */
for (j = deg_lambda; j > 0; j--){
if (reg[j] != A0) {
reg[j] = mod255(reg[j] + j);
q ^= ALPHA_TO[reg[j]];
}
}
if (q != 0)
continue; /* Not a root */
/* store root (index-form) and error location number */
root[count] = i;
loc[count] = k;
/* If we've already found max possible roots,
* abort the search to save time
*/
if(++count == deg_lambda)
break;
}
if (deg_lambda != count) {
/*
* deg(lambda) unequal to number of roots => uncorrectable
* error detected
*/
count = -1;
goto finish;
}
/*
* Compute err+eras evaluator poly omega(x) = s(x)*lambda(x) (modulo
* x**NROOTS). in index form. Also find deg(omega).
*/
deg_omega = 0;
for (i = 0; i < NROOTS;i++){
tmp = 0;
j = (deg_lambda < i) ? deg_lambda : i;
for(;j >= 0; j--){
if ((s[i - j] != A0) && (lambda[j] != A0))
tmp ^= ALPHA_TO[mod255(s[i - j] + lambda[j])];
}
if(tmp != 0)
deg_omega = i;
omega[i] = INDEX_OF[tmp];
}
omega[NROOTS] = A0;
/*
* Compute error values in poly-form. num1 = omega(inv(X(l))), num2 =
* inv(X(l))**(FCR-1) and den = lambda_pr(inv(X(l))) all in poly-form
*/
for (j = count-1; j >=0; j--) {
num1 = 0;
for (i = deg_omega; i >= 0; i--) {
if (omega[i] != A0)
num1 ^= ALPHA_TO[mod255(omega[i] + i * root[j])];
}
num2 = ALPHA_TO[mod255(root[j] * (FCR - 1) + NN)];
den = 0;
/* lambda[i+1] for i even is the formal derivative lambda_pr of lambda[i] */
for (i = min(deg_lambda,NROOTS-1) & ~1; i >= 0; i -=2) {
if(lambda[i+1] != A0)
den ^= ALPHA_TO[mod255(lambda[i+1] + i * root[j])];
}
if (den == 0) {
count = -1;
goto finish;
}
/* Apply error to data */
if (num1 != 0) {
data[loc[j]] ^= ALPHA_TO[mod255(INDEX_OF[num1] + INDEX_OF[num2] + NN - INDEX_OF[den])];
}
}
finish:
if(eras_pos != NULL){
for(i=0;i<count;i++)
eras_pos[i] = loc[i];
}
return count;
}
/* ---------- */
/* Re-encoder */
/* ---------- */
/* Reference encoder for proposed coded AO-40 telemetry format - v1.0 7 Jan 2002
* Copyright 2002, Phil Karn, KA9Q
* This software may be used under the terms of the GNU Public License (GPL)
*/
/* Adapted from the above enc_ref.c as used by the spacecraft (JRM) */
/* Write one binary channel symbol into the interleaver frame and update the pointers */
//void CCodecAO40::interleave_symbol(int c)
void interleave_symbol(int c)
{
int row,col;
col=m_ileaver_index/COLUMNS;
row=m_ileaver_index%COLUMNS;
if(c)
{
m_encoded[row*ROWS+col] = 1;
}
m_ileaver_index++;
}
/* Convolutionally encode and interleave one byte */
//void CCodecAO40::encode_and_interleave(unsigned char c,int cnt){
void encode_and_interleave(unsigned char c,int cnt){
while(cnt-- != 0)
{
m_conv_sr = (m_conv_sr << 1) | (c >> 7);
c <<= 1;
interleave_symbol( Partab[m_conv_sr & CPOLYA]);
interleave_symbol(!Partab[m_conv_sr & CPOLYB]); /* Second encoder symbol is inverted */
}
}
/* Scramble a byte, convolutionally encode and interleave into frame */
//void CCodecAO40::scramble_and_encode(unsigned char c){
void scramble_and_encode(unsigned char c){
c ^= Scrambler[m_encoded_bytes]; /* Scramble byte */
encode_and_interleave(c,8); /* RS encode and place into reencode buffer */
}
/* Encodes the 256 byte source block RSdecdata[] into 5200 byte block of symbols
* results stored in m_encoded.
* On success encoded buffer is returned, an zeroed buffer on failure
*/
//const unsigned char *CCodecAO40::encode(unsigned char *source_bytes, int byte_count)
const unsigned char *encode(unsigned char *source_bytes, int byte_count)
{
if(BLOCKSIZE != byte_count || NULL == source_bytes )
{
memset(m_encoded, 0, BLOCKSIZE);
return m_encoded;
}
init_encoder();
for(int i=0;i<BLOCKSIZE;i++)
{
encode_byte(source_bytes[i]) ;
}
for(int i=0;i<64;i++)
{
encode_parity();
}
return m_encoded;
}
/* The original three C user's entry points now follow. They are:
init_encoder() Called once before using system.
encode_byte(unsigned char c) Called with each user byte (i.e. 256 calls)
encode_parity() Called 64 times to finish off
*/
/* This function initializes the encoder. */
//void CCodecAO40::init_encoder(void){
void init_encoder(void){
int i,j,sr;
m_encoded_bytes = 0;
m_conv_sr = 0;
m_ileaver_index = COLUMNS; /* Sync vector is in first column; data starts here */
for(j=0;j<RSBLOCKS;j++) /* Flush parity array */
{
for(i=0;i<NROOTS;i++)
{
m_RS_block[j][i] = 0;
}
}
/* Clear re-encoded array */
for(i=0;i<SYMPBLOCK;i++)
{
m_encoded[i] = 0;
}
/* Generate sync vector, interleave into re-encode array, 1st column */
sr = 0x7f;
for(i=0;i<65;i++)
{
if(sr & 64)
{
m_encoded[ROWS*i] = 1; /* Every 80th symbol is a sync bit */
}
sr = (sr << 1) | Partab[sr & SYNC_POLY];
}
}
/* This function is called with each user data byte to be encoded into the
* current frame. It should be called in sequence 256 times per frame, followed
* by 64 calls to encode_parity().
*/
//void CCodecAO40::encode_byte(unsigned char c){
void encode_byte(unsigned char c){
unsigned char *rp; /* RS block pointer */
int i;
unsigned char feedback;
/* Update the appropriate Reed-Solomon codeword */
rp = m_RS_block[m_encoded_bytes & 1];
/* Compute feedback term */
feedback = INDEX_OF[c ^ rp[0]];
/* If feedback is non-zero, multiply by each generator polynomial coefficient and
* add to corresponding shift register elements
*/
if(feedback != A0){
int j;
/* This loop exploits the palindromic nature of the generator polynomial
* to halve the number of discrete multiplications
*/
for(j=0;j<15;j++){
unsigned char t;
t = ALPHA_TO[mod255(feedback + RS_poly[j])];
rp[j+1] ^= t; rp[31-j] ^= t;
}
rp[16] ^= ALPHA_TO[mod255(feedback + RS_poly[15])];
}
/* Shift 32 byte RS register one position down */
for(i=0;i<31;i++)
rp[i] = rp[i+1];
/* Handle highest order coefficient, which is unity */
if(feedback != A0){
rp[31] = ALPHA_TO[feedback];
} else {
rp[31] = 0;
}
scramble_and_encode(c);
m_encoded_bytes++;
}
/* This function should be called 64 times after the 256 data bytes
* have been passed to update_encoder. Each call scrambles, encodes and
* interleaves one byte of Reed-Solomon parity.
*/
//void CCodecAO40::encode_parity(void) {
void encode_parity(void) {
unsigned char c;
c = m_RS_block[m_encoded_bytes & 1][(m_encoded_bytes-256)>>1];
scramble_and_encode(c);
if(++m_encoded_bytes == 320){
/* Tail off the convolutional encoder (flush) */
encode_and_interleave(0,6);
}
}
//void CCodecAO40::descramble_to_rsblocks(unsigned char viterbi_decoded[NBITS_OUT], char rsblocks[RSBLOCKS][NN])
void descramble_to_rsblocks(unsigned char viterbi_decoded[NBITS_OUT], char rsblocks[RSBLOCKS][NN])
{
/* interleave into Reed Solomon codeblocks */
memset(rsblocks,0,RSBLOCKS*NN); /* Zero rsblocks array */
int di = 0;
int si = 0;
for(int col=RSPAD;col<NN;col++)
{
for(int row=0;row<RSBLOCKS;row++)
{
rsblocks[row][col] = viterbi_decoded[di++] ^ Scrambler[si++]; /* Remove scrambling */
}
}
}
/* -------- */
/* Decoder */
/* -------- */
/* ------------------- */
/* There are two RS decoders, processing 128 bytes each.
*
* If both RS decoders are SUCCESSFUL
* On exit:
* rs_failures = 0
* rserrs[x] = number of errors corrected; range 0 to 16 (x= 0 or 1)
* Data output is in array RSdecdata[256].
*
* If an RS decoder FAILS
* On exit:
* rs_failures = 1 or 2 (i.e. != 0)
* rserrs[x] contains -1
* Data output should not be used.
*/
//int CCodecAO40::decode(unsigned char vitdecdata[NBITS_OUT], unsigned char *decoded_data)
int decode(unsigned char vitdecdata[NBITS_OUT], unsigned char *decoded_data)
{
int row, col, row_errors, total_errors;
char rsblocks[RSBLOCKS][NN];
descramble_to_rsblocks(vitdecdata, rsblocks);
/* Run RS-decoder(s) */
row_errors = total_errors = 0;
for(row=0; row<RSBLOCKS && row_errors!= -1; row++)
{
// decode row, returns -1 on failure or number of corrected errors
row_errors = decode_rs_8(rsblocks[row],NULL,0);
total_errors += row_errors;
}
if(row_errors != -1)
{
/* if frame decoded OK, deinterleave data from RS codeword(s) */
int j = 0;
for(col=RSPAD;col<KK;col++)
{
for(row=0;row<RSBLOCKS;row++)
{
decoded_data[j++] = rsblocks[row][col];
}
}
}
else
{
total_errors = -1;
}
return total_errors;
}
/* Compairs raw input symbols to current buffer of encoded symbols and counts the errors */
//int CCodecAO40::count_errors(unsigned char *raw_symbols)
int count_errors(unsigned char *raw_symbols)
{
int error_count = 0;
for(int i=0;i<SYMPBLOCK;i++)
{
if ( m_encoded[i] != (raw_symbols[i]>>7) )
{
error_count++ ;
}
}
return error_count;
}

@ -0,0 +1,110 @@
/* AO40 encoder / decoder
* Copyright 2002 Phil Karn, KA9Q
* May be used under the terms of the GNU General Public License (GPL)
* See CodecAO40.cpp for lineage
*
* This file is part of FUNcubeLib.
*
* FUNcubeLib is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* FUNcubeLib is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with FUNcubeLib If not, see <http://www.gnu.org/licenses/>.
*
*/
#pragma once
//#include "fecConstants.h"
/*
Amsat P3 FEC Encoder/decoder system. Look-up tables
Created by Phil Karn KA9Q and James Miller G3RUH
Last modified 2003 Jun 20
*/
/* Defines for Viterbi Decoder for r=1/2 k=7 (to CCSDS convention) */
#define K 7 /* Constraint length */
#define N 2 /* Number of symbols per data bit */
#define CPOLYA 0x4f /* First convolutional encoder polynomial */
#define CPOLYB 0x6d /* Second convolutional encoder polynomial */
#define SYNC_POLY 0x48 /* Sync vector PN polynomial */
#define NN 255
#define KK 223
#define NROOTS 32 /* NN-KK */
#define A0 (NN)
#define FCR 112
#define PRIM 11
#define IPRIM 116
#define BLOCKSIZE 256 /* Data bytes per frame */
#define RSBLOCKS 2 /* Number of RS decoder blocks */
#define RSPAD 95 /* Unused bytes in block (KK-BLOCKSIZE/RSBLOCKS) */
/* Defines for Interleaver */
#define ROWS 80 /* Block interleaver rows */
#define COLUMNS 65 /* Block interleaver columns */
#define SYMPBLOCK (ROWS*COLUMNS) /* Encoded symbols per block */
/* Number of symbols in an FEC block that are */
/* passed to the Viterbi decoder (320*8 + 6) */
#define NBITS ((BLOCKSIZE+NROOTS*RSBLOCKS)*8+K-1)
/* Number of bits obtained from Viterbi decoder */
#define NBITS_OUT (BLOCKSIZE+NROOTS*RSBLOCKS)
extern unsigned char m_RS_block[RSBLOCKS][NROOTS]; /* RS parity blocks */
extern unsigned char m_encoded[SYMPBLOCK] ; /* encoded symbols */
extern int m_encoded_bytes; /* Byte counter for encode_data() */
extern int m_ileaver_index; /* Byte counter for interleaver */
extern unsigned char m_conv_sr; /* Convolutional encoder shift register state */
extern const unsigned char RS_poly[];
extern const unsigned char ALPHA_TO[];
extern const unsigned char INDEX_OF[];
extern const unsigned char Partab[];
extern const unsigned char Scrambler[];
//class CCodecAO40
//{
//public:
// CCodecAO40(void);
// virtual ~CCodecAO40(void);
int decode(unsigned char viterbi_decoded[NBITS_OUT], unsigned char *decoded_data);
/* Encodes the 256 byte source block into 5200 byte block of symbols into m_encoded buffer */
const unsigned char *encode(
unsigned char *source_bytes, /* input to encode */
int byte_count); /* input length in bytes */
/* Compares raw input symbols to current buffer of encoded symbols and counts the errors */
int count_errors( unsigned char *raw_symbols);
//private:
int mod255(int x);
int decode_rs_8(char *data, int *eras_pos, int no_eras);
void scramble_and_encode(unsigned char c);
void encode_and_interleave(unsigned char c,int cnt);
void descramble_to_rsblocks(
unsigned char viterbi_decoded[NBITS_OUT],
char rsblocks[RSBLOCKS][NN]);
void init_encoder(void);
void encode_byte(unsigned char c);
void encode_parity(void);
void interleave_symbol(int c);
//};

@ -1,6 +1,8 @@
#!/bin/bash
echo -e "\nCommand and Control script for CubeSatSim v2.0\n"
echo -e "\nCommand and Control script for CubeSatSim v2.1\n"
sudo modprobe snd-aloop
sudo modprobe snd-aloop
@ -37,9 +39,17 @@ else
fi
echo "Waiting 20 seconds for USB"
uptime=`cat /proc/uptime | awk '{printf "%0.f", $1}'`
echo -n "Uptime since boot is "
echo $uptime
sleep 20
if [[ "$uptime" -lt "60" ]]; then
echo "Waiting 20 seconds for USB"
sleep 20
fi
FILE=/home/pi/CubeSatSim/command_control_direwolf
if [[ $(arecord -l | grep "USB Audio Device") ]] && [ -f "$FILE" ]; then

@ -436,6 +436,8 @@ elif [ "$1" = "-s" ]; then
check_restart
sudo echo "s" > /home/pi/CubeSatSim/.mode
fi
elif [ "$1" = "-t" ]; then
echo
@ -519,7 +521,6 @@ elif [ "$1" = "-c" ]; then
echo $callsign $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11} ${12} ${13}
echo $callsign $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11} ${12} ${13} > /home/pi/CubeSatSim/sim.cfg
fi
if [ "$norestart" = "1" ]; then

@ -1,5 +0,0 @@
ADEVICE hw:CARD=Loopback,DEV=0 hw:CARD=Headphones,DEV=0
MYCALL AMSAT
CHANNEL 0
MODEM 1200
CBEACON dest="DTMF-3" info="10 #" delay=0

@ -1,5 +0,0 @@
ADEVICE hw:CARD=Loopback,DEV=0 hw:CARD=Headphones,DEV=0
MYCALL AMSAT
CHANNEL 0
MODEM 1200
CBEACON dest="DTMF-3" info="3 #" delay=0

@ -1,5 +0,0 @@
ADEVICE hw:CARD=Loopback,DEV=0 hw:CARD=Headphones,DEV=0
MYCALL AMSAT
CHANNEL 0
MODEM 1200
CBEACON dest="DTMF-3" info="5 #" delay=0

@ -1,5 +0,0 @@
ADEVICE hw:CARD=Loopback,DEV=0 hw:CARD=Headphones,DEV=0
MYCALL AMSAT
CHANNEL 0
MODEM 1200
CBEACON dest="DTMF-3" info="2 #" delay=0

@ -1,5 +0,0 @@
ADEVICE hw:CARD=Loopback,DEV=0 hw:CARD=Headphones,DEV=0
MYCALL AMSAT
CHANNEL 0
MODEM 1200
CBEACON dest="DTMF-3" info="4 #" delay=0

@ -3,4 +3,5 @@ PTT GPIO 20
MYCALL AMSAT
CHANNEL 0
MODEM 1200
CBEACON dest="DTMF-3" info="1 #" delay=0
KISSPORT 8003
AGWPORT 8004

@ -18,7 +18,7 @@ def blink(times):
if __name__ == "__main__":
powerPin = 16
txLed = 27
txLed = 17
change_mode = False
debug_mode = False
counter = 1
@ -187,6 +187,7 @@ if __name__ == "__main__":
change_mode = False
except:
print("Error reading line (probably due to UTF-8 issue)")
print("Waiting 5 seconds to allow unplug and plug of soundcard")
sleep(5)
print("Done")

@ -0,0 +1,128 @@
#pragma once
/*
Amsat P3 FEC Encoder/decoder system. Look-up tables
Created by Phil Karn KA9Q and James Miller G3RUH
Last modified 2003 Jun 20
*/
/* Defines for Viterbi Decoder for r=1/2 k=7 (to CCSDS convention) */
#define K 7 /* Constraint length */
#define N 2 /* Number of symbols per data bit */
#define CPOLYA 0x4f /* First convolutional encoder polynomial */
#define CPOLYB 0x6d /* Second convolutional encoder polynomial */
#define SYNC_POLY 0x48 /* Sync vector PN polynomial */
#define NN 255
#define KK 223
#define NROOTS 32 /* NN-KK */
#define A0 (NN)
#define FCR 112
#define PRIM 11
#define IPRIM 116
#define BLOCKSIZE 256 /* Data bytes per frame */
#define RSBLOCKS 2 /* Number of RS decoder blocks */
#define RSPAD 95 /* Unused bytes in block (KK-BLOCKSIZE/RSBLOCKS) */
/* Defines for Interleaver */
#define ROWS 80 /* Block interleaver rows */
#define COLUMNS 65 /* Block interleaver columns */
#define SYMPBLOCK (ROWS*COLUMNS) /* Encoded symbols per block */
/* Number of symbols in an FEC block that are */
/* passed to the Viterbi decoder (320*8 + 6) */
#define NBITS ((BLOCKSIZE+NROOTS*RSBLOCKS)*8+K-1)
/* Number of bits obtained from Viterbi decoder */
#define NBITS_OUT (BLOCKSIZE+NROOTS*RSBLOCKS)
const unsigned char RS_poly[] = {
249, 59, 66, 4, 43,126,251, 97, 30, 3,213, 50, 66,170, 5, 24
};
/* Tables for RS decoder */
/* Galois field log/antilog tables */
const unsigned char ALPHA_TO[] =
{
0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x87, 0x89, 0x95, 0xad, 0xdd, 0x3d, 0x7a, 0xf4,
0x6f, 0xde, 0x3b, 0x76, 0xec, 0x5f, 0xbe, 0xfb, 0x71, 0xe2, 0x43, 0x86, 0x8b, 0x91, 0xa5, 0xcd,
0x1d, 0x3a, 0x74, 0xe8, 0x57, 0xae, 0xdb, 0x31, 0x62, 0xc4, 0x0f, 0x1e, 0x3c, 0x78, 0xf0, 0x67,
0xce, 0x1b, 0x36, 0x6c, 0xd8, 0x37, 0x6e, 0xdc, 0x3f, 0x7e, 0xfc, 0x7f, 0xfe, 0x7b, 0xf6, 0x6b,
0xd6, 0x2b, 0x56, 0xac, 0xdf, 0x39, 0x72, 0xe4, 0x4f, 0x9e, 0xbb, 0xf1, 0x65, 0xca, 0x13, 0x26,
0x4c, 0x98, 0xb7, 0xe9, 0x55, 0xaa, 0xd3, 0x21, 0x42, 0x84, 0x8f, 0x99, 0xb5, 0xed, 0x5d, 0xba,
0xf3, 0x61, 0xc2, 0x03, 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0x07, 0x0e, 0x1c, 0x38, 0x70, 0xe0,
0x47, 0x8e, 0x9b, 0xb1, 0xe5, 0x4d, 0x9a, 0xb3, 0xe1, 0x45, 0x8a, 0x93, 0xa1, 0xc5, 0x0d, 0x1a,
0x34, 0x68, 0xd0, 0x27, 0x4e, 0x9c, 0xbf, 0xf9, 0x75, 0xea, 0x53, 0xa6, 0xcb, 0x11, 0x22, 0x44,
0x88, 0x97, 0xa9, 0xd5, 0x2d, 0x5a, 0xb4, 0xef, 0x59, 0xb2, 0xe3, 0x41, 0x82, 0x83, 0x81, 0x85,
0x8d, 0x9d, 0xbd, 0xfd, 0x7d, 0xfa, 0x73, 0xe6, 0x4b, 0x96, 0xab, 0xd1, 0x25, 0x4a, 0x94, 0xaf,
0xd9, 0x35, 0x6a, 0xd4, 0x2f, 0x5e, 0xbc, 0xff, 0x79, 0xf2, 0x63, 0xc6, 0x0b, 0x16, 0x2c, 0x58,
0xb0, 0xe7, 0x49, 0x92, 0xa3, 0xc1, 0x05, 0x0a, 0x14, 0x28, 0x50, 0xa0, 0xc7, 0x09, 0x12, 0x24,
0x48, 0x90, 0xa7, 0xc9, 0x15, 0x2a, 0x54, 0xa8, 0xd7, 0x29, 0x52, 0xa4, 0xcf, 0x19, 0x32, 0x64,
0xc8, 0x17, 0x2e, 0x5c, 0xb8, 0xf7, 0x69, 0xd2, 0x23, 0x46, 0x8c, 0x9f, 0xb9, 0xf5, 0x6d, 0xda,
0x33, 0x66, 0xcc, 0x1f, 0x3e, 0x7c, 0xf8, 0x77, 0xee, 0x5b, 0xb6, 0xeb, 0x51, 0xa2, 0xc3, 0x00,
};
const unsigned char INDEX_OF[]=
{
0xff, 0x00, 0x01, 0x63, 0x02, 0xc6, 0x64, 0x6a, 0x03, 0xcd, 0xc7, 0xbc, 0x65, 0x7e, 0x6b, 0x2a,
0x04, 0x8d, 0xce, 0x4e, 0xc8, 0xd4, 0xbd, 0xe1, 0x66, 0xdd, 0x7f, 0x31, 0x6c, 0x20, 0x2b, 0xf3,
0x05, 0x57, 0x8e, 0xe8, 0xcf, 0xac, 0x4f, 0x83, 0xc9, 0xd9, 0xd5, 0x41, 0xbe, 0x94, 0xe2, 0xb4,
0x67, 0x27, 0xde, 0xf0, 0x80, 0xb1, 0x32, 0x35, 0x6d, 0x45, 0x21, 0x12, 0x2c, 0x0d, 0xf4, 0x38,
0x06, 0x9b, 0x58, 0x1a, 0x8f, 0x79, 0xe9, 0x70, 0xd0, 0xc2, 0xad, 0xa8, 0x50, 0x75, 0x84, 0x48,
0xca, 0xfc, 0xda, 0x8a, 0xd6, 0x54, 0x42, 0x24, 0xbf, 0x98, 0x95, 0xf9, 0xe3, 0x5e, 0xb5, 0x15,
0x68, 0x61, 0x28, 0xba, 0xdf, 0x4c, 0xf1, 0x2f, 0x81, 0xe6, 0xb2, 0x3f, 0x33, 0xee, 0x36, 0x10,
0x6e, 0x18, 0x46, 0xa6, 0x22, 0x88, 0x13, 0xf7, 0x2d, 0xb8, 0x0e, 0x3d, 0xf5, 0xa4, 0x39, 0x3b,
0x07, 0x9e, 0x9c, 0x9d, 0x59, 0x9f, 0x1b, 0x08, 0x90, 0x09, 0x7a, 0x1c, 0xea, 0xa0, 0x71, 0x5a,
0xd1, 0x1d, 0xc3, 0x7b, 0xae, 0x0a, 0xa9, 0x91, 0x51, 0x5b, 0x76, 0x72, 0x85, 0xa1, 0x49, 0xeb,
0xcb, 0x7c, 0xfd, 0xc4, 0xdb, 0x1e, 0x8b, 0xd2, 0xd7, 0x92, 0x55, 0xaa, 0x43, 0x0b, 0x25, 0xaf,
0xc0, 0x73, 0x99, 0x77, 0x96, 0x5c, 0xfa, 0x52, 0xe4, 0xec, 0x5f, 0x4a, 0xb6, 0xa2, 0x16, 0x86,
0x69, 0xc5, 0x62, 0xfe, 0x29, 0x7d, 0xbb, 0xcc, 0xe0, 0xd3, 0x4d, 0x8c, 0xf2, 0x1f, 0x30, 0xdc,
0x82, 0xab, 0xe7, 0x56, 0xb3, 0x93, 0x40, 0xd8, 0x34, 0xb0, 0xef, 0x26, 0x37, 0x0c, 0x11, 0x44,
0x6f, 0x78, 0x19, 0x9a, 0x47, 0x74, 0xa7, 0xc1, 0x23, 0x53, 0x89, 0xfb, 0x14, 0x5d, 0xf8, 0x97,
0x2e, 0x4b, 0xb9, 0x60, 0x0f, 0xed, 0x3e, 0xe5, 0xf6, 0x87, 0xa5, 0x17, 0x3a, 0xa3, 0x3c, 0xb7,
};
/* 8-bit parity table */
const unsigned char Partab[] = {
0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0,
1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1,
1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1,
0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0,
1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1,
0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0,
0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0,
1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1,
1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1,
0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0,
0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0,
1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1,
0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0,
1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1,
1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1,
0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0,
};
/* Scramble byte table */
const unsigned char Scrambler[]=
{
0xff, 0x48, 0x0e, 0xc0, 0x9a, 0x0d, 0x70, 0xbc, 0x8e, 0x2c, 0x93, 0xad, 0xa7, 0xb7, 0x46, 0xce,
0x5a, 0x97, 0x7d, 0xcc, 0x32, 0xa2, 0xbf, 0x3e, 0x0a, 0x10, 0xf1, 0x88, 0x94, 0xcd, 0xea, 0xb1,
0xfe, 0x90, 0x1d, 0x81, 0x34, 0x1a, 0xe1, 0x79, 0x1c, 0x59, 0x27, 0x5b, 0x4f, 0x6e, 0x8d, 0x9c,
0xb5, 0x2e, 0xfb, 0x98, 0x65, 0x45, 0x7e, 0x7c, 0x14, 0x21, 0xe3, 0x11, 0x29, 0x9b, 0xd5, 0x63,
0xfd, 0x20, 0x3b, 0x02, 0x68, 0x35, 0xc2, 0xf2, 0x38, 0xb2, 0x4e, 0xb6, 0x9e, 0xdd, 0x1b, 0x39,
0x6a, 0x5d, 0xf7, 0x30, 0xca, 0x8a, 0xfc, 0xf8, 0x28, 0x43, 0xc6, 0x22, 0x53, 0x37, 0xaa, 0xc7,
0xfa, 0x40, 0x76, 0x04, 0xd0, 0x6b, 0x85, 0xe4, 0x71, 0x64, 0x9d, 0x6d, 0x3d, 0xba, 0x36, 0x72,
0xd4, 0xbb, 0xee, 0x61, 0x95, 0x15, 0xf9, 0xf0, 0x50, 0x87, 0x8c, 0x44, 0xa6, 0x6f, 0x55, 0x8f,
0xf4, 0x80, 0xec, 0x09, 0xa0, 0xd7, 0x0b, 0xc8, 0xe2, 0xc9, 0x3a, 0xda, 0x7b, 0x74, 0x6c, 0xe5,
0xa9, 0x77, 0xdc, 0xc3, 0x2a, 0x2b, 0xf3, 0xe0, 0xa1, 0x0f, 0x18, 0x89, 0x4c, 0xde, 0xab, 0x1f,
0xe9, 0x01, 0xd8, 0x13, 0x41, 0xae, 0x17, 0x91, 0xc5, 0x92, 0x75, 0xb4, 0xf6, 0xe8, 0xd9, 0xcb,
0x52, 0xef, 0xb9, 0x86, 0x54, 0x57, 0xe7, 0xc1, 0x42, 0x1e, 0x31, 0x12, 0x99, 0xbd, 0x56, 0x3f,
0xd2, 0x03, 0xb0, 0x26, 0x83, 0x5c, 0x2f, 0x23, 0x8b, 0x24, 0xeb, 0x69, 0xed, 0xd1, 0xb3, 0x96,
0xa5, 0xdf, 0x73, 0x0c, 0xa8, 0xaf, 0xcf, 0x82, 0x84, 0x3c, 0x62, 0x25, 0x33, 0x7a, 0xac, 0x7f,
0xa4, 0x07, 0x60, 0x4d, 0x06, 0xb8, 0x5e, 0x47, 0x16, 0x49, 0xd6, 0xd3, 0xdb, 0xa3, 0x67, 0x2d,
0x4b, 0xbe, 0xe6, 0x19, 0x51, 0x5f, 0x9f, 0x05, 0x08, 0x78, 0xc4, 0x4a, 0x66, 0xf5, 0x58, 0xff,
0x48, 0x0e, 0xc0, 0x9a, 0x0d, 0x70, 0xbc, 0x8e, 0x2c, 0x93, 0xad, 0xa7, 0xb7, 0x46, 0xce, 0x5a,
0x97, 0x7d, 0xcc, 0x32, 0xa2, 0xbf, 0x3e, 0x0a, 0x10, 0xf1, 0x88, 0x94, 0xcd, 0xea, 0xb1, 0xfe,
0x90, 0x1d, 0x81, 0x34, 0x1a, 0xe1, 0x79, 0x1c, 0x59, 0x27, 0x5b, 0x4f, 0x6e, 0x8d, 0x9c, 0xb5,
0x2e, 0xfb, 0x98, 0x65, 0x45, 0x7e, 0x7c, 0x14, 0x21, 0xe3, 0x11, 0x29, 0x9b, 0xd5, 0x63, 0xfd,
};

@ -0,0 +1,72 @@
#! /usr/bin/env python3
"""
example Python gpsd client
run this way: python3 example1.py.txt
"""
# from https://gpsd.gitlab.io/gpsd/gpsd-client-example-code.html
# this client is for the CubeSatSim Lite which does not have a Pico microcontroller
try:
import gps # the gpsd interface module
import time
mode = -1
lat = 0
lon = 0
alt = 0
session = gps.gps(mode=gps.WATCH_ENABLE)
start = time.perf_counter()
try:
# while (session.read() == 0) and ((time.perf_counter() - start) < 2) and (mode < 2):
while ((time.perf_counter() - start) < 2) and (mode < 2):
if session.waiting(2.0):
session.read()
# print(gps.MODE_SET)
# print(session.valid)
if (session.valid):
# not useful, probably not a TPV message
# continue
# print('Mode: %s(%d) Time: ' %
# (("Invalid", "NO_FIX", "2D", "3D")[session.fix.mode],
# session.fix.mode), end="")
# print time, if we have it
# print("%d " % session.fix.mode, end="")
if (session.fix.mode > mode):
mode = session.fix.mode
# if gps.TIME_SET & session.valid:
# print(session.fix.time, end="")
# else:
# print('n/a', end="")
if gps.isfinite(session.fix.latitude):
lat = session.fix.latitude
if gps.isfinite(session.fix.longitude):
lon = session.fix.longitude
if gps.isfinite(session.fix.altitude):
alt = session.fix.altitude
# print("%.6f %.6f %.6f" % (session.fix.latitude, session.fix.longitude, session.fix.altitude))
# else:
# print(" 0 0 0")
except KeyboardInterrupt:
# got a ^C. Say bye, bye
print('')
# Got ^C, or fell out of the loop. Cleanup, and leave.
session.close()
print("%d %.6f %.6f %.1f" % (mode, lat, lon, alt))
# exit(0)
except:
print("-1 0 0 0")
exit(0)

@ -173,7 +173,8 @@
"upper_bound": 440000000,
"frequencies": {
"packet": 434900000,
"pocsag": 439987500
"pocsag": 439987500,
"sstv": { "frequency": 434900000, "underlying": "nfm" }
}
},
{

@ -0,0 +1,213 @@
import sys
from os import system
from time import sleep
import logging
import random
from PIL import Image, ImageDraw, ImageFont, ImageColor
import subprocess
import io
import datetime
logging.basicConfig(format='%(message)s')
# logging.warning('CC-Warning!')
def fstr(template):
return eval(f"f'{template}'")
def system_and_print(string):
print(string)
system(string)
FC_EPS = 1
FC_BOB = 25
FC_SW = 50
FC_PAYLOAD = 55
extended = 1
sequence, image_id, image_count = 0, 0, 0
Vx, Vy, Vz, Vb = 0, 0, 0, 0
Ix, Iy, Iz, Ic, Ib = 0, 0, 0, 0, 0
frame_count, frame_type = 0, " "
frequency_string, frequency, errors, first_byte = " ", 0, 0, 0
#html_dir = "/home/pi/CubeSatSim/groundstation/public_html/"
html_dir = "/home/pi/fctelem/public_html/"
image_dir = "/home/pi/fctelem/"
image = "image_file"
ssdv = "/home/pi/ssdv/ssdv -d -J "
date_time_string = str(datetime.datetime.now())
date_time = date_time_string[:21]
system_and_print("sudo rm " + image_dir + image)
#system_and_print("sudo rm " + html_dir + "*")
system_and_print("sudo rm " + html_dir + "images/*")
try:
with open('/home/pi/fctelem/fctelem.cfg', 'r') as config:
config_string = config.read()
print(config_string)
except:
print("Error loading fctelem.cfg")
#system_and_print("cp /home/pi/CubeSatSim/sstv/sstv_image_1_320_x_256.jpg " + html_dir + "image_file.jpeg")
head_string = '<HEAD><meta http-equiv="refresh" content="5"><title>FUNcube CubeSatSim Telemetry</title></HEAD>\n<HTML>\n<H2>FUNcube CubeSatSim Telemetry</H2>' + \
'fcdctl ' + config_string + '<p><pre> <img height="256" width="320" src="' + image + \
'.jpeg"><br> <A HREF="images" target="_blank">All images</a><br>'
foot_string = '</HTML>'
telem_string_format = " Image: {image_id:3d} count: {image_count:2d}<p>" + \
" Vx(mV): {Vx:5d} Vy(mV): {Vy:5d} Vz(mV): {Vz:5d}<p>" + \
" Ix(mA): {Ix:5d} Iy(mA): {Iy:5d} Iz(mA): {Iz:5d}<p>" + \
" Vbat(mV): {Vb:5d} Ibat(mA): {Ib:5d}<br><br></pre>" + \
" Freq: {frequency:10.1f} errors: {errors} Seq: {sequence:d} {frame_type} frames: {frame_count:d}"
label_string = "date time , frm, freq off, err, h, seq, frame, img, c, Vx, Vy, Vz, Ix, Iy, Iz, Vb, Ib "
label_string_html = label_string.replace(" ","&nbsp;")
csv_format = "{date_time:21s}, {frame_count:4d}, {frequency:10.1f}, {errors:3d}, {first_byte: 2x}, {sequence:5d}, {frame_type:9s}, {image_id:3d}, {image_count:2d}, " + \
"{Vx:5d}, {Vy:5d}, {Vz:5d}, {Ix:5d}, {Iy:5d}, {Iz:5d}, {Vb:5d}, {Ib:5d}"
telem_string = fstr(telem_string_format)
with open(html_dir + "index.html", "w+") as html_file:
html_file.write(head_string)
html_file.write(telem_string)
html_file.write(foot_string)
with open(html_dir + "images/telem.csv.txt", "w+") as csv_file:
# csv_file.write(csv_format)
csv_file.write(label_string)
csv_file.write("\n")
image_id = 256 # set illegal image ID for null # random.randint(0, 255)
image_count = 1;
# sys.exit()
if __name__ == "__main__":
debug_mode = False
counter = 1
if (len(sys.argv)) > 1:
# print("There are arguments!")
if ('d' == sys.argv[1]):
debug_mode = True
print(debug_mode)
for line in sys.stdin:
if (debug_mode):
print(line, end =" ")
logging.warning(line)
if ((line.find("data: ")) > 0):
print("\ndata block found!\n")
frame_count += 1
data_block_string = line.split()
# print(data_block_string)
frequency_string = data_block_string[2]
print(frequency_string)
frequency = float(frequency_string[:len(frequency_string) - 2])
print(frequency)
errors = int(data_block_string[5])
data_block = [int(number_string,16) for number_string in data_block_string[7:]]
first_byte = data_block[0]
if (first_byte == 0xE0) or (first_byte == 0xE1):
if (data_block[0] == 0xE0):
frame_type = "RT1+IMG1"
if (data_block[0] == 0xE1):
frame_type = "RT2+IMG2"
# print(frame_type)
print("Frame Type: {:02X}".format(data_block[0]))
print("Sat Id: {:02X}".format(data_block[1]))
print(data_block[extended + 51], data_block[extended + 50], data_block[extended + 49])
sequence = data_block[extended + 51] + data_block[extended + 50] * 2**8 + data_block[extended + 49] * 2**16
print("Sequence number: {:d}".format(sequence))
Vx = (data_block[extended + FC_EPS + 0] * 2**6) + (data_block[extended + FC_EPS + 1] >> 2)
Vy = (0x03 & data_block[extended + FC_EPS + 1]) * 2**12 + data_block[extended + FC_EPS + 2] * 2**4 + (data_block[extended + FC_EPS + 3] >> 4)
Vz = (0x0f & data_block[extended + FC_EPS + 3]) * 2**10 + data_block[extended + FC_EPS + 4] * 2**2 + (data_block[extended + FC_EPS + 5] >> 6)
Vb = (0x3f & data_block[extended + FC_EPS + 5]) * 2**8 + data_block[extended + FC_EPS + 6]
Ix = data_block[extended + FC_EPS + 7] * 2**2 + (data_block[extended + FC_EPS + 8] >> 6)
Iy = (0x3f & data_block[extended + FC_EPS + 8]) * 2**4 + (data_block[extended + FC_EPS + 9] >> 4)
Iz = (0x0f & data_block[extended + FC_EPS + 9]) * 2**6 + (data_block[extended + FC_EPS + 10] >> 2)
Ic = (0x03 & data_block[extended + FC_EPS + 10]) * 2**8 + data_block[extended + FC_EPS + 11]
Ib = data_block[extended + FC_EPS + 12] * 2**2 + ((0xc0 & data_block[extended + FC_EPS + 13]) >> 6)
if (Ib == 0):
Ib = 0 - Ic
print("Vx: {:d} mV Vy: {:d} mV Vz: {:d} mV".format(Vx, Vy, Vz))
print('Payload {:x} {:x} \n'.format(data_block[FC_PAYLOAD + extended], data_block[FC_PAYLOAD + extended + 1]))
if (data_block[FC_PAYLOAD + extended] == 0x55) and (data_block[FC_PAYLOAD + extended + 1] == 0x68):
try:
print("Writing this image payload block to file " + image + "_payload")
immutable_payload = bytes(bytearray(data_block[(FC_PAYLOAD + extended):])) # payload)
# print(immutable_payload)
with open(image_dir + image + "_payload", "wb") as binary_file:
binary_file.write(immutable_payload)
except:
print("File error")
# try:
print("Processing payload with ssdv, saving image to " + image + "_paylad.jpeg and log to ssdv_output")
system_and_print(ssdv + image_dir + image + "_payload " +
image_dir + image + "_payload.jpeg 2>&1 | sudo tee /home/pi/fctelem/ssdv_output")
print("Parsing ssdv_output")
with open("/home/pi/fctelem/ssdv_output", "r") as file:
for line in file:
# print("line:")
# print(line)
if ((line.find("mage ID:")) > 0):
# print("\nImage ID found!\n")
image_id_string = line.split()
# print(image_id_string)
new_image_id = int(image_id_string[2], 16)
# print(new_image_id)
if (new_image_id != image_id):
print("End of image")
if (image_id != 256):
print("Saving complete image")
system_and_print("cp " + html_dir + "image_file.jpeg " + html_dir + "images/" + image + str(image_id) + "." + str(image_count) + ".jpeg")
system_and_print("sudo rm " + image_dir + image)
else:
system_and_print("sudo rm " + image_dir + image)
print("New Image ID: ")
print(new_image_id)
image_id = new_image_id
image_count = 1
else:
image_count += 1
print("new image_count:")
print(image_count)
print("Appending block to file " + image)
with open(image_dir + image, "ab") as binary_file:
binary_file.write(immutable_payload)
print("Running ssdv with all blocks in file " + image + " saving as " + html_dir + "image_file.jpeg")
system_and_print(ssdv + image_dir + image + " " + html_dir + "image_file.jpeg")
telem_string = fstr(telem_string_format)
print("Writing index.html file")
with open(html_dir + "index.html", "w") as html_file:
html_file.write(head_string)
html_file.write(telem_string)
html_file.write("<br><pre>")
with open(html_dir + "/images/telem.csv.txt", "r") as csv_file:
for line in csv_file:
html_file.write(line)
html_file.write("<br>")
date_time_string = str(datetime.datetime.now())
date_time = date_time_string[:21]
tlm_string = fstr(csv_format)
html_file.write(tlm_string)
html_file.write("</pre><br>")
html_file.write(foot_string)
else:
print("Payload not an image!")
# image_id = 256 # set illegal image_id to force new image
else:
print("Unknown Sat Id or Frame")
sequence, image_id, image_count = 0, 0, 0
Vx, Vy, Vz, Vb = 0, 0, 0, 0
Ix, Iy, Iz, Ic, Ib = 0, 0, 0, 0, 0
frame_count, frame_type = 0, " "
frequency_string, errors = " ", 0
tlm_string = fstr(csv_format)
with open(html_dir + "/images/telem.csv.txt", "a") as csv_file:
csv_file.write(tlm_string)
csv_file.write("\n")

@ -0,0 +1,10 @@
[Desktop Entry]
Type=Application
Exec=/home/pi/CubeSatSim/groundstation/fctelem.sh
Name=FUNcube Telem
Comment=FUNcube Telemetry Web App
Icon=/home/pi/Icons/fc-icon.png
Path=/home/pi
Terminal=true
Categories=HamRadio
Keywords=Ham Radio;SDR

@ -0,0 +1,154 @@
#!/bin/bash
# script to run FUNcube Pi Telemetry App
echo "Script to run FUNcube CubeSatSim Telemetry"
echo
echo "The Chromium browser will load in a few seconds with fctelem."
echo "You can also use another web browser if you are on the same network as your Pi."
echo
ip=$(hostname -I|cut -f1 -d ' ')
echo "IP Address to use in web browser is: $ip:8002"
echo
ssid=$(iwgetid -r)
echo "Note: you need to be on the Wifi network: $ssid"
echo
sudo killall -9 fctelem &>/dev/null
sudo killall -9 python3 &>/dev/null
#sudo killall -9 java &>/dev/null
#sudo killall -9 rtl_fm &>/dev/null
#pkill -o chromium &>/dev/null
#sudo killall -9 rtl_tcp &>/dev/null
#sudo killall -9 CubicSDR &>/dev/null
#sudo killall -9 qsstv &>/dev/null
#sudo killall -9 aplay &>/dev/null
#sudo killall -9 direwolf &>/dev/null
#sudo killall -9 zenity &>/dev/null
#sudo systemctl stop rtl_tcp
#sudo systemctl stop openwebrx
if [[ $(/home/pi/fcdctl/fcdctl -l | grep "No FCD found") ]]; then
echo "No FUNcube Dongle Found!"
echo "Plug in FCD and try running again"
sleep 30
exit
else
echo "FCD Found! Setting Gain"
FILE=/home/pi/fctelem/fctelem.cfg
if [ -f "$FILE" ]; then
# config_string=$(</home/pi/fctelem/fctelem.cfg)
config_string=$(<$FILE)
else
echo "No fctelem.cfg file"
echo "Creating it"
config_string="-g 1 -m 1 -i 0"
echo $config_string >> FILE
fi
/home/pi/fcdctl/fcdctl $config_string
# /home/pi/fcdctl/fcdctl -g 1 -m 1 -i 0
echo
echo "You can adjust the FCD settings by running the command fcdctl/fcdctl"
echo
fi
frequency=$(zenity --timeout=10 --list 2>/dev/null --width=410 --height=180 --title="FUNcube Telem Decoding" --text="Choose the frequency for FUNcube decoding:" --column="kHz" --column="Use" 434900 "CubeSatSim" Other "Choose another frequency")
echo $frequency
if [ -z "$frequency" ]; then
echo "No choice made."
frequency=434900
fi
if [ "$frequency" = "434900" ]; then
frequency=434900000
elif [ "$frequency" = "Other" ]; then
echo
echo "Enter the frequency in kiloHertz"
echo
read -r frequency
frequency=$frequency"000"
fi
echo "Frequency is" $frequency
echo
echo "If your CubeSatSim is transmitting in FUNcube mode (mode 7) you should get some frames after 30 seconds"
echo
sleep 3
echo "connectport=64516 connectaddress='localhost' autotuneoffset=100000 outdir='/home/pi/go/app/fctelem/data' frequency=$frequency" > /home/pi/fctelem/fcdecode.conf
# FILE=/home/pi/CubeSatSim/groundstation/public_html
FILE=/home/pi/CubeSatSim/fctelem/public_html
if [ ! -d "$FILE" ]; then
echo "Making public_html directory"
mkdir /home/pi/fctelem/public_html
mkdir /home/pi/fctelem/public_html/images
fi
cd /home/pi/fctelem/public_html
cp /home/pi/CubeSatSim/groundstation/index.html .
cp /home/pi/CubeSatSim/sstv/sstv_image_1_320_x_256.jpg ./image_file.jpeg
python3 -m http.server 8002 &
setsid chromium-browser --check-for-update-interval=1 --simulate-critical-update --noerrdialogs --disable-infobars http://127.0.0.1:8002 &>/dev/null &
cd /home/pi/fctelem
sudo ./fctelem | python3 /home/pi/CubeSatSim/groundstation/fc_block_decode.py
# sleep 10
#read val
#sudo killall -9 fctelem &>/dev/null
#sudo killall -9 python3 &>/dev/null
sleep 10
#$SHELL

@ -5,6 +5,8 @@ echo "Script to change your default FoxTelem profile for FIAB v4"
echo
source /home/pi/venv/bin/activate
sudo rm /home/pi/FoxTelemetryData/.foxprofile
/home/pi/CubeSatSim/groundstation/fox-run.sh

@ -82,8 +82,8 @@ if [ ! -f "$FILE" ]; then
sudo sed -i "s/stationDetails=.*/stationDetails=FoxInABox/g" /home/pi/FoxTelemetryData/FoxTelem.properties
# sudo sed -i "s/soundCard=NONE/soundCard=RTL SDR/g" /home/pi/FoxTelemetryData/FoxTelem.properties # change to FunCube
sudo sed -i "s/soundCard=NONE/soundCard=Direct Audio Device\: FUNcube Dongle V2.0, USB Audi/g" /home/pi/FoxTelemetryData/FoxTelem.properties # change to FunCube
# sudo sed -i "s/soundCard=NONE/soundCard=RTL SDR/g" /home/pi/FoxTelemetryData/FoxTelem.properties # change to FUNcbe
sudo sed -i "s/soundCard=NONE/soundCard=Direct Audio Device\: FUNcube Dongle V2.0, USB Audi/g" /home/pi/FoxTelemetryData/FoxTelem.properties # change to FUNcube

@ -0,0 +1,171 @@
{
"bookmarkDisplayMode": 1,
"lists": {
"General": {
"bookmarks": {
"AO-73": {
"bandwidth": 5000.0,
"frequency": 145935000.0,
"mode": 4
},
"APRS Packet": {
"bandwidth": 12500.0,
"frequency": 144390000.0,
"mode": 0
},
"ATC Clearance Delivery": {
"bandwidth": 12500.0,
"frequency": 118850000.0,
"mode": 2
},
"ATC Ground East": {
"bandwidth": 12500.0,
"frequency": 121900000.0,
"mode": 2
},
"ATC Ground West": {
"bandwidth": 12500.0,
"frequency": 121650000.0,
"mode": 2
},
"ATC Local East": {
"bandwidth": 12500.0,
"frequency": 118500000.0,
"mode": 2
},
"ATC Local West": {
"bandwidth": 12500.0,
"frequency": 135100000.0,
"mode": 2
},
"CAS-4A": {
"bandwidth": 5000.0,
"frequency": 145836000.0,
"mode": 4
},
"CAS-4B": {
"bandwidth": 5000.0,
"frequency": 145893000.0,
"mode": 4
},
"CubeSatSim": {
"bandwidth": 12500.0,
"frequency": 434900000.0,
"mode": 0
},
"Ham APRS": {
"bandwidth": 12500.0,
"frequency": 144390000.0,
"mode": 2
},
"Ham Beacon PHL": {
"bandwidth": 3000.0,
"frequency": 144272000.0,
"mode": 4
},
"Ham Cherry Hill": {
"bandwidth": 201869.15625,
"frequency": 145370000.0,
"mode": 0
},
"Ham Munroe": {
"bandwidth": 12500.0,
"frequency": 145390000.0,
"mode": 0
},
"Ham Newtown": {
"bandwidth": 12500.0,
"frequency": 147060000.0,
"mode": 0
},
"Ham Paoli": {
"bandwidth": 18495.533203125,
"frequency": 145130000.0,
"mode": 0
},
"ISS": {
"bandwidth": 5000.0,
"frequency": 437800000.0,
"mode": 0
},
"ISS-SSTV": {
"bandwidth": 5000.0,
"frequency": 145800000.0,
"mode": 0
},
"NOAA Allentown": {
"bandwidth": 18495.533203125,
"frequency": 162400000.0,
"mode": 0
},
"NOAA Harrisburg": {
"bandwidth": 18495.533203125,
"frequency": 162550000.0,
"mode": 0
},
"NOAA Hiburnia Park": {
"bandwidth": 18495.533203125,
"frequency": 162425000.0,
"mode": 0
},
"NOAA PHL": {
"bandwidth": 18495.533203125,
"frequency": 162475000.0,
"mode": 0
},
"NOAA Sudlersville": {
"bandwidth": 18495.533203125,
"frequency": 162500000.0,
"mode": 0
},
"PHL": {
"bandwidth": 12500.0,
"frequency": 133275000.0,
"mode": 2
},
"PHL 2": {
"bandwidth": 12500.0,
"frequency": 133475000.0,
"mode": 2
},
"PHL 3": {
"bandwidth": 12500.0,
"frequency": 133500000.0,
"mode": 2
},
"PHL 5": {
"bandwidth": 12500.0,
"frequency": 133575000.0,
"mode": 2
},
"PHL 6": {
"bandwidth": 12500.0,
"frequency": 134600000.0,
"mode": 2
},
"PHL 7": {
"bandwidth": 12500.0,
"frequency": 135450000.0,
"mode": 2
},
"PHL 8": {
"bandwidth": 12500.0,
"frequency": 128795000.0,
"mode": 2
},
"PHL Automated": {
"bandwidth": 18495.533203125,
"frequency": 133400000.0,
"mode": 0
},
"The Roar WXVL": {
"bandwidth": 201869.15625,
"frequency": 89100000.0,
"mode": 1
}
},
"showOnWaterfall": true
}
},
"selectedList": "General"
}

@ -0,0 +1,9 @@
<HEAD><meta http-equiv="refresh" content="5"></HEAD>
<HTML>
FUNcube CubeSatSim Telemetry
<p>
<img src="image_file.jpeg">
<!--
<img src="image_file.jpeg" id="reloader" onLoad="setTimeout( () => { document.getElementById('reloader').src='image_file.jpeg' + '?' + new Date().getMilliseconds() } ,5000)" />
-->
</p>

@ -152,6 +152,7 @@ echo
echo -e "Auto decoding APRS packets on $frequency Hz"
# direwolf -r 48000 -c /home/pi/CubeSatSim/groundstation/direwolf/direwolf.conf -t 0 &
setsid direwolf -r 48000 -c /home/pi/CubeSatSim/groundstation/direwolf/direwolf.conf &
#fi

@ -53,6 +53,8 @@ sudo /etc/init.d/alsa-utils start
sudo killall -9 rtl_fm &>/dev/null
sudo killall -9 rtl_fm &>/dev/null
sudo systemctl restart openwebrx
sleep 10

@ -135,7 +135,7 @@ set -- $value
#rtl_fm -M fm -f 434.9M -s 48k | aplay -D hw:${2:0:1},0,0 -r 48000 -t raw -f S16_LE -c 1
#rtl_fm -M fm -f 434.9M -s 48k | tee >(aplay -D hw:${2:0:1},0,0 -r 48000 -t raw -f S16_LE -c 1) | aplay -D hw:0,0 -r 48000 -t raw -f S16_LE -c 1
rtl_fm -f $frequency -s 48k | tee >(aplay -D hw:${2:0:1},0,0 -r 48000 -t raw -f S16_LE -c 1) | aplay -r 48000 -t raw -f S16_LE -c 1
rtl_fm -M fm -f $frequency -s 48k | tee >(aplay -D hw:${2:0:1},0,0 -r 48000 -t raw -f S16_LE -c 1) | aplay -r 48000 -t raw -f S16_LE -c 1
rtl_fm -M fm -f $frequency -s 48k | aplay -D hw:${2:0:1},0,0 -r 48000 -t raw -f S16_LE -c 1

@ -0,0 +1,7 @@
Here is the source for the 2U Connector part: https://cad.onshape.com/documents/eecb39d3cd81220d3a56ce06/v/fdc9aca356206986ef6440e6/e/f881e9547bb3cd4fd653d041
You can export it in other formats
You will also need two additional frame sides
Here's how to upgrade a 1U CubeSatSim https://github.com/alanbjohnston/CubeSatSim/wiki/Upgrading-to-2U

@ -2,10 +2,12 @@ These are the STL files for printing the frame.
![CubeSatSim Frame v2.0](https://github.com/user-attachments/assets/bbcedd26-cc1b-488d-86fa-b6e12f46bd6a)
You will need to print two of the top/bottom, and one of each side
You will need to print two of the top/bottom, and one of each side, PLA material, 20% infill.
The source is availale at:
https://cad.onshape.com/documents/ba47819ff100597297d1d967/w/f19409ec7cd5459afb429cb9/e/a0e0cc37dee6fb879c4bcc2b
https://cad.onshape.com/documents/1515e31c7fa5f6258ef39ae7/w/36f6069826ee0c0263f8d85e/e/2b7801717a8e1af3df455057
https://cad.onshape.com/documents/188300bd4469521b14597507/w/546e1730182c1520c46b050d/e/ceef7084a00eb9b26c486bb6
To make a 2U frame, also print the 2U connector part in https://github.com/alanbjohnston/CubeSatSim/tree/master/hardware/frame/v2.0/2u and print two additional side parts. See https://github.com/alanbjohnston/CubeSatSim/wiki/Upgrading-to-2U for more information.

@ -0,0 +1,13 @@
Here is information about the CubeSatSim Lite v2 hardware
cubesatsim-Lite_2.0.1_gerbers.zip -- All gerber files used to fabricate PCBs
cubesatsim-Lite_2.0.1_schematic.pdf -- Schematic
cubesatsim-Lite_2.0.1.mnt -- SMD file
cubesatsim-lLite_2.0.1_pcb.png -- image of board
cubesatsim-Lite_2.0.1_bom.csv.txt -- Bill of Materials (BOM)
For more information see https://github.com/alanbjohnston/CubeSatSim/wiki/CubeSatSim-Lite

@ -0,0 +1,5 @@
JP1 44.68 53.87 0 JUMPER-SMT_2_NC_TRACE_SILK SMT-JUMPER_2_NC_TRACE_SILK
JP2 23.14 59.97 0 JUMPER-SMT_2_NO_SILK SMT-JUMPER_2_NO_SILK
JP3 21.74 56.03 270 JUMPER-SMT_2_NC_TRACE_SILK SMT-JUMPER_2_NC_TRACE_SILK
JP6 33.99 59.61 0 JUMPER-SMT_2_NC_TRACE_SILK SMT-JUMPER_2_NC_TRACE_SILK
JP7 16.00 63.09 90 JUMPER-SMT_2_NO_SILK SMT-JUMPER_2_NO_SILK

@ -0,0 +1,26 @@
C1 8.36 61.93 0 18pF C0603
C2 10.03 61.90 0 16pF C0603
C3 56.06 58.32 90 18pF C0603
C4 55.47 62.84 270 16pF C0603
C7 49.23 56.57 0 DNI/47uF C0603
C8 50.47 47.68 270 DNI/100nF C0603
E1 3.63 53.23 270 ANT-916-CHP-T XDCR_ANT-916-CHP-T
E2 61.39 53.21 270 ANT-916-CHP-T XDCR_ANT-916-CHP-T
J1 32.55 66.61 0 CONN_20X2 2X20
J13 9.25 45.02 180 SJ1-2503A CONN_SJ1-2503A
J14 55.07 45.08 180 SJ1-2503A CONN_SJ1-2503A
L1 9.22 59.44 180 13nH L0603
L2 56.24 60.55 270 13nH L0603
LED5 19.08 42.09 270 GREEN LED-0603
LED6 43.94 41.91 270 BLUE LED-0603
R2 46.63 62.48 180 DNI/1k R0603
R4 51.18 62.51 180 DNI/1k R0603
R10 12.70 41.91 90 DNI/1k 0603-RES
R11 51.66 41.91 90 DNI/100 0603-RES
R16 13.79 60.22 0 DNI/68 R0805
R17 18.44 60.33 270 DNI/180 R0603
R18 26.67 60.22 180 DNI/68 R0805
R21 48.90 51.23 0 DNI/100 R0603
R22 55.14 51.99 0 DNI/220 R0603
S2 7.80 51.82 90 DTSM-6 DTSM-6
U6 32.94 51.75 270 SR105U SR_FRS_0W5

@ -0,0 +1,53 @@
"Part";"Value";"Device";"Package";"Description";"";
"C1";"18pF";"CERAMIC-10PF-50V-5%-NPO(0603)";"C0603";"302010097";"";
"C2";"16pF";"CERAMIC-10PF-50V-5%-NPO(0603)";"C0603";"302010097";"";
"C3";"18pF";"CERAMIC-10PF-50V-5%-NPO(0603)";"C0603";"302010097";"";
"C4";"16pF";"CERAMIC-10PF-50V-5%-NPO(0603)";"C0603";"302010097";"";
"C5";"47uF";"CAPPTH";"CAP-PTH-SMALL";"Capacitor";"";
"C6";"100nF";"CAPPTH";"CAP-PTH-SMALL";"Capacitor";"";
"C7";"DNI/47uF";"CERAMIC-10PF-50V-5%-NPO(0603)";"C0603";"302010097";"";
"C8";"DNI/100nF";"CERAMIC-10PF-50V-5%-NPO(0603)";"C0603";"302010097";"";
"E1";"ANT-916-CHP-T";"ANT-916-CHP-T";"XDCR_ANT-916-CHP-T";"868MHz ISM, LoRa, Sensor Networks, SigFox Chip RF Antenna 863MHz ~ 873MHz 0.5dBi Solder Surface Mount Check prices";"";
"E2";"ANT-916-CHP-T";"ANT-916-CHP-T";"XDCR_ANT-916-CHP-T";"868MHz ISM, LoRa, Sensor Networks, SigFox Chip RF Antenna 863MHz ~ 873MHz 0.5dBi Solder Surface Mount Check prices";"";
"J1";"CONN_20X2";"CONN_20X2";"2X20";"Multi connection point. Often used as Generic Header-pin footprint for 0.1 inch spaced/style header connections";"";
"J2";"";"CONN_021X02_NO_SILK";"1X02_NO_SILK";"Multi connection point. Often used as Generic Header-pin footprint for 0.1 inch spaced/style header connections";"";
"J6";"Micro JST";"M02JST-PTH-VERT";"JST-2-PTH-VERT";"Standard 2-pin 0.1" header. Use with";"";
"J10";"DNI/Sparkfun QWIIC Breakout";"CONN_041X04_NO_SILK";"1X04_NO_SILK";"Multi connection point. Often used as Generic Header-pin footprint for 0.1 inch spaced/style header connections";"";
"J12";"DNI/1x4 pin header";"CONN_041X04_NO_SILK";"1X04_NO_SILK";"Multi connection point. Often used as Generic Header-pin footprint for 0.1 inch spaced/style header connections";"";
"J13";"SJ1-2503A";"SJ1-2503A";"CONN_SJ1-2503A";"";"";
"J14";"SJ1-2503A";"SJ1-2503A";"CONN_SJ1-2503A";"";"";
"J15";"";"CONN_06NO_SILK_NO_POP";"1X06_NO_SILK";"Multi connection point. Often used as Generic Header-pin footprint for 0.1 inch spaced/style header connections";"";
"JP1";"JUMPER-SMT_2_NC_TRACE_SILK";"JUMPER-SMT_2_NC_TRACE_SILK";"SMT-JUMPER_2_NC_TRACE_SILK";"Normally closed trace jumper";"";
"JP2";"JUMPER-SMT_2_NO_SILK";"JUMPER-SMT_2_NO_SILK";"SMT-JUMPER_2_NO_SILK";"Normally open jumper";"";
"JP3";"JUMPER-SMT_2_NC_TRACE_SILK";"JUMPER-SMT_2_NC_TRACE_SILK";"SMT-JUMPER_2_NC_TRACE_SILK";"Normally closed trace jumper";"";
"JP6";"JUMPER-SMT_2_NC_TRACE_SILK";"JUMPER-SMT_2_NC_TRACE_SILK";"SMT-JUMPER_2_NC_TRACE_SILK";"Normally closed trace jumper";"";
"JP7";"JUMPER-SMT_2_NO_SILK";"JUMPER-SMT_2_NO_SILK";"SMT-JUMPER_2_NO_SILK";"Normally open jumper";"";
"L1";"13nH";"SMD-FERRITE-CHIP-120-OHM-500MA(0603)";"L0603";"303030001";"";
"L2";"13nH";"SMD-FERRITE-CHIP-120-OHM-500MA(0603)";"L0603";"303030001";"";
"LED3";"Green 5mm";"LED3MM";"LED3MM";"LED";"";
"LED4";"Blue 5mm";"LED3MM";"LED3MM";"LED";"";
"LED5";"GREEN";"LED-GREEN0603";"LED-0603";"Green SMD LED";"";
"LED6";"BLUE";"LED-BLUE0603";"LED-0603";"Blue SMD LED";"";
"R1";"1K";"RESISTORPTH-1/4W-VERT";"AXIAL-0.1";"Resistor";"";
"R2";"DNI/1k";"R-EU_R0603";"R0603";"RESISTOR, European symbol";"";
"R3";"1K";"RESISTORPTH-1/4W-VERT";"AXIAL-0.1";"Resistor";"";
"R4";"DNI/1k";"R-EU_R0603";"R0603";"RESISTOR, European symbol";"";
"R7";"1k";"RESISTORPTH-1/4W-VERT";"AXIAL-0.1";"Resistor";"";
"R8";"DNI/100";"RESISTOR0603";"0603-RES";"Resistor";"";
"R10";"DNI/1k";"RESISTOR0603-RES";"0603-RES";"Resistor";"";
"R11";"100";"RESISTORPTH-1/4W-VERT";"AXIAL-0.1";"Resistor";"";
"R13";"68";"RESISTORPTH-1/4W-VERT";"AXIAL-0.1";"Resistor";"";
"R14";"180";"RESISTORPTH-1/4W-VERT";"AXIAL-0.1";"Resistor";"";
"R15";"68";"RESISTORPTH-1/4W-VERT";"AXIAL-0.1";"Resistor";"";
"R16";"DNI/68";"R-US_R0805";"R0805";"RESISTOR, American symbol";"";
"R17";"DNI/180";"SMD-RES-1.2K-1%-1/10W(0603)";"R0603";"301010206";"";
"R18";"DNI/68";"R-US_R0805";"R0805";"RESISTOR, American symbol";"";
"R19";"100";"RESISTORPTH-1/4W-VERT-KIT";"AXIAL-0.1EZ";"Resistor";"";
"R20";"220";"RESISTORPTH-1/4W-VERT-KIT";"AXIAL-0.1EZ";"Resistor";"";
"R21";"DNI/100";"SMD-RES-1.2K-1%-1/10W(0603)";"R0603";"301010206";"";
"R22";"DNI/220";"SMD-RES-1.2K-1%-1/10W(0603)";"R0603";"301010206";"";
"S1";"RA-SPST";"RA-SPST";"RA-SPST";"";"";
"S2";"DTSM-6";"DTSM-6";"DTSM-6";"";"";
"U1";"SR105U";"SR_FRS_0W5";"SR_FRS_0W5";"";"";
"X2";"SMA-VERT";"SMA-VERT";"SMA-VERT";"";"";
"X3";"SMA-VERT";"SMA-VERT";"SMA-VERT";"";"";

Binary file not shown.

After

Width:  |  Height:  |  Size: 1005 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

@ -10,4 +10,4 @@ cubesatsim-lite-0.5_pcb.png -- image of board
cubesatsim-lite-0.5.csv.txt -- Bill of Materials (BOM)
For more information see https://github.com/alanbjohnston/CubeSatSim/wiki/CubeSatSim-Lite
For more information see https://github.com/alanbjohnston/CubeSatSim/wiki/CubeSatSim-Lite-Beta-vB5

@ -1,3 +0,0 @@
JP4 12.92 79.27 180 JUMPER-SMT_2_NO_SILK SMT-JUMPER_2_NO_SILK
JP5 66.93 74.27 90 JUMPER-SMT_2_NC_TRACE_SILK SMT-JUMPER_2_NC_TRACE_SILK
JP6 17.51 69.85 180 JUMPER-SMT_2_NO_SILK SMT-JUMPER_2_NO_SILK

@ -1,11 +0,0 @@
BT1 44.48 57.58 0 1024 BAT_1024
BT2 41.27 29.90 0 1012 BAT_1012
C1 4.88 58.78 0 DNI/0.1µF 0603
J1 32.68 74.23 0 CONN_20X2 2X20
JP9 3.38 54.25 0 JUMPER-SMT_2_NC_TRACE_SILK SMT-JUMPER_2_NC_TRACE_SILK
JP10 6.71 50.72 0 JUMPER-SMT_2_NC_TRACE_SILK SMT-JUMPER_2_NC_TRACE_SILK
JP11 6.85 54.23 0 JUMPER-SMT_2_NO_SILK SMT-JUMPER_2_NO_SILK
JP12 3.31 50.70 0 JUMPER-SMT_2_NO_SILK SMT-JUMPER_2_NO_SILK
R1 17.45 69.49 0 DNI/R100 R0805
U1 12.19 67.41 180 INA219 purple board INA219
U2 4.55 62.79 0 INA219AIDR D0008A_N

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 927 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 48 KiB

@ -0,0 +1,13 @@
"Qty";"Value";"Device";"Package";"Parts";"Description";"";
"5";"";"CONN_01";"1X01";"JP2, JP3, JP7, JP13, JP14";"Single connection point. Often used as Generic Header-pin footprint for 0.1 inch spaced/style header connections";"";
"1";"1012";"1012";"BAT_1012";"BT2";"Check availability";"";
"1";"1024";"1024";"BAT_1024";"BT1";"Check availability";"";
"1";"CONN_20X2";"CONN_20X2";"2X20";"J1";"Multi connection point. Often used as Generic Header-pin footprint for 0.1 inch spaced/style header connections";"";
"1";"DNI/0.1µF";"CAP_CERAMIC0603";"0603";"C1";"Ceramic Capacitors";"";
"1";"DNI/R100";"R-US_R0805";"R0805";"R1";"RESISTOR, American symbol";"";
"1";"INA219 purple board";"INA219";"INA219";"U1";"";"";
"1";"INA219AIDR";"INA219AIDR";"D0008A_N";"U2";"";"";
"3";"JUMPER-SMT_2_NC_TRACE_SILK";"JUMPER-SMT_2_NC_TRACE_SILK";"SMT-JUMPER_2_NC_TRACE_SILK";"JP5, JP9, JP10";"Normally closed trace jumper";"";
"4";"JUMPER-SMT_2_NO_SILK";"JUMPER-SMT_2_NO_SILK";"SMT-JUMPER_2_NO_SILK";"JP4, JP6, JP11, JP12";"Normally open jumper";"";
"2";"Micro JST";"M02JST-PTH-VERT";"JST-2-PTH-VERT";"JP1, JP8";"Standard 2-pin 0.1" header. Use with";"";
"1";"PTC";"PTCPTH";"PTC";"F1";"Resettable Fuse PTC";"";

Before

Width:  |  Height:  |  Size: 37 KiB

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

@ -0,0 +1,57 @@
"Qty";"Value";"Device";"Package";"Parts";"Description";"";
"1";"";"CONN_06NO_SILK_NO_POP";"1X06_NO_SILK";"J15";"Multi connection point. Often used as Generic Header-pin footprint for 0.1 inch spaced/style header connections";"";
"1";"100";"RESISTORPTH-1/4W-VERT";"AXIAL-0.1";"R8";"Resistor";"";
"1";"100";"RESISTORPTH-1/4W-VERT-KIT";"AXIAL-0.1EZ";"R19";"Resistor";"";
"2";"100nF";"CAPPTH";"CAP-PTH-SMALL";"C6, C9";"Capacitor";"";
"1";"10K";"RESISTORPTH-1/4W-VERT";"AXIAL-0.1";"R27";"Resistor";"";
"2";"13nH";"SMD-FERRITE-CHIP-120-OHM-500MA(0603)";"L0603";"L1, L2";"303030001";"";
"2";"16pF";"CERAMIC-10PF-50V-5%-NPO(0603)";"C0603";"C2, C4";"302010097";"";
"1";"180";"RESISTORPTH-1/4W-VERT";"AXIAL-0.1";"R14";"Resistor";"";
"2";"18pF";"CERAMIC-10PF-50V-5%-NPO(0603)";"C0603";"C1, C3";"302010097";"";
"2";"1K";"RESISTORPTH-1/4W-VERT";"AXIAL-0.1";"R1, R3";"Resistor";"";
"1";"1N4148";"DIODE-D-2.5";"D-2.5";"D3";"DIODE";"";
"4";"1N5817";"DIODE-D-2.5";"D-2.5";"D1, D2, D4, D10";"DIODE";"";
"2";"1k";"RESISTORPTH-1/4W-VERT";"AXIAL-0.1";"R7, R30";"Resistor";"";
"2";"220";"RESISTORPTH-1/4W-VERT";"AXIAL-0.1";"R9, R29";"Resistor";"";
"1";"220";"RESISTORPTH-1/4W-VERT-KIT";"AXIAL-0.1EZ";"R20";"Resistor";"";
"2";"4.7k";"RESISTORPTH-1/4W-VERT";"AXIAL-0.1";"R23, R24";"Resistor";"";
"1";"47uF";"CAPPTH";"CAP-PTH-SMALL";"C5";"Capacitor";"";
"2";"68";"RESISTORPTH-1/4W-VERT";"AXIAL-0.1";"R13, R15";"Resistor";"";
"2";"ANT-916-CHP-T";"ANT-916-CHP-T";"XDCR_ANT-916-CHP-T";"E1, E2";"868MHz ISM, LoRa, Sensor Networks, SigFox Chip RF Antenna 863MHz ~ 873MHz 0.5dBi Solder Surface Mount Check prices";"";
"1";"BME280";"M04NO_SILK_ALL_ROUND";"1X04_NO_SILK_ALL_ROUND";"J5";"Header 4";"";
"1";"Blue 5mm";"LED3MM";"LED3MM";"LED4";"LED";"";
"1";"CONN_20X2";"CONN_20X2";"2X20";"J1";"Multi connection point. Often used as Generic Header-pin footprint for 0.1 inch spaced/style header connections";"";
"2";"DNI/100";"SMD-RES-1.2K-1%-1/10W(0603)";"R0603";"R11, R21";"301010206";"";
"2";"DNI/100nF";"CERAMIC-10PF-50V-5%-NPO(0603)";"C0603";"C8, C10";"302010097";"";
"1";"DNI/10k";"R-EU_R0603";"R0603";"R28";"RESISTOR, European symbol";"";
"1";"DNI/180";"SMD-RES-1.2K-1%-1/10W(0603)";"R0603";"R17";"301010206";"";
"1";"DNI/1N5817";"DIODE-D-2.5";"D-2.5";"D9";"DIODE";"";
"2";"DNI/1k";"R-EU_R0603";"R0603";"R2, R4";"RESISTOR, European symbol";"";
"2";"DNI/1k";"SMD-RES-1.2K-1%-1/10W(0603)";"R0603";"R10, R32";"301010206";"";
"1";"DNI/1x4 pin header";"CONN_041X04_NO_SILK";"1X04_NO_SILK";"J12";"Multi connection point. Often used as Generic Header-pin footprint for 0.1 inch spaced/style header connections";"";
"3";"DNI/220";"SMD-RES-1.2K-1%-1/10W(0603)";"R0603";"R12, R22, R31";"301010206";"";
"2";"DNI/4.7k";"RESISTORPTH-1/4W-VERT";"AXIAL-0.1";"R33, R34";"Resistor";"";
"2";"DNI/4.7k";"SMD-RES-1.2K-1%-1/10W(0603)";"R0603";"R25, R26";"301010206";"";
"1";"DNI/4148WS";"DIODESOD-323F";"SOD-323F";"D7";"Diode";"";
"1";"DNI/47uF";"CERAMIC-10PF-50V-5%-NPO(0603)";"C0603";"C7";"302010097";"";
"2";"DNI/5.1k";"R-EU_R0603";"R0603";"R5, R6";"RESISTOR, European symbol";"";
"1";"DNI/5V1 Zener 1W";"ZENER-DIODEZD-2.5";"ZDIO-2.5";"D8";"Z-Diode";"";
"2";"DNI/68";"R-US_R0805";"R0805";"R16, R18";"RESISTOR, American symbol";"";
"3";"DNI/B5817WS";"DIODESOD-323F";"SOD-323F";"D5, D6, D11";"Diode";"";
"1";"DNI/Sparkfun QWIIC Breakout";"CONN_041X04_NO_SILK";"1X04_NO_SILK";"J10";"Multi connection point. Often used as Generic Header-pin footprint for 0.1 inch spaced/style header connections";"";
"1";"DNI/USB4105-GF-A or GT-USB-7010B";"USB_C_2-LAYER_PADS";"USB-C-16P-2LAYER-PADS";"J9";"USB Type C 16Pin Connector";"";
"1";"Green 5mm";"LED3MM";"LED3MM";"LED3";"LED";"";
"3";"JUMPER-SMT_2_NC_TRACE_SILK";"JUMPER-SMT_2_NC_TRACE_SILK";"SMT-JUMPER_2_NC_TRACE_SILK";"JP3, JP4, JP6";"Normally closed trace jumper";"";
"7";"JUMPER-SMT_2_NO_SILK";"JUMPER-SMT_2_NO_SILK";"SMT-JUMPER_2_NO_SILK";"JP1, JP2, JP5, JP7, JP8, JP9, JP10";"Normally open jumper";"";
"1";"MPU6050";"M08NO_SILK_FEMALE_PTH";"1X08_NO_SILK@1";"J4";"Header 8";"";
"2";"Micro JST";"M02JST-PTH-VERT";"JST-2-PTH-VERT";"J6, J7";"Standard 2-pin 0.1" header. Use with";"";
"1";"RA-SPST";"RA-SPST";"RA-SPST";"S1";"";"";
"1";"Raspberry Pi Pico";"RASPBERRY_PICO-NO_DEBUG";"PICO-PKG-NO_DEBUG";"U1";"";"";
"1";"Red 5mm";"LED3MM";"LED3MM";"LED5";"LED";"";
"1";"SC1464-ND";"PG203J";"PG203J";"X1";"MIC/HEADPHONE JACK";"";
"2";"SJ1-2503A";"SJ1-2503A";"CONN_SJ1-2503A";"J13, J14";"";"";
"2";"SMA-VERT";"SMA-VERT";"SMA-VERT";"X2, X3";"";"";
"1";"SR105U";"SR_FRS_0W5";"SR_FRS_0W5";"U6";"";"";
"1";"Sparkfun USB-C Breakout";"CONN_06NO_SILK_FEMALE_PTH";"1X06_NO_SILK";"J8";"Multi connection point. Often used as Generic Header-pin footprint for 0.1 inch spaced/style header connections";"";
"1";"White 5mm";"LED3MM";"LED3MM";"LED1";"LED";"";
"1";"Yellow 5mm";"LED3MM";"LED3MM";"LED2";"LED";"";

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 133 KiB

@ -1,18 +0,0 @@
D1 63.55 60.58 0 1N5817 D-2.5
D2 72.01 10.49 0 1N5817 D-2.5
D3 66.45 10.62 180 1N4148 D-2.5
D4 63.65 54.61 0 1N5817 D-2.5
D8 59.31 7.52 270 DNI/5V1 Zener 1W ZDIO-2.5
D9 19.71 45.92 0 DNI/1N5817 D-2.5
D10 77.50 10.46 0 1N5817 D-2.5
JP1 72.17 8.66 180 JUMPER-SMT_2_NO_SILK SMT-JUMPER_2_NO_SILK
JP2 24.73 59.61 0 JUMPER-SMT_2_NO_SILK SMT-JUMPER_2_NO_SILK
JP3 19.63 58.93 270 JUMPER-SMT_2_NC_TRACE_SILK SMT-JUMPER_2_NC_TRACE_SILK
JP4 51.94 53.34 180 JUMPER-SMT_2_NC_TRACE_SILK SMT-JUMPER_2_NC_TRACE_SILK
JP5 75.08 56.49 270 JUMPER-SMT_2_NO_SILK SMT-JUMPER_2_NO_SILK
JP6 26.31 37.01 180 JUMPER-SMT_2_NC_TRACE_SILK SMT-JUMPER_2_NC_TRACE_SILK
JP7 15.95 61.99 90 JUMPER-SMT_2_NO_SILK SMT-JUMPER_2_NO_SILK
JP8 37.93 40.67 180 JUMPER-SMT_2_NO_SILK SMT-JUMPER_2_NO_SILK
JP9 45.17 51.10 180 JUMPER-SMT_2_NO_SILK SMT-JUMPER_2_NO_SILK
JP10 63.64 56.54 0 JUMPER-SMT_2_NO_SILK SMT-JUMPER_2_NO_SILK
X1 71.86 61.21 270 SC1464-ND PG203J

Binary file not shown.

Before

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 132 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 MiB

@ -0,0 +1,17 @@
"Qty";"Value";"Device";"Package";"Parts";"Description";"COPYRIGHT";"DIGI-KEY_PART_NUMBER_1";"DIGI-KEY_PART_NUMBER_2";"DIGI-KEY_PART_NUMBER_3";"DIGI-KEY_PART_NUMBER_4";"MANUFACTURER_PART_NUMBER";"MFR_NAME";"PROD_ID";"REFDES";"TYPE";"VALUE";
"2";"";"CONN_01PTH_NO_SILK_YES_STOP";"1X01_NO_SILK";"JP16, JP19";"Single connection point. Often used as Generic Header-pin footprint for 0.1 inch spaced/style header connections";"";"";"";"";"";"";"";"";"";"";"";
"6";"0.1µF";"CAP_CERAMIC0603";"0603";"C2, C3, C4, C5, C6, C7";"Ceramic Capacitors";"";"";"";"";"";"";"";"";"";"";"";
"6";"1A/23V/620mV";"DIODE-SCHOTTKY-BAT20J";"SOD-323";"D7, D8, D9, D10, D11, D12";"Schottky diode";"";"";"";"";"";"";"";"DIO-11623";"";"";"1A/23V/620mV";
"6";"1N5817";"DIODE-D-2.5";"D-2.5";"D1, D2, D3, D4, D5, D6";"DIODE";"";"";"";"";"";"";"";"";"";"";"";
"2";"4.7k";"RESISTORPTH-1/4W-VERT-KIT";"AXIAL-0.1EZ";"R3, R4";"Resistor";"";"";"";"";"";"";"";"";"";"";"";
"1";"CONN_20X2";"CONN_20X2";"2X20";"J1";"Multi connection point. Often used as Generic Header-pin footprint for 0.1 inch spaced/style header connections";"";"";"";"";"";"";"";"";"";"";"";
"2";"DNI-4.7k";"R-US_R0603";"R0603";"R11, R12";"RESISTOR, American symbol";"";"";"";"";"";"";"";"";"";"";"";
"2";"DNI-4.7k";"RESISTORPTH-1/4W-VERT-KIT";"AXIAL-0.1EZ";"R7, R8";"Resistor";"";"";"";"";"";"";"";"";"";"";"";
"1";"DNI/Sparkfun QWIIC Breakout";"CONN_041X04_NO_SILK";"1X04_NO_SILK";"J5";"Multi connection point. Often used as Generic Header-pin footprint for 0.1 inch spaced/style header connections";"";"";"";"";"";"";"";"CONN-09696";"";"";"";
"6";"INA219 purple board";"INA219";"INA219";"U3, U4, U5, U6, U7, U8";"";"";"";"";"";"";"";"";"";"";"";"";
"6";"INA219AIDR";"INA219AIDR";"D0008A_N";"U2, U10, U11, U12, U13, U14";"";"Copyright (C) 2022 Ultra Librarian. All rights reserved.";"296-23978-1-ND";"296-23978-2-ND";"296-23978-6-ND";"2156-INA219AIDR-ND";"INA219AIDR";"Texas Instruments";"";"RefDes";"TYPE";"";
"1";"JUMPER-SMT_2_NO_SILK";"JUMPER-SMT_2_NO_SILK";"SMT-JUMPER_2_NO_SILK";"JP18";"Normally open jumper";"";"";"";"";"";"";"";"";"";"";"";
"1";"Micro JST";"CONN_021X02_NO_SILK";"1X02_NO_SILK";"JP8";"Multi connection point. Often used as Generic Header-pin footprint for 0.1 inch spaced/style header connections";"";"";"";"";"";"";"";"";"";"";"";
"14";"Micro JST";"M02JST-PTH-VERT";"JST-2-PTH-VERT";"JP1, JP2, JP3, JP4, JP5, JP6, JP7, JP10, JP11, JP12, JP13, JP14, JP15, JP17";"Standard 2-pin 0.1" header. Use with";"";"";"";"";"";"";"";"";"";"";"";
"6";"R100";"R-US_R0805";"R0805";"R1, R2, R5, R6, R9, R10";"RESISTOR, American symbol";"";"";"";"";"";"";"";"";"";"";"";
"1";"VDD-EN";"JUMPER-SMT_2_NC_TRACE_SILK";"SMT-JUMPER_2_NC_TRACE_SILK";"JP9";"Normally closed trace jumper";"";"";"";"";"";"";"";"";"";"";"";

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 102 KiB

After

Width:  |  Height:  |  Size: 102 KiB

@ -12,12 +12,12 @@
"JP6";"JUMPER-SMT_2_NO_SILK";"JUMPER-SMT_2_NO_SILK";"SMT-JUMPER_2_NO_SILK";"Normally open jumper";"";
"JP7";"";"CONN_01";"1X01";"Single connection point. Often used as Generic Header-pin footprint for 0.1 inch spaced/style header connections";"";
"JP8";"Micro JST";"M02JST-PTH-VERT";"JST-2-PTH-VERT";"Standard 2-pin 0.1" header. Use with";"";
"JP9";"JUMPER-SMT_2_NC_TRACE_SILK";"JUMPER-SMT_2_NC_TRACE_SILK";"SMT-JUMPER_2_NC_TRACE_SILK";"Normally closed trace jumper";"";
"JP10";"JUMPER-SMT_2_NC_TRACE_SILK";"JUMPER-SMT_2_NC_TRACE_SILK";"SMT-JUMPER_2_NC_TRACE_SILK";"Normally closed trace jumper";"";
"JP11";"JUMPER-SMT_2_NO_SILK";"JUMPER-SMT_2_NO_SILK";"SMT-JUMPER_2_NO_SILK";"Normally open jumper";"";
"JP12";"JUMPER-SMT_2_NO_SILK";"JUMPER-SMT_2_NO_SILK";"SMT-JUMPER_2_NO_SILK";"Normally open jumper";"";
"JP13";"";"CONN_01";"1X01";"Single connection point. Often used as Generic Header-pin footprint for 0.1 inch spaced/style header connections";"";
"JP14";"";"CONN_01";"1X01";"Single connection point. Often used as Generic Header-pin footprint for 0.1 inch spaced/style header connections";"";
"R1";"DNI/R100";"R-US_R0805";"R0805";"RESISTOR, American symbol";"";
"R2";"10k";"R-EU_R0603";"R0603";"RESISTOR, European symbol";"";
"R3";"10k";"R-EU_R0603";"R0603";"RESISTOR, European symbol";"";
"U1";"INA219 purple board";"INA219";"INA219";"";"";
"U2";"INA219AIDR";"INA219AIDR";"D0008A_N";"";"";

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1022 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 917 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

@ -0,0 +1,18 @@
D1 63.55 60.58 0 BYW27-400 D-2.5
D2 72.01 10.49 0 1N5817 D-2.5
D3 66.45 10.62 180 1N4148 D-2.5
D8 59.31 7.52 270 DNI/5V1 Zener 1W ZDIO-2.5
D10 77.50 10.46 0 1N5817 D-2.5
JP1 72.17 8.66 180 JUMPER-SMT_2_NO_SILK SMT-JUMPER_2_NO_SILK
JP2 24.73 60.99 0 JUMPER-SMT_2_NO_SILK SMT-JUMPER_2_NO_SILK
JP3 16.08 58.12 270 JUMPER-SMT_2_NC_TRACE_SILK SMT-JUMPER_2_NC_TRACE_SILK
JP4 59.36 56.39 180 JUMPER-SMT_2_NC_TRACE_SILK SMT-JUMPER_2_NC_TRACE_SILK
JP5 75.08 56.48 270 JUMPER-SMT_2_NO_SILK SMT-JUMPER_2_NO_SILK
JP6 26.21 35.94 180 JUMPER-SMT_2_NC_TRACE_SILK SMT-JUMPER_2_NC_TRACE_SILK
JP7 15.95 62.24 90 JUMPER-SMT_2_NO_SILK SMT-JUMPER_2_NO_SILK
JP8 47.28 30.91 180 JUMPER-SMT_2_NO_SILK SMT-JUMPER_2_NO_SILK
JP9 44.21 61.82 180 JUMPER-SMT_2_NO_SILK SMT-JUMPER_2_NO_SILK
JP10 63.61 56.54 0 JUMPER-SMT_2_NO_SILK SMT-JUMPER_2_NO_SILK
JP11 14.63 52.17 180 JUMPER-SMT_2_NC_TRACE_SILK SMT-JUMPER_2_NC_TRACE_SILK
U7 36.42 49.89 0 DRA818V DORJI_DRA818V
X1 71.86 61.21 270 SC1464-ND PG203J

@ -5,12 +5,12 @@ C4 20.68 10.16 180 16pF C0603
C7 55.60 56.62 0 DNI/47uF C0603
C8 59.00 47.55 270 DNI/100nF C0603
C10 66.83 3.91 270 DNI/100nF C0603
D5 63.53 62.56 180 DNI/B5817WS SOD-323F
D5 63.42 62.53 0 DNI/1N4007FL SOD-123FL
D6 72.16 8.69 180 DNI/B5817WS SOD-323F
D7 66.47 8.84 0 DNI/4148WS SOD-323F
D11 63.65 56.59 180 DNI/B5817WS SOD-323F
E1 6.80 76.35 180 ANT-916-CHP-T XDCR_ANT-916-CHP-T
E2 19.18 3.81 0 ANT-916-CHP-T XDCR_ANT-916-CHP-T
F2 63.68 57.18 180 DNI/MF-FSML100/8-2 0603
J1 32.55 66.61 0 CONN_20X2 2X20
J8 36.17 72.01 0 Sparkfun USB-C Breakout 1X06_NO_SILK
J9 36.35 74.15 180 DNI/USB4105-GF-A or GT-USB-7010B USB-C-16P-2LAYER-PADS

@ -9,19 +9,18 @@
"C8";"DNI/100nF";"CERAMIC-10PF-50V-5%-NPO(0603)";"C0603";"302010097";"";
"C9";"100nF";"CAPPTH";"CAP-PTH-SMALL";"Capacitor";"";
"C10";"DNI/100nF";"CERAMIC-10PF-50V-5%-NPO(0603)";"C0603";"302010097";"";
"D1";"1N5817";"DIODE-D-2.5";"D-2.5";"DIODE";"";
"D1";"BYW27-400";"DIODE-D-2.5";"D-2.5";"DIODE";"";
"D2";"1N5817";"DIODE-D-2.5";"D-2.5";"DIODE";"";
"D3";"1N4148";"DIODE-D-2.5";"D-2.5";"DIODE";"";
"D4";"1N5817";"DIODE-D-2.5";"D-2.5";"DIODE";"";
"D5";"DNI/B5817WS";"DIODESOD-323F";"SOD-323F";"Diode";"";
"D5";"DNI/1N4007FL";"DIODE_SOD-123FL";"SOD-123FL";"Diode";"";
"D6";"DNI/B5817WS";"DIODESOD-323F";"SOD-323F";"Diode";"";
"D7";"DNI/4148WS";"DIODESOD-323F";"SOD-323F";"Diode";"";
"D8";"DNI/5V1 Zener 1W";"ZENER-DIODEZD-2.5";"ZDIO-2.5";"Z-Diode";"";
"D9";"DNI/1N5817";"DIODE-D-2.5";"D-2.5";"DIODE";"";
"D10";"1N5817";"DIODE-D-2.5";"D-2.5";"DIODE";"";
"D11";"DNI/B5817WS";"DIODESOD-323F";"SOD-323F";"Diode";"";
"E1";"ANT-916-CHP-T";"ANT-916-CHP-T";"XDCR_ANT-916-CHP-T";"868MHz ISM, LoRa, Sensor Networks, SigFox Chip RF Antenna 863MHz ~ 873MHz 0.5dBi Solder Surface Mount Check prices";"";
"E2";"ANT-916-CHP-T";"ANT-916-CHP-T";"XDCR_ANT-916-CHP-T";"868MHz ISM, LoRa, Sensor Networks, SigFox Chip RF Antenna 863MHz ~ 873MHz 0.5dBi Solder Surface Mount Check prices";"";
"F1";"RHEF100-2";"PTCPTH";"PTC";"Resettable Fuse PTC";"";
"F2";"DNI/MF-FSML100/8-2";"PTC0603";"0603";"Resettable Fuse PTC";"";
"J1";"CONN_20X2";"CONN_20X2";"2X20";"Multi connection point. Often used as Generic Header-pin footprint for 0.1 inch spaced/style header connections";"";
"J4";"MPU6050";"M08NO_SILK_FEMALE_PTH";"1X08_NO_SILK@1";"Header 8";"";
"J5";"BME280";"M04NO_SILK_ALL_ROUND";"1X04_NO_SILK_ALL_ROUND";"Header 4";"";
@ -44,10 +43,11 @@
"JP8";"JUMPER-SMT_2_NO_SILK";"JUMPER-SMT_2_NO_SILK";"SMT-JUMPER_2_NO_SILK";"Normally open jumper";"";
"JP9";"JUMPER-SMT_2_NO_SILK";"JUMPER-SMT_2_NO_SILK";"SMT-JUMPER_2_NO_SILK";"Normally open jumper";"";
"JP10";"JUMPER-SMT_2_NO_SILK";"JUMPER-SMT_2_NO_SILK";"SMT-JUMPER_2_NO_SILK";"Normally open jumper";"";
"JP11";"JUMPER-SMT_2_NC_TRACE_SILK";"JUMPER-SMT_2_NC_TRACE_SILK";"SMT-JUMPER_2_NC_TRACE_SILK";"Normally closed trace jumper";"";
"L1";"13nH";"SMD-FERRITE-CHIP-120-OHM-500MA(0603)";"L0603";"303030001";"";
"L2";"13nH";"SMD-FERRITE-CHIP-120-OHM-500MA(0603)";"L0603";"303030001";"";
"LED1";"Yellow 5mm";"LED3MM";"LED3MM";"LED";"";
"LED2";"White 5mm";"LED3MM";"LED3MM";"LED";"";
"LED1";"White 5mm";"LED3MM";"LED3MM";"LED";"";
"LED2";"Yellow 5mm";"LED3MM";"LED3MM";"LED";"";
"LED3";"Green 5mm";"LED3MM";"LED3MM";"LED";"";
"LED4";"Blue 5mm";"LED3MM";"LED3MM";"LED";"";
"LED5";"Red 5mm";"LED3MM";"LED3MM";"LED";"";
@ -88,6 +88,7 @@
"S1";"RA-SPST";"RA-SPST";"RA-SPST";"";"";
"U1";"Raspberry Pi Pico";"RASPBERRY_PICO-NO_DEBUG";"PICO-PKG-NO_DEBUG";"";"";
"U6";"SR105U";"SR_FRS_0W5";"SR_FRS_0W5";"";"";
"U7";"DRA818V";"DRA818V";"DORJI_DRA818V";"Check availability";"";
"X1";"SC1464-ND";"PG203J";"PG203J";"MIC/HEADPHONE JACK";"";
"X2";"SMA-VERT";"SMA-VERT";"SMA-VERT";"";"";
"X3";"SMA-VERT";"SMA-VERT";"SMA-VERT";"";"";

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 MiB

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save

Powered by TurnKey Linux.