Wednesday, September 21, 2022

Bread Board PBX (BB_PBX)

I have been experimenting with the construction of a simple telephone Private Branch Exchange (PBX) using ready made telephony, audio WAV/MP3 players,and DTMF decoder modules built on a set of bread boards. You could probably buy a small PBX but what is more fun than building your own and writing the software to drive it?

The modules are connected to a Micromite PIC32 microcontroller that is running an embedded BASIC called MMBasic. I am using the 28 Pin PIC32 Micromite. I am very amazed by it capabilities.

To make it easier to develop on the BB_PBX I have a ESP8266 D1 Mini connected to the serial console of the PIC32 and am running ESP-LINK: Wifi-Serial Bridge firmware. This allows me to telnet to the BB_PBX and use the built-in editor on the Micromite to edit the code on my PC.



I don't have much working yet but I have developed most of the BASIC subroutines to make it work. I have exercised the ringing and control of the telephony modules, pulse dialing, and control of the SDCard audio player.

See my github for more detail on the code and modules



Monday, December 6, 2021

Simple Analog Servo Loop

 I am working on a simple proportional servo loop using a 741 Op Amp and a complimentary pair of transistors TIP41 & TIP42.  This circuit and hardware was inspired by n3ox and his web post.




I am using the AdaFruit TT motor --> HERE tied into a ~ 1:3 LEGO gear reduction box that drives the motor position potentiomter.

So far, this is just proportional control but I intent to expand it to full PID.

I have been experimenting with the proportional gain between 5 and 10, higher than that it gets unstable. I am having an issue with very slow changes were it stops moving even if I increase the position pot R1 to a much greater value. Bumping the drive system gets it to correct, so I don't know if this is a stall issue or a "dead spot" condition with the DC motor. I am just using single turn pots that do have a bit of drag and low resolution, I will be switching them out soon with 10-turn units next.



73

Sunday, June 27, 2021

Receiving ISS SSTV Images from the ISS

ARISS "Amateur radio on Shuttle, Mir and ISS" SSTV event - June 21-26


Myself and several of the folks on our High Altitude Balloon Group copied almost all 12 images that were sent this week. Just a ground plane antenna or even a HT with a rubber duckie could copy the transmissions in most cases.



Monday, December 9, 2019

1802 Membership Card - Loader

I can now load anything into my "all memory" 1802 Membership Card. I located this fine work by Don Meyer on his loader built using an Arduino HERE.

I had everything I needed for this build except the MCP23017 Port Expander chip (Adafruit PRODUCT ID: 732).

I am using a Teensy 2.0 as a USB to Serial adapter to connect to the 1802 Membership Card serial port. The example sketch to perform this function is included with the Teensy 2.0 and under File>Examples>Teensy>USB_Serial>USBtoSerial in the Arduino IDE software.


I am now successfully running the Super Monitor and BASIC3 with no issues using the bin file here --> http://www.sunrise-ev.com/MembershipCard/MCSMP20B.bin via the Serial port on the 1802 Membership card.

Monday, October 21, 2019

1802 Membership Card (For me and you and the 1802)

I built the 1802 Membership Card this weekend and had a blast playing around with it.



It has been 4 decades since I ran code on this processor. Lee Hart has done a great job with this kit.
Next step is to go beyond the "blink" Q hello world and get a Monitor and Tiny Basic running over the serial port.

Monday, March 25, 2019

Balloon Payload Package

I have been working on another balloon payload package. This time it will be based on a TeensyLC MCU and transmit on HF radio using the 10 meter band with telemetry encoded with FT8. I am just getting the basic design worked out now but my working code is uploaded to GitHub HERE.

I spent a bit of time figuring out how to generate a 10 digit Maidenhead Grid value. The details of the Maidenhead Grid system on THIS GitHub page were very helpful. My Maidenhead Grid code can be directly accessed HERE.

I hope to do testing with the payload package with a kite and then a balloon launch by summer.

Saturday, December 1, 2018

WSPR Weather Telemetry Beacon

Over the past few months I have been working on a simple weather station to transmit temperature and humidity data via HF Radio. I am using components I already had like an Arduino UNO, serial GPS, Adafruit Si5351 clock, etc.

