2021-11-09 12:40:30
Notes on kits: https://www.hamradiosecrets.com/ham-radio-kits.html
DORJI
https://www.tindie.com/products/dorji_com/ham-amateur-radio-module-dra818v/
http://squirrelengineering.com/arduino/dra818v-aprs-144-390mhz/
https://hamgear.wordpress.com/2015/02/03/make-your-own-transceiver-with-a-dorji-dra818u-or-dra818v/
https://nescitech.org/ham-exam-contact-us/
QRP Labs device for $60: https://hackaday.com/2021/12/08/four-band-digital-hf-sdr-transceiver-offers-high-performance-for-only-60/
Github repo for micromodem: https://github.com/markqvist/MicroModem
Key diagram for circuit: https://github.com/markqvist/MicroModem/blob/master/Documentation/Quickstart.pdf
http://www.mobilinkd.com/2014/09/11/arduino-kiss-tnc/
Uses the Sparkfun 3.5 mm jack breakout:
http://www.mobilinkd.com/wp-content/uploads/2014/09/Breadboard-TNC_bb_2.png
Sleeve is ground.
Ring2 is audio out (TX)
Ring1 is PTT
Tip is audio in (RX)
use Example3_GetPosition from UBLOX GNSS Sparkfun lib https://github.com/sparkfun/SparkFun_u-blox_GNSS_Arduino_Library/archive/main.zip
Hmm ... module requires 3V ...
might need to try arduino pro mini 3V if avail ... or 5V tolerant gps module (adafruit's?)
https://github.com/barisdinc/LibAPRS_Tracker
https://github.com/markqvist/LibAPRS
This is the code for handling APRS, allows for serial commands -- pin hardware might be fixed in firmware, not an issue
Expects to be run at 5V ... will need level shifters for ESP32, likely
https://oh2lak.blogspot.com/2017/06/experimenting-with-sa818-miniature-rf.html
https://www.youtube.com/@HB9BLA
https://www.kenwood.com/i/products/info/amateur/ts50s.html
https://www.radiomods.co.nz/kenwood/kenwoodts50.html
suggests we want an AT50 tuner
Kenwood TS-50S instruction manual
Power supply is Kenwood PS-33:
Possible compatibility? plug on amazon
Wiring diagram for TS-50S power cable
'what to do when the phones go down' video
web sdr / software-only here
off-grid basic receive with simple radio, unlicensed here
js8call training edition here
Virtual Audio Cable for linux here
Ham It Up adapter kit for sdr here
ham it up, by itself here
ham it up kit working well here
For those having trouble with the Ham It Up, this may be obvious to some, but frequencies below 14 MHz (20m HAM band) are best received at night. During the daytime you have a good chance of getting transmissions above 14 MHz. Also, I have tried using the Ham It Up in Windows 10 with SDR# and Kali Linux with SDR++. By far, the Kali setup works the best. I don't think you necessarily need the Kali Distro, that is just my setup. I will admit that the time investment needed to get this bundle operational is higher but if you do the research and don't give up the payoff is great.
The Ham It Up is a neat unit, but is genuinely hard to get started with due to wholly insufficient documentation. I was ready to write it off as junk before I finally figured out its antenna needs. Here is what you need to know from my hours of frustration:
Tecsun PL880 shortwave radio, $169
-- on amazon
SIHUADON R108 -- inexpensive knock-off of Skywave, $50
off-grid js8call setup with digital-only radio
So -- better to use an sdr dongle, or a full short wave radio?
js8call here
T-Deck pinmap here
fdisk erase partitions tutorial
pi + baofeng aprs digipeater here
T-beam + external keyboard tutorial here and thread here
Using the 'canned message' meshtastic feature here
and the CardKB device described here
programming the CardKB here
documentation for CardKB i2c code here
electronoobs keyboard here -- this is the tutorial to try
antenna upgrades for meshtastic devices here
arduino as i2c slave here and here
using cardkb in a hack way with python
suggestion of mouse buttons for key buttons
connecting cardkb to raspberry pi here
Some example code for reading from a cardkb here
Creating an arduino i2c slave here -- see example 2. Arduino I2C Slave Transmitter Example
/*
* LAB Name: Arduino I2C Slave(Tx)
* Author: Khaled Magdy
* For More Info Visit: www.DeepBlueMbedded.com
*/
#include <Wire.h>
#define BTN0_PIN 4
#define BTN1_PIN 5
#define BTN2_PIN 6
#define BTN3_PIN 7
byte TxByte = 0;
void I2C_TxHandler(void)
{
Wire.write(TxByte);
}
void setup() {
pinMode(BTN0_PIN, INPUT_PULLUP);
pinMode(BTN1_PIN, INPUT_PULLUP);
pinMode(BTN2_PIN, INPUT_PULLUP);
pinMode(BTN3_PIN, INPUT_PULLUP);
Wire.begin(0x55); // Initialize I2C (Slave Mode: address=0x55 )
Wire.onRequest(I2C_TxHandler);
}
void loop() {
byte BtnsData = 0;
BtnsData |= digitalRead(BTN0_PIN) << 0;
BtnsData |= digitalRead(BTN1_PIN) << 1;
BtnsData |= digitalRead(BTN2_PIN) << 2;
BtnsData |= digitalRead(BTN3_PIN) << 3;
TxByte = BtnsData;
delay(10);
}
Ham it up explanatory video here
40 meter dipole antenna here
Creating a 40 meter antenna here
How to make a 40 meter dipole antenna here
making a 20 m and 40 m dipole antenna here
homemade balun -- SO2-39
definition of a balun here
complete off-grid HF ham pack here
js8call mesh experiment here
simplest dedicated js8call rig discussion here
heltec gps forum topic (including pins) here
flashing firmware on esp32 devices here
cli script method here
configuring device via CLI here
canned message here
proper i2c pins for heltec v3 here
heltec pinout [here](
cardkb description here
black / gnd, red / 3v, yellow sda, white scl
41 is sda, 42 is scl on heltec v3
yellow to 41, white to 42
meshtastic message history, thread here
github most recent messages issue here
semi-relevant discussion here
meshcom -- mesh for ham radio operators, compatible with aprs here
Meshtastic device configuration here
#define CARDKB_ADDR 0x5F //Define the I2C address of CardKB.
#include <Wire.h>
void setup() {
Wire.begin();
Serial.begin(9600);
}
void loop()
{
Wire.requestFrom(CARDKB_ADDR, 1); //Request 1 byte from the slave device.
while (Wire.available()) {
char c = Wire.read();
if (c != 0)
{
if (c == '\x0D') {
Serial.println();
}
else {
Serial.print(c);
}
//Serial.print(c,HEX);
}
}
}
/*
Example of processing incoming serial data without blocking.
Author: Nick Gammon
Date: 13 November 2011.
Modified: 31 August 2013.
Released for public use.
*/
#define CARDKB_ADDR 0x5F //Define the I2C address of CardKB.
#include <Wire.h>
// how much serial data we expect before a newline
const unsigned int MAX_INPUTTY = 50;
void setup ()
{
Wire.begin();
Serial.begin (115200);
Serial1.begin(38400);
} // end of setup
// here to process incoming serial data after a terminator received
void process_input_data (const char * data)
{
// for now just display it
// (but you could compare it to some value, convert to an integer, etc.)
Serial.println(data);
} // end of process_data
void process_output_data (const char * data)
{
// for now just display it
// (but you could compare it to some value, convert to an integer, etc.)
Serial1.println(data);
} // end of process_data
void processIncomingByte (const byte inByte)
{
static char input_line [MAX_INPUTTY];
static unsigned int input_pos = 0;
switch (inByte)
{
case '\n': // end of text
input_line [input_pos] = 0; // terminating null byte
// terminator reached! process input_line here ...
process_input_data (input_line);
// reset buffer for next time
input_pos = 0;
break;
case '\r': // discard carriage return
break;
default:
// keep adding if not full ... allow for terminating null byte
if (input_pos < (MAX_INPUTTY - 1))
input_line [input_pos++] = inByte;
//Serial.print(inByte);
break;
} // end of switch
} // end of processIncomingByte
//void processOutgoingByte (const byte outByte)
void processOutgoingByte (char outByte)
{
static char output_line [MAX_INPUTTY];
static unsigned int output_pos = 0;
switch (outByte)
{
case 0:
break;
case '\x0D': // end of text
output_line [output_pos] = 0; // terminating null byte
Serial.println();
// terminator reached! process input_line here ...
process_output_data (output_line);
// reset buffer for next time
output_pos = 0;
break;
//case '\r': // discard carriage return
//break;
default:
// keep adding if not full ... allow for terminating null byte
//Serial.print(outByte);
if (output_pos < (MAX_INPUTTY - 1))
output_line [output_pos++] = outByte;
Serial.print(outByte);
break;
} // end of switch
} // end of processIncomingByte
void loop()
{
// if serial data available, process it
while (Serial1.available () > 0)
processIncomingByte (Serial1.read ());
Wire.requestFrom(CARDKB_ADDR, 1); //Request 1 byte from the slave device.
while (Wire.available())
processOutgoingByte (Wire.read());
// do other stuff here like testing digital input (button presses) ...
} // end of loop
meshtastic_to_serial_cardkb
circuitpython module for waveshare e-paper here
arduino libraries for waveshare here
using cardkb in circuitpython here
cardkb layout here
better cardkb layout here
asking for enclosure with tbeam and cardkb here
up: 0xB5 down: 0xB6 left: 0xB4 right: 0xB7
wrapping text in circuitpython on a display here
RAK4631 documentation for module [here](https://docs.rakwireless.com/Product-Categories/WisBlock/RAK4631/Overview/#product-description
RAK19007 is the base I bought. RAK19007 documentation here
RAK19007 product guide here
custom nodes here
nrf52 dongle prototyping here
nrf52 variant here
another nrf52 variant board here
board with adafruit feather express here
rak IO module on digikey here
rak19007 pinout description here
using the cli to talk / hear nodes here
rxd 7 txd 47 baud 38400 mode textmsg
in arduino ide, use 'new line'
waveshare:
guide for 2.13 e ink here
same on itsy m0, but: rst d7 busy d12
arduino library for waveshare here
getting serial data on arduino without blocking here
circuitpython tips and tricks here
meshtastic-to-serial is basic working version
suggestion on reading bytes from keyboard here
rtc power switches:
waveshare documentation for rp2040-lora-hf
circuitpython for the nrf dongle!! find it here
Really nice gitlab documentation for the dongle here: https://gitlab.com/shaktiproject/software/zephyr-rtos/blob/28b2f32967c9d463a25d4a9559a7a64cd183ba14/boards/arm/nrf52840_pca10059/doc/nrf52840_pca10059.rst
old issues around the dongle and adafruit bootloader: https://github.com/adafruit/Adafruit_nRF52_Arduino/issues/200
this makes the bootloader process seem easy: https://koen.vervloesem.eu/blog/how-to-upgrade-the-adafruit-nrf52-bootloader/
THIS describes how to add the Adafruit UF2 bootloader, for sure (should compare to above): https://meshtastic.discourse.group/t/wip-diy-nrf82540-nicerf-868-4-2-inch-epaper/5552/14
Interesting device: https://wiki.aprbrother.com/en/BleUsbDongle.html#april-usb-dongle-52840
Adafruit sharp display -- some 'raw' code that isn't bit-banging: https://forum.pjrc.com/index.php?threads/adafruit-sharp-module.23852/
waveshare pi zero module 4g lte to make your own phone: https://www.amazon.com/Waveshare-SIM7600G-H-Raspberry-Supports-Positioning/dp/B08ZSSCYDD
pico 4g lte module a
building a cellular device with a pico, part 1 https://blog.smittytone.net/2021/08/20/how-to-build-a-cellular-iot-device-with-raspberry-pi-pico-part-one/
https://github.com/orgs/micropython/discussions/14356
beepberry here https://docs.m5stack.com/en/stamp/stamp_catm
Starting to try to add adafruit bootloader...
https://github.com/adafruit/Adafruit_nRF52_Bootloader
"Flashing nRF52840 USB Key bootloader": https://forums.adafruit.com/viewtopic.php?t=206837
https://www.rototron.info/circuitpython-nrf52840-dongle-openocd-pi-tutorial/
https://learn.adafruit.com/circuitpython-on-the-nrf52/nrf52840-bootloader
https://forums.adafruit.com/viewtopic.php?t=151127&start=15
pinout for jlink mini https://embeddedcomputing.weebly.com/segger-j-link-edu-mini-programmer-debugger.html
j-link user manual here
j-link hack:
followed https://learn.adafruit.com/circuitpython-on-the-nrf52/nrf52840-bootloader
installed nrfutil as per suggestion
used USB to power dongle; then hooked up SW pins as per 'j-link hack' pin assignments above
downloaded proper bootloader hex file for pca10059 from here: https://github.com/adafruit/Adafruit_nRF52_Bootloader/releases/tag/0.9.0
used commands:
nrfjprog -f nrf52 --recover
nrfjprog -f nrf52 --eraseall
nrfjprog -f nrf52 --program pca10059_bootloader-0.9.0_s140_6.1.1.hex
main guide:
https://meshtastic.discourse.group/t/wip-diy-nrf82540-nicerf-868-4-2-inch-epaper/5552/20?page=2
pca10059 e-ink variant:
// NiceRF 868 LoRa module
#define USE_SX1262
#define SX126X_CS (0 + 31) // LORA_CS P0.31
#define SX126X_DIO1 (0 + 29) // DIO1 P0.29
#define SX126X_BUSY (0 + 2) // LORA_BUSY P0.02
#define SX126X_RESET (32 + 15) // LORA_RESET P1.15
#define SX126X_TXEN (32 + 13) // TXEN P1.13 NiceRF 868 dont use
#define SX126X_RXEN (32 + 10) // RXEN P1.10 NiceRF 868 dont use
pico variant:
#define LORA_SCK 10
#define LORA_MISO 12
#define LORA_MOSI 11
#define LORA_CS 3
#define LORA_DIO0 RADIOLIB_NC
#define LORA_RESET 15
#define LORA_DIO1 20
#define LORA_DIO2 2
#define LORA_DIO3 RADIOLIB_NC
#ifdef USE_SX1262
#define SX126X_CS LORA_CS
#define SX126X_DIO1 LORA_DIO1
#define SX126X_BUSY LORA_DIO2
#define SX126X_RESET LORA_RESET
#define SX126X_DIO2_AS_RF_SWITCH
#define SX126X_DIO3_TCXO_VOLTAGE 1.8
#endif
reference for waveshare module https://www.waveshare.com/core1262-868m.htm
Was able to install CPY on dongle using UF2 here: https://circuitpython.org/board/pca10059/
building custom meshtastic firmware here
Itsy Bitsy pinout
TWC-4 assignment, using Adafruit nRF52 Feather Express:
// LEDs
#define PIN_LED1 (32 + 10) // Blue LED P1.10
#define PIN_LED2 (32 + 15) // Built in Green P1.15
// RGB NeoPixel LED2
// #define PIN_LED1 (0 + 8) Red
// #define PIN_LED1 (32 + 9) Green
// #define PIN_LED1 (0 + 12) Blue
#define LED_BUILTIN PIN_LED1
#define LED_CONN PIN_LED2
#define LED_GREEN PIN_LED1
#define LED_BLUE PIN_LED2
#define LED_STATE_ON 0 // State when LED is litted
/*
* Buttons
*/
#define PIN_BUTTON1 (32 + 2) // BTN_DN P1.02 Built in button
/*
* Analog pins
*/
#define PIN_A0 (0 + 29) // using VDIV (A6 / P0.29)
static const uint8_t A0 = PIN_A0;
#define ADC_RESOLUTION 14
// Other pins
#define PIN_AREF (-1) // AREF Not yet used
static const uint8_t AREF = PIN_AREF;
/*
* Serial interfaces
*/
#define PIN_SERIAL1_RX (0 + 24)
#define PIN_SERIAL1_TX (0 + 25)
// Connected to Jlink CDC
#define PIN_SERIAL2_RX (-1)
#define PIN_SERIAL2_TX (-1)
/*
* SPI Interfaces
*/
#define SPI_INTERFACES_COUNT 1
#define PIN_SPI_MISO (0 + 15) // MISO P0.15
#define PIN_SPI_MOSI (0 + 13) // MOSI P0.13
#define PIN_SPI_SCK (0 + 14) // SCK P0.14
static const uint8_t SS = (0 + 6); // LORA_CS P0.6
static const uint8_t MOSI = PIN_SPI_MOSI;
static const uint8_t MISO = PIN_SPI_MISO;
static const uint8_t SCK = PIN_SPI_SCK;
////#define USE_EINK
#define USE_SSD1306
/*
* Wire Interfaces
*/
#define WIRE_INTERFACES_COUNT 1
#define PIN_WIRE_SDA (0 + 12) // SDA P0.12
#define PIN_WIRE_SCL (0 + 11) // SCL P0.11
// NiceRF 868 LoRa module
#define USE_SX1262
#define USE_LLCC68
#define SX126X_CS (0 + 6) // LORA_CS P0.06
#define SX126X_DIO1 (0 + 7) // DIO1 P0.07
#define SX126X_BUSY (0 + 26) // LORA_BUSY P0.26
#define SX126X_RESET (0 + 27) // LORA_RESET P0.27
#define SX126X_DIO3_TCXO_VOLTAGE 1.8
#define PIN_GPS_EN (-1)
#define PIN_GPS_PPS (-1) // Pulse per second input from the GPS
#define GPS_RX_PIN PIN_SERIAL1_RX
#define GPS_TX_PIN PIN_SERIAL1_TX
// Battery
// The battery sense is hooked to pin A6 (0.29)
#define BATTERY_PIN PIN_A0
// and has 12 bit resolution
#define BATTERY_SENSE_RESOLUTION_BITS 12
#define BATTERY_SENSE_RESOLUTION 4096.0
#undef AREF_VOLTAGE
#define AREF_VOLTAGE 3.0
#define VBAT_AR_INTERNAL AR_INTERNAL_3_0
#define ADC_MULTIPLIER (2.0F)
NOTE: need to add these definitions for the itsybitsy meshtastic firmware (and choose free pins):
#define SX126X_TXEN (32 + 13) // TXEN P1.13 NiceRF 868 dont use
#define SX126X_RXEN (32 + 10) // RXEN P1.10 NiceRF 868 dont use
instructions for creating uf2 for nrf52 boards https://github.com/adafruit/Adafruit_nRF52_Bootloader
used
python3 uf2conv.py firmware.bin -c -b 0x26000 -f 0xADA52840
let's assign IB A2 / pin 28 -- serial.txd and assign IB A3 -- pin 31 -- serial.rxd
going to try to update bootloader on new itsybitsy board using command line process described here: https://learn.adafruit.com/introducing-the-adafruit-nrf52840-feather/update-bootloader-use-command-line
everything (no gps fix): 90 mA
remove gps: 26 mA
seems to go into state of 45 mA after a while of gps searching
keyboard seems to take about 5 mA
powering and no
25.6 without sd card, 26 with ... so sd card (not using) seems to take about .5 mA
sending lora packet gives spike of additional 55 mA
receive process seems similar (perhaps due to ack)
itsy bitsy seems to add about 10 mA
working configuration:
Meshtastic:
IB -- LoRa: as per the meshtastic firmware IB -- GPS: gps TX connects to IB RX, etc i2c pullups on oled using A2 and A3 on IB for serial mode
using an external SPI flash chip: https://learn.adafruit.com/building-circuitpython/choosing-a-different-spi-flash-chip
update: in circuitpython and in arduino, can set up sharp display on separate pins for spi bus and works fine alongside microSD
hiletgo neo 6m gps module here
waveshare sx1262 radio here
cardkb keyboard info page here
dimensions: 88545mm
grove connector on digikey here
grove connector footprint here
note: 'lay flat' grove connector is here
compass module from adafruit to add here
Adafruit 1.14" display here
Seeed info on grove connectors here
Info on right angle through-hole grove connector here
lsm303 compass fab:
.25, .4, .7 mm
waveshare sim7600 tutorial, jumpers https://core-electronics.com.au/guides/raspberry-pi-4g-gps-hat/
tutorial on AT commands https://www.industrialshields.com/blog/raspberry-pi-for-industry-26/how-to-send-and-receive-sms-with-raspberry-pi-automation-305
connecting to arduino https://www.waveshare.com/wiki/7600X_connect_Arduino
Datetime library for circuitpython https://github.com/adafruit/Adafruit_CircuitPython_datetime
Saving memory in circuitpython https://learn.adafruit.com/Memory-saving-tips-for-CircuitPython?view=all
meshtastic --set serial.enabled true --port /dev/ttyACM1 --set serial.mode TEXTMSG --set serial.rxd 31 --set serial.txd 28
This is what worked for updating the feather nrf52 express bootloader -- the command line: https://learn.adafruit.com/introducing-the-adafruit-nrf52840-feather/update-bootloader-use-command-line
GPS alternative, $11 on Amazon here:
inexpensive digital modes
https://qrper.com/2024/04/getting-started-with-hf-digital-modes-without-breaking-the-bank/