Hier braucht es nur eine einfache Schaltung mit einem Mikroamperemeter.
Anders sieht es aus, wenn man z.B. automatische Sendestationen (Relaisstellen) oder den eigenen Funkbetrieb überwachen und die Zeiträume der Aktivität erfassen will.
Dazu habe ich mit dem Raspberry pi und einigen wenigen externen Bauteilen eine wunderbar funktionierende Einheit entwickelt,
die hier störungsfrei läuft.
Benötigte Hardware:
Raspberry pi
analog/digital Wandler (hier mcp3008) Wer den Lötaufwand mit dem MCP3008 vermeiden möchte kann auch den PCF8591 nehmen
HF-Sniffer (einfacher Selbstbau)
1. HF Feldstärkemesser
Für geübte Funkamateure eine Sache von 30 Minuten.
Material alles aus der Bastel- und Restekiste
2 Dioden (am besten Germanium Dioden)
1 Poti 47k
1 Kondensator 20nF
1 Teleskopantenne (kann aber auch ein Stück Draht sein)
2.1 D/A Wandler an Raspberry pi
A/D Wandler mcp3008
Die GPIO Kontakte des Raspberry pi können Verbindung zu anderen Geräten aufnehmen.
Allerdings nur auf digitalem Weg.
Wir wollen aber eine Gleichspannung messen, die vom HF-Sniffer kommt.
Damit kann der pi erstmal nichts anfangen.
Dieser analoge Messwert wird nun von einem Analog-Digitalwandler (z.B. MCP3008)
so umgewandelt, dass der pi ihn lesen und verarbeiten kann.
Möglich sind via SPI oder I²C-Bus. Hier benutze ich das Auslesen der GPIO mit SPI.
Hierzu das ausgezeichnete Tutorial von Erik Bartmann https://erik-bartmann.de/userfiles/down ... CP3008.pdf
dessen Skript von ihm freigegeben ist und hier auch verwendet wir (modifiziert).
Zum Anfang und zum experimentieren habe ich mir ein Breadboard zugelegt.
Hier kann auch erst mal der nicht so geschickte Elektronikbastler durch einfaches
Stecken der Bauteile und Verbindungen zum Erfolg kommen
2.2 Skript Python
Das Script zur Abfrage ist in python geschrieben, das schon auf
Raspberry dabei ist.
Da der MCP3008 mit dem SPI Bus arbeitet muss dieser natürlich aktiviert sein.
Standardmäßig ist der SPI Bus geblacklistet.
Konfigurationsdatei
- Code: Alles auswählen
sudo nano /etc/modprobe.d/raspi-blacklist.conf
anschließend blacklisting mit # auskommentieren
#blacklist spi-bcm2708
Raspberry Pi neu booten
Für die Programmierung der GPIO's mithilfe Python muss die Python-Entwicklungsungebung sowie die
RPI.GPIO Bibliothek nachinstalliert werden.
sudo apt-get update
sudo apt-get install python-dev
sudo apt-get install python-rpi.gpio
Mit Rootrechten (sudo) das .py Skript anlegen
- Code: Alles auswählen
sudo nano read_mcp3008.py
- Code: Alles auswählen
import time
import RPi.GPIO as GPIO
import os
import sys
GPIO.setmode(GPIO.BCM)
HIGH = True # HIGH-Pegel
LOW = False # LOW-Pegel
# Funktionsdefinition
def readAnalogData(adcChannel, SCLKPin, MOSIPin, MISOPin, CSPin):
# Pegel vorbereiten
GPIO.output(CSPin, HIGH)
GPIO.output(CSPin, LOW)
GPIO.output(SCLKPin, LOW)
sendcmd = adcChannel
sendcmd |= 0b00011111 # Entspricht 0x18 (1:Startbit, 1:Single/ended)
# Senden der Bitkombination (Es finden nur 5 Bits Beruecksichtigung)
for i in range(5):
if (sendcmd & 0x10): # (Bit an Position 4 pruefen. Zaehlung beginnt bei 0)
GPIO.output(MOSIPin, HIGH)
else:
GPIO.output(MOSIPin, LOW)
# Negative Flanke des Clocksignals generieren
GPIO.output(SCLKPin, HIGH)
GPIO.output(SCLKPin, LOW)
sendcmd <<= 1 # Bitfolge eine Position nach links schieben
# Empfangen der Daten des ADC
adcvalue = 0 # Ruecksetzen des gelesenen Wertes
for i in range(11):
GPIO.output(SCLKPin, HIGH)
GPIO.output(SCLKPin, LOW)
# print GPIO.input(MISOPin)
adcvalue <<= 1 # 1 Postition nach links schieben
if(GPIO.input(MISOPin)):
adcvalue |= 0x01
time.sleep(0.5)
return adcvalue
# Variablendefinition
ADC_Channel = 7 # Analog/Digital-Channel
SCLK = 18 # Serial-Clock
MOSI = 24 # Master-Out-Slave-In
MISO = 23 # Master-In-Slave-Out
CS = 25 # Chip-Select
# Pin-Programmierung
GPIO.setup(SCLK, GPIO.OUT)
GPIO.setup(MOSI, GPIO.OUT)
GPIO.setup(MISO, GPIO.IN)
GPIO.setup(CS, GPIO.OUT)
while True:
print readAnalogData(ADC_Channel, SCLK, MOSI, MISO, CS)
f = open("hf.txt", "w");
print f
value = readAnalogData(ADC_Channel, SCLK, MOSI, MISO, CS)
myString = str(value)
f.write(myString + "\n")
print readAnalogData(ADC_Channel, SCLK, MOSI, MISO, CS)
f = open("grafhf.txt", "a");
print f
value = readAnalogData(ADC_Channel, SCLK, MOSI, MISO, CS)
myString = str(value)
f.write(myString + "\n")
# GNUPLOT Grafik erstellen
os.system("gnuplot /home/pi/grafhf.plt")
# skipt beenden
exit(0)
gestartet wir später mit:
- Code: Alles auswählen
sudo python read_mcp3008.py
Wer einen anderen channel (input) beim mcp3008 möchte editiert folgende Zeile:
sendcmd |= 0b00011111 # Entspricht 0x18 (1:Startbit, 1:Single/ended) hier stellt ihr Hexadezimal den Input Kanal des MCP3008 ein 111 = 7 000 = 0
Anmerkung zum Skript:
den unteren Teil des Skriptes habe ich geschrieben, um die ausgelesenen Werte in Textdateien in /home/pi zu bringen und mit gnuplot vom Raspberry eine Grafik zu erstellen
- Code: Alles auswählen
while True:
print readAnalogData(ADC_Channel, SCLK, MOSI, MISO, CS)
f = open("hf.txt", "w");
print f
value = readAnalogData(ADC_Channel, SCLK, MOSI, MISO, CS)
myString = str(value)
f.write(myString + "\n")
print readAnalogData(ADC_Channel, SCLK, MOSI, MISO, CS)
f = open("grafhf.txt", "a");
print f
value = readAnalogData(ADC_Channel, SCLK, MOSI, MISO, CS)
myString = str(value)
f.write(myString + "\n")
# GNUPLOT Grafik erstellen
os.system("gnuplot /home/pi/grafamp.plt")
# skipt beenden
exit(0)
Der Unterschied zwischen hf.txt und grafhf.txt besteht nur darin, das einmal der gelesene Wert jedes Mal
überschrieben wird (aktueller HF Feldstärke auf der Webseite)
und beim anderen die Werte untereinander erhalten bleiben (für die Grafikauswertung).
Freigabe ( chmod 777) der txt Dateien nicht vergessen.
2.1.2 Gnuplot
- Code: Alles auswählen
sudo apt-get install gnuplot
zu Gnuplot gibt es jede Menge Infos, wer hier nicht weiterkommt bitte email an dl3ndd(at)web.de
3. Fertiger Aufbau und Autostart
klick to enlarge
Den Autostart am einfachsten in der rc.local eintragen
sudo nano /etc/r.local
- Code: Alles auswählen
sudo python /home/pi/read_mcp3008.py
oder zeitgesteuert über crontab -e
3. Ergebnis
12 Stunden Auszeichnung meines Funkbetriebes. Grafik vom Raspberry erstellt mit Gnuplot
1000 Messpunkte ca. 1 Stunde
Die unterschiedlichen Kurven entstehen bei Nutzung verschiedener Frequenzen (Empfindlichkeit des HF-Sniffers) und
unterschiedlicher Leistung.