The first version used JT65 and the JTEncode library with the telemetry encoded into the 13 character message field but I later decided to use WSPR after discovering a telemetry method described HERE and HERE. The key take away for me was the use of call signs starting with zero "0" or "Q". Since I just need to send temperature and humidity I will not be using the suggested more complex encoding method.

Normal WSPR Frame is:

<call sign> <grid> <dbm>

Example:

WA6PZB DM03 13          

My Telemetry Frame is :

<0A0hhh> <Rttt> <dbm>

Example:

0A0CEF RR20 13


I will fix the prefix of the call sign field to 0A0 (you could change the last digit for more channels if needed) then use the next three characters of the call sign for humidity and use the grid field for temperature. The data values will have only 3 significant figures and will be multiplied by 10 to remove the decimal point.

Humidity is encoded with the letters A to Z (A=1,B=2,C=3...,Z=0),  here are a few examples:

35.6 % = times 10 = 356 = CEF   full call sign becomes --> 0A0CEF
50.0% = times 10 = 500 = EZZ    full call sign becomes --> 0A0EZZ
80.3% = times 10 = 803 = HZC    full call sign becomes --> 0A0HZC

Temperature (in Celsius) is encoded with the first two digits using the numbers of the grid and the last digit as letters A to R (A=1, B=2,C=3..., R=0) as the second letter of the grid with the first letter fixed to  "R" since it is not needed , here are a few examples:

19.4 C = times 10 = 194 = D19    full grid becomes --> RD19
20.0 C = times 10 = 200 = R20    full grid becomes --> RR20
23.5 C = times 10 = 235 = E23    full grid becomes --> RE23


The full weather report will be two WSPR transmissions. The first is a normal message (for Identification) followed by the telemetry frame:

0200 7.040165 WA6PZB DM03 13        <-- Identification
0204 7.040165 0A0CEF  RR20 13         <-- Telemetry channel 0

This data can be extracted from the WSJT-X application log directory in the file WSPR_ALL.txt

As mentioned above you could have multiple telemetry channels and as long as you ID every 10 minutes you could fit several more channels. For example:

0200 7.040165 WA6PZB DM03 13 
0204 7.040165 0A0CEF  RR20 13        <-- Channel 0
0206 7.040165 0A1EZZ  RD19 13        <-- Channel 1
0208 7.040165 0A2HZC  RE23 13        <-- Channel 2

Hardware Description

The hardware consists of the Arduino UNO connected to a serial GPS receiver, an Si7021 temperature and humidity sensor and a Si5351 clock generator. The Si5351 generates approximate 10 mW to 20mW and when connected to a Low Pass Filter (LPF) like THIS it will produce a clean signal that can be heard for thousands of miles with a decent antenna. I originally tried a basic DHT11 temperature and humidity sensor but the libraries conflicted with the Si5351 library. The Si7021 sensor is more accurate and works well with the Si5351 and is on the same I2C bus since the default addresses are different.



Software Description

As normal the software took a bit longer. This projects uses multiple libraries and would not be possible without all those great people that built them for us to use (I am just standing on the shoulders of giants!). I am using TinyGPS which makes working with GPS strings simple and of course JTEncode to generate the WSPR messages. I did encounter some issues with decoding my early JT65 messages and came across KJ6FO's blog HERE that fixed my issue (and hair pulling) so I carried that over to the WSPR code as well. Basically I read the GPS and wait for the top of the hour, 10, 20, 30, 40, and 50 minutes past the hour and send my identification WSPR frame followed by my Telemetry frame. The code is far from optimized but it is working for me. I need to make some minor timing adjustments for the start of the first frame and between frames because I actually start processing before the actual times so that the time spent on checking the time and getting the sensor readings give me the lead time to end as close as I can to the exact second (we need to be within +/- 2 seconds).

My version 1.0 code is on Github -->  HERE. I included as many comments as possible to help me and anyone else working with it. I ran this with the Arduino 1.8.0 IDE along with the needed libraries. Just the call sign and grid will need to be changed to use it with the same hardware.