Eerste ervaringen met deze modules.

Niet nieuw, maar wel leuk. De DRA818 modules die momenteel te koop zijn en in feite een complete VHF of UHF zendontvanger herbergen. FM gemoduleerd en dus leuk om als module in embedded toepassingen te gebruiken. Voorbeelden zijn APRS, Praatpaalprater, Standby ontvanger, Echolink node of zelfs met 2 modules in te zetten als Crossband Repeater. Er zijn al de nodige blogs over geschreven waarvan deze, deze en deze interessant zijn om te lezen.

dra818De module heeft indrukwekkende specificaties en je hoeft in feite maar een paar componenten toe te voegen om er een volwaardige transceiver van te maken.
Schakelbaar vermogen 0,5 of 1 Watt en voor iets meer audio is een versterkertje met een LM386 voldoende. Misschien handiger om een low voltage uitvoering LM4871 te kiezen, want de module werkt van 3.3 – 4.7 Volt. Je kunt dus de standaard Baofeng accu’s gebruiken.
De frequentie step is 12,5 of 25 kHz en dit is tevens de bandbreedte (denk ik, maar ik heb meer de indruk dat de unit vast NFM ingesteld is).

Ik heb, omdat ik nog een ChipKIT UNO32 had liggen, snel even een shield gemaakt waar de module een plekje op heeft gevonden. Ook lag er in het bakje nog een OLED, dus we kunnen ook nog zichtbaar maken op welke frequentie we afgestemd zijn.

Als audioversterker gebruik ik een PC speaker met amplifier en voor de spraak een PC electret microfoontje.  Hoe simpel kan het zijn.

2015-06-11_001

 

De resultaten zijn prima, echter ik ervaar twee ‘lastige’ problemen maar dat kan exemplarisch zijn:

  1. Ondanks dat ik als bandbreedte 25 kHz kies, vallen nogal wat stations buiten het filter op zowel PI2NOS als PI2NON.
  2. De gevoeligheid springt op en neer lijkt het. Althans de ruis neemt toe en even later is de ontvangst weer ruisvrij.

Ik zit er niet echt mee, maar het is wel opvallend en ik lees nergens op internet dat er mensen met soortgelijke ervaringen zijn.

Voor mij is het experiment echter al geslaagd omdat ik interessante toepassingen zie voor deze module(s). Niet alleen kun je een uitgebreidere shield gaan bouwen en vrolijk los gaan met programmeren op een Arduino of RPi processor. Je zou er ook een ‘minimalistische’ porto van kunnen maken. Het eerste heeft overigens mijn voorkeur moet ik zeggen.

Als voorbeeld in deze blog alvast de eerste sketch die ik gemaakt heb voor de DRA818U, dus de 70 cm uitvoering, maar hij is 1:1 te gebruiken voor de V uitvoering. Met een schakelaar kan ik kiezen uit 3 frequenties en stand 4 is een scan stand waarbij het squelch niveau wordt uitgelezen door de UNO32. De twee groene led’s op de UNO32 geven het kanaal (1..3) aan en knipperen tijdens scannen. Je kunt dus ook zonder de OLED ‘aflezen’ op welke frequentie je ontvangt. De sketch start automatisch in de scan stand.

// Sample sketch DRA818U/V with Adafruit OLED 128×32
// PA3ANG, Johan van Dijk. June 2015.
// UNO32

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define OLED_RESET 7
Adafruit_SSD1306 display(OLED_RESET);

// Bandwith in kHz 0=12.5kHz or 1=25kHz
// CTCSS off=0000, 77=0004 82,5=0006, 88,5=0008
// BW,TXFr,RXFr,TXCTCSS,Sq,RXCTCSS
#define ChNr 4

// PI2NOS, PI2KMP, PI2NON
String Channel[ChNr] = { “”,”1,431.7250,430.1250,0004,1,0000″, “1,431.7750,430.1750,0004,1,0004”, “1,431.8750,430.2750,0004,1,0000” };
String OLEDChn[ChNr] = { “”,”PI2NOS”,”PI2KMP”,”PI2NON” };

// set pin numbers:
const int ledPin4 = 13; // the number of the LED pin
const int ledPin5 = 43; // the number of the LED pin
const int switchPin = 3;
const int squelchPin = 2;

// set constants and variables
int channel = 0; // start in scan mode
int scanchannel = 1; // on channel 1
int squelch;
long scandelay = 2000; // 2 seconds squelch delay
long scantime = 0;
int currentchannel = 0;
int switchStatus; // the currentchannel switch from the input pin
int previousStatus = LOW; // the previous switch from the input pin
long time = 0; // the last time the output pin was toggled
long debounce = 500; // the debounce time, increase if the output flickers
int channelmax=3;

// setup routine
void setup() {
pinMode(switchPin, INPUT);
pinMode(squelchPin, INPUT);
pinMode(ledPin4, OUTPUT);
pinMode(ledPin5, OUTPUT);

display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr 0x3C (for the 128×32)

display.display(); // show splashscreen
display.clearDisplay(); // clears the screen and buffer

Serial.begin(9600);
Serial.println(“AT+DMOSETVOLUME=8”);
delay(200);
Serial.println(“AT+SETFILTER=0,0,0”);
delay(200);
}

// main loop
void loop() {
switchStatus = digitalRead(switchPin);
if (switchStatus == HIGH && previousStatus == LOW && millis() – time > debounce) {
channel++;
time = millis();
if ( channel > channelmax ) channel = 0;
if ( channel ) { Serial.println(“AT+DMOSETGROUP=”+Channel[channel]); }
leddisplay(channel);
}
previousStatus = switchStatus;
if ( channel == 0 ) scan();
}

// scan routine
void scan() {
if ( scanchannel != currentchannel ) { Serial.println(“AT+DMOSETGROUP=”+Channel[scanchannel]); currentchannel = scanchannel; }
delay(200);
squelch = digitalRead(squelchPin);
if ( !squelch ) scantime = millis(); leddisplay(0); delay(100);
if ( squelch && millis() – scantime > scandelay ) {
scanchannel++;
if (scanchannel > 3 ) scanchannel=1;
}
leddisplay(currentchannel);
//delay(100);
}

// display binary 0..3 on LD4 and LD5
void leddisplay(int value) {
if ( value == 0 ) { digitalWrite(ledPin4, LOW ); digitalWrite(ledPin5, LOW ); return; }
if ( value == 1 ) { digitalWrite(ledPin4, HIGH); digitalWrite(ledPin5, LOW ); }
if ( value == 2 ) { digitalWrite(ledPin4, LOW ); digitalWrite(ledPin5, HIGH); }
if ( value == 3 ) { digitalWrite(ledPin4, HIGH); digitalWrite(ledPin5, HIGH); }

display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(2); display.setCursor(0,0);
display.print(OLEDChn[value]);
display.setTextSize(1); display.setCursor(90,0);
if ( !channel ) display.print(String(scanchannel)+” scan”); else display.print(String(value)+” fix”);
display.setTextSize(1); display.setCursor(0,24);
display.print(Channel[value].substring(11,19));
display.setCursor(50,24);
display.print(“MHz Ctcss:”+Channel[value].substring(22,24));
// this display.display() command freezes the processor for some 10ths of milliseconds
display.display();
}

Al met al een leuke aanvulling op de gadgets die tegenwoordig ‘voor weinig’ te koop zijn. Wie had dat 10 jaar geleden gedacht?