Forum: Mikrocontroller und Digitale Elektronik Bitte um Hilfe bei AS3935 Blitzsensor Schulprojekt


von Max P. (max2004)


Lesenswert?

Hallo,

ich möchte für ein Schulprojekt einen Blitzsensor basteln und wollte 
fragen, ob mir hier vllt jemand helfen könnte. Ich habe schon ein paar 
kleine Elektroprojekte mit Arduino und Raspberry Pi mit Hilfe von 
Anleitungen umgesetzt und dachte, hier würde es genauso klappen, weil 
ich im Internet viele Anleitungen gefunden habe. Also habe ich so einen 
AS3935 Blitzsensor bestellt

https://www.amazon.de/gp/product/B07TSJKWQW

und versucht, eine der Anleitungen zu befolgen

http://cocoontech.com/forums/blog/29/entry-467-how-to-use-a-as3935-lightning-sensor-with-a-raspberry-pi/

So habe ich den Sensor mit dem Pi verkabelt:

VCC -> PIN 1 (3,3V)  //  ich habe auch schon PIN 2 (5V) probiert, was 
keinen Unterschied zu machen scheint
GND -> PIN 6 (GND)
SDA/MOSI -> PIN 3 (GPIO 2)
SCL -> PIN 5 (GPIO 3)
SI -> 3V3 -> PIN 1 (3,3V)
IRQ -> PIN 11 (GPIO 17)

Ich bin auch so weit gekommen, dass mein Pi den Sensor als I2C device 
erkennt:
1
pi@raspberrypi:~ $ sudo i2cdetect -y 1
2
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
3
00:          03 -- -- -- -- -- -- -- -- -- -- -- --
4
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
5
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
6
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
7
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
8
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
9
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
10
70: -- -- -- -- -- -- -- --

Aber ich bekomme den Democode aus dem RaspberryPi-AS3935 Projekt nicht 
zum laufen.

In der Doku vom Projekt habe ich verstanden, dass es unterschiedliche 
Arten des Sensors gibt, auf die man den Code anpassen muss und dann noch 
an den Raspberry Pi, deshalb habe ich in der demo.py die Zeile
1
sensor = RPi_AS3935(address=0x00, bus=0)

geändert zu
1
sensor = RPi_AS3935(address=0x03, bus=1)

was aber auch nicht funktioniert hat.

In den Issues des Projekts hatte jemand ein ähnliches Problem und kam am 
Ende anhand eines kleinen Testprogramms zu dem Ergebnis, dass es ein 
Hardwarefehler sein könnte:

https://github.com/pcfens/RaspberryPi-AS3935/issues/1#issuecomment-18845623

Das habe ich mit ähnlichen Ergebnissen nachgestellt, aber ich verstehe 
nicht, was da genau passiert und ob es helfen würde, irgendwo einen pull 
up resistor zu schalten (ich wüsste auch nicht wo).

Den Code habe ich so modifiziert:
1
import smbus
2
import time
3
i2cbus = smbus.SMBus(1)
4
5
for i in range(0,1):
6
    while True:
7
        try:
8
            as3935_data = i2cbus.read_i2c_block_data(0x03, 0x01)
9
            print "i2cbus.read_i2c_block_data(0x03, 0x01) success.."
10
            print as3935_data[0x03]
11
        except:
12
            print "i2cbus.read_i2c_block_data(0x03, 0x01) fail.."
13
            time.sleep(1)
14
            continue
15
        break
16
17
for i in range(0,1):
18
    while True:
19
        try:
20
            i2cbus.write_byte_data(0x03, 0x03, as3935_data[0x03] | 0x20)
21
            print "i2cbus.write_byte_data(0x03, 0x03, as3935_data[0x03] | 0x20) success.."
22
        except:
23
            print "i2cbus.write_byte_data(0x03, 0x03, as3935_data[0x03] | 0x20) fail.."
24
            time.sleep(1)
25
            continue
26
        break
27
28
for i in range(0,1):
29
    while True:
30
        try:
31
            as3935_data = i2cbus.read_i2c_block_data(0x03, 0x00)
32
            print as3935_data[0x03]
33
            print "as3935_data = i2cbus.read_i2c_block_data(0x03, 0x00) success.."
34
        except:
35
            print "as3935_data = i2cbus.read_i2c_block_data(0x03, 0x00) fail.."
36
            time.sleep(1)
37
            continue
38
        break

Und das waren die Ergebnisse von ein paar Durchläufen, mal mit ein paar 
Sekunden Abstand aber auch mal mit Neustarts zwischendurch:
1
pi@raspberrypi:~ $ python test.py
2
i2cbus.read_i2c_block_data(0x03, 0x01) success..
3
255
4
i2cbus.write_byte_data(0x03, 0x03, as3935_data[0x03] | 0x20) fail..
5
i2cbus.write_byte_data(0x03, 0x03, as3935_data[0x03] | 0x20) fail..
6
i2cbus.write_byte_data(0x03, 0x03, as3935_data[0x03] | 0x20) success..
7
240
8
as3935_data = i2cbus.read_i2c_block_data(0x03, 0x00) success..
9
10
pi@raspberrypi:~ $ python test.py
11
i2cbus.read_i2c_block_data(0x03, 0x01) fail..
12
i2cbus.read_i2c_block_data(0x03, 0x01) fail..
13
i2cbus.read_i2c_block_data(0x03, 0x01) fail..
14
i2cbus.read_i2c_block_data(0x03, 0x01) fail..
15
i2cbus.read_i2c_block_data(0x03, 0x01) fail..
16
i2cbus.read_i2c_block_data(0x03, 0x01) fail..
17
i2cbus.read_i2c_block_data(0x03, 0x01) fail..
18
i2cbus.read_i2c_block_data(0x03, 0x01) fail..
19
i2cbus.read_i2c_block_data(0x03, 0x01) success..
20
0
21
i2cbus.write_byte_data(0x03, 0x03, as3935_data[0x03] | 0x20) success..
22
255
23
as3935_data = i2cbus.read_i2c_block_data(0x03, 0x00) success..
24
25
pi@raspberrypi:~ $ python test.py
26
i2cbus.read_i2c_block_data(0x03, 0x01) fail..
27
i2cbus.read_i2c_block_data(0x03, 0x01) fail..
28
i2cbus.read_i2c_block_data(0x03, 0x01) fail..
29
i2cbus.read_i2c_block_data(0x03, 0x01) fail..
30
i2cbus.read_i2c_block_data(0x03, 0x01) fail..
31
i2cbus.read_i2c_block_data(0x03, 0x01) fail..
32
i2cbus.read_i2c_block_data(0x03, 0x01) fail..
33
i2cbus.read_i2c_block_data(0x03, 0x01) success..
34
0
35
i2cbus.write_byte_data(0x03, 0x03, as3935_data[0x03] | 0x20) fail..
36
i2cbus.write_byte_data(0x03, 0x03, as3935_data[0x03] | 0x20) fail..
37
i2cbus.write_byte_data(0x03, 0x03, as3935_data[0x03] | 0x20) fail..
38
i2cbus.write_byte_data(0x03, 0x03, as3935_data[0x03] | 0x20) fail..
39
i2cbus.write_byte_data(0x03, 0x03, as3935_data[0x03] | 0x20) fail..
40
i2cbus.write_byte_data(0x03, 0x03, as3935_data[0x03] | 0x20) fail..
41
i2cbus.write_byte_data(0x03, 0x03, as3935_data[0x03] | 0x20) fail..
42
i2cbus.write_byte_data(0x03, 0x03, as3935_data[0x03] | 0x20) success..
43
32
44
as3935_data = i2cbus.read_i2c_block_data(0x03, 0x00) success..
45
46
pi@raspberrypi:~ $ python test.py
47
i2cbus.read_i2c_block_data(0x03, 0x01) success..
48
0
49
i2cbus.write_byte_data(0x03, 0x03, as3935_data[0x03] | 0x20) success..
50
32
51
as3935_data = i2cbus.read_i2c_block_data(0x03, 0x00) success..
52
53
pi@raspberrypi:~ $ python test.py
54
i2cbus.read_i2c_block_data(0x03, 0x01) fail..
55
i2cbus.read_i2c_block_data(0x03, 0x01) success..
56
0
57
i2cbus.write_byte_data(0x03, 0x03, as3935_data[0x03] | 0x20) fail..
58
i2cbus.write_byte_data(0x03, 0x03, as3935_data[0x03] | 0x20) fail..
59
i2cbus.write_byte_data(0x03, 0x03, as3935_data[0x03] | 0x20) fail..
60
i2cbus.write_byte_data(0x03, 0x03, as3935_data[0x03] | 0x20) fail..
61
i2cbus.write_byte_data(0x03, 0x03, as3935_data[0x03] | 0x20) fail..
62
i2cbus.write_byte_data(0x03, 0x03, as3935_data[0x03] | 0x20) success..
63
32
64
as3935_data = i2cbus.read_i2c_block_data(0x03, 0x00) success..

Mein Physiklehrer glaubt nicht, dass es am Sensor liegt, aber es ist ihm 
zu aufwändig, sich mit dem Datenblatt des Sensors auseinanderzusetzen. 
Aber ich könnte ja mal in einem Forum fragen, ob mir das jemand erklären 
kann. Ich könnte mir vorstellen, dass er sich da selbst nicht so gut 
auskennt…

Hier gibt es das Datenblatt: 
https://www.mouser.com/datasheet/2/588/ams_AS3935_Datasheet_EN_v5-1214568.pdf

Ich habe dann dieses Forum gefunden und nach AS3935 gesucht, aber leider 
fehlt mir wohl noch viel Wissen, um die vorhandenen Themen zu verstehen, 
z.B. Beitrag "AS3935 SPI merkwürdig"


Also es wäre sehr freundlich, wenn mir jemand helfen könnte die 
Ergebnisse von meinem Testprogramm zu verstehen und vielleicht sogar 
einen Blick auf das Datenblatt werfen und mir sagen könnte, ob ich 
irgendwelchen offensichtlichen Fehler beim Aufbau gemacht habe.

Vielen Dank schonmal
Max

von N. M. (mani)


Angehängte Dateien:

Lesenswert?

Max P. schrieb:
> //  ich habe auch schon PIN 2 (5V) probiert, was
> keinen Unterschied zu machen scheint

Das ist vielleicht nicht ganz optimal gewesen. Der Sensor kann zwar 
theoretisch 5V, aber nur wenn der interne Linearregler verwendet wird.
Im Datenblatt steht dazu:
1
In case the voltage regulator is ON 2.4 5.5 V
2
In case the voltage regulator is OFF 2.4 3.6 V

Wenn ich das Amazon-Bild richtig deute (siehe Anhang) könnte der 
Linearregler aktiv sein (Vcc und VREG getrennt angeschlossen). Hast Du 
mal einen Schaltplan zu dem Board um zu sehen für was die ganzen Brücken 
auf der Rückseite sind?

Problem könnte allerdings sein, dass die Pullup am I2C sich scheinbar 
auf VCC beziehen. Das heißt, dein Raspi hat vielleicht 5V gesehen am 
I2C. Soweit ich weiß mag der aber nur 3,3V.
Also ich würde das mit 5V eher lassen.

Da es ab und zu zu gehen scheint, kann es allerdings ja nicht so falsch 
sein (ohne mir den Code genau angeschaut zu haben).

Hast Du ein Oszi oder einen 3€ Sigrok um dir mal die Signale im 
Fehlerfall genau anzuschauen?

von N. M. (mani)


Angehängte Dateien:

Lesenswert?

Anhang vergessen

von N. M. (mani)


Angehängte Dateien:

Lesenswert?

Ein Schaltplan wie du das verschaltet hast wäre auch noch gut.
Die Default-Konfiguration bei I2C UND VREG sieht wie im Anhang aus.
Hast Du I2CL, I2CD, CS, MISO und SI genau so verschaltet?

MISO und CS hast Du oben nicht erwähnt.
Was mich auch etwas irritiert ist dass im Default I2C der I2CD NICHT mit 
einem Pullup nach VDD gepullt wird.

: Bearbeitet durch User
von Max P. (max2004)


Lesenswert?

Hallo mani,

Vielen Dank für deine Antwort!

Wie erkennt man denn, dass VREG getrennt angeschlossen ist? Ich habe den 
VREG auf Pin 6 vom Controller gefunden, aber mir ist nicht klar, woran 
ich sehe, dass der Linearregler verwendet wird und auch nicht warum man 
deshalb dann 5V benutzen kann und ob das sinnvoll wäre.

Aber wenn 3,3V funktionieren sollten, dann wäre ich schon sehr glücklich 
überhaupt sinnvolle Werte auslesen zu können. Also bleibe ich einfach 
bei 3,3V und hoffe, dass ich mit meinem 5V Versuch noch keinen Schaden 
angerichtet habe.


Ich habe ein ganz billigen Bausatz Oszi 
(https://jyetech.com/dso-150-shell-oscilloscope/), aber vielleicht 
reicht das ja trotzdem für diesen Zweck:
1
Number of Channel: 1
2
Analog Bandwidth: 0 - 200KHz
3
Sensitivity: 5mV/Div - 20V/Div
4
Sensitivity error: < 5%
5
Resolution: 12-bit
6
Input Impedance: 1M ohm
7
Maximum Input voltage: 50Vpk
8
Coupling: DC, AC, GND
9
Max Real-time Sampling Rate: 1Msps
10
Timebase: 10us/Div - 500s/Div
11
Record Length: 1024

Die in der Schule sind wohl leider beide kaputt. Ich weiß aber auch 
überhaupt nicht, wo ich was ich messen sollte, um hilfreiche Signale zu 
finden.

Ein Sigrok habe ich nicht, kannte ich auch noch nicht. Wenn es mir 
hierbei helfen kann und nur 3 EUR kostet, lege ich mir sowas aber gerne 
zu.

Ich habe auch versucht ein Foto von meiner Schaltung zu machen, aber da 
erkennt man leider kaum was, deshalb habe ich es versucht 
aufzuschreiben. MISO und CS habe ich nicht erwähnt , weil ich die nicht 
belegt habe. Müssen die auf GND gelegt werden (so verstehe ich das von 
Ihnen angehängte Schaltbild aus dem Datenblatt)? Könnte das mein Fehler 
sein?

Oder macht es Sinn mal zu versuchen, den I2CD / MOSI mit
einem Pullup nach VDD zu verbinden? Und wenn ja, bedeutet das den MOSI 
Kontakt über einen Widerstand mit 3,3V zu verbinden?

Vielen Dank für die Unterstützung!
Max

von mahi (Gast)


Lesenswert?

Max P. schrieb:
> while True:
>         try:
>             as3935_data = i2cbus.read_i2c_block_data(0x03, 0x01)
>             print "i2cbus.read_i2c_block_data(0x03, 0x01) success.."
>             print as3935_data[0x03]
>         except:
>             print "i2cbus.read_i2c_block_data(0x03, 0x01) fail.."
>             time.sleep(1)
>             continue
>         break

Diese exception handler machen alles nur schwieriger. Versuch einfach 
mal
1
as3935_data = i2cbus.read_i2c_block_data(0x03, 0x01)
2
print as3935_data
ohne den ganzen Kram außen rum.

Ich kenne Deine "read_i2c_block_data" Funktion nicht. diejenigen, die 
ich mit google gefunden habe wollen einen weiteren Parameter - nämlich 
wie groß der zu lesende Block ist.

von Ergo70 (Gast)


Lesenswert?

Ich habe genau den hier in Betrieb. Allerdings an einem SAMD21 mit einer 
der fertigen Arduino-Libraries. Das lief nach 5 Minuten. Vielleicht 
kannst Du ja im Code einer solchen Library nachsehen, wie man den 
korrekt anspricht und das dann auf Python portieren?

von Dieter D. (Firma: Hobbytheoretiker) (dieter_1234)


Lesenswert?

Gehe dazu in eine Bibliothek, suche das Buch
Titel: Raspberry Pi,
Autoren: Kofler Kühnast, Scherbeck,
ISBN 978-3-8362-4220-2, 3. Auflage 2016, Kapitel 37 Gewitter erkennen 
mit dem Blitzsensor, Seite 977 bis 984.

von R. F. (rfr)


Lesenswert?

Hallo,

der Sensor sollte ein /CS-Eingang haben. Wie ist dieser verdrahtet und 
welches Potential hat er?

Beitrag #6379249 wurde von einem Moderator gelöscht.
von N. M. (mani)


Lesenswert?

Max P. schrieb:
> Wie erkennt man denn, dass VREG getrennt angeschlossen ist?

Anhand der Platine / wie der Chip beschalten ist. Oder falls du einen 
Schaltplan zu der Platine bekommen hast...

Max P. schrieb:
> und auch nicht warum man deshalb dann 5V benutzen kann und ob das
> sinnvoll wäre

Wenn man einen 5V uC hat, macht das schon Sinn. Sonst eher nicht. Lass 
es am besten Mal bei 3,3V.

Max P. schrieb:
> Ein Sigrok habe ich nicht, kannte ich auch noch nicht. Wenn es mir
> hierbei helfen kann und nur 3 EUR kostet, lege ich mir sowas aber gerne
> zu.

Nicht so wichtig. War nur eine Überlegung da man dann den 
"schlecht"-Fall Mal hätte aufzeichnen können. Aber die 3€ sind gut 
investiert, dauert dann aber meist 4 Wochen bis es da ist.

Max P. schrieb:
> MISO und CS habe ich nicht erwähnt , weil ich die nicht belegt habe.
> Müssen die auf GND gelegt werden (so verstehe ich das von Ihnen
> angehängte Schaltbild aus dem Datenblatt)? Könnte das mein Fehler sein?

Wahrscheinlich hat es einen Grund warum die Pins bei I2C mit GND belegt 
sind. Vielleicht fängt sich der Chip über die offenen Pins ab und zu 
eine Flanke ein die dann dazu führen dass es ab uns zu geht... Und ab 
und zu halt nicht.

Also ich würde als erstes Mal die Hardware ordentlich beschalten.
Also I2CL, I2CD, CS, MISO und SI genau so verschalten im im DB!

von Max P. (max2004)


Lesenswert?

Hallo, die Software läuft jetzt!

Vielen Dank für all die guten Vorschläge! Ich wollte alle Ratschläge 
befolgen und habe mit dem angefangen, MISO und CS mit GND zu verkabeln - 
so wie es aus dem Datenblatt hervorgeht. Den Rest habe ich so gelassen 
(VCC = 3,3V). Dann lief die Software sofort.

Tut mir Leid, dass ich das nicht selbst gemerkt habe. Bisher hat mich 
immer die Menge an Infos in den Datenblättern abgeschreckt, aber nun 
weiß ich schonmal, wie man den Teil zum verschalten findet und versteht! 
Das wird mir bestimmt auch bei zukünftigen Projekten sehr helfen!

Nun habe ich den Demo Code 
https://github.com/pcfens/RaspberryPi-AS3935/blob/master/demo.py 
ausgeführt und die Ausgabe
1
Noise level too high - adjusting

bekommen, bis ich wie in der Anleitung 
http://cocoontech.com/forums/blog/29/entry-467-how-to-use-a-as3935-lightning-sensor-with-a-raspberry-pi/ 
beschrieben
1
sensor.calibrate(tun_cap=0x0F)

auf
1
sensor.calibrate(tun_cap=0x0D) * changed to my capacitor value of 104

geändert habe. Nun bekomme ich
1
Waiting for lightning - or at least something that looks like it

angezeigt und warte auf das nächste Gewitter.

Bis dahin versuche ich die Antenne zu kalibrieren, habe aber auch dabei 
Schwierigkeiten.

Im Datenblatt steht
1
Antenna Tuning 
2
The AS3935 uses a loop antenna based on a parallel LC resonator. The antenna has to be designed to have its resonance frequency at 500kHz and a quality factor of around 15. By setting the register REG0x08[7] = 1 the antenna's resonance frequency is displayed on the IRQ pin as a digital signal. The external unit can measure this frequency and tune the antenna adding or removing the internal capacitors with the register REG0x08[3:0]. It is necessary to tune the antenna with an accuracy of ±3.5% to optimize the performance of the signal validation and distance estimation. The resonance frequency is internally divided by a factor, which is programmable with the register REG0x03[7:6]. 
3
4
Figure 45 shows the division ratio. 
5
Division Ratio   REG0x03[7]   REG0x03[6] 
6
16   0   0 
7
32   0   1 
8
64   1   0 
9
128   1   1

Und
1
Address   Register Name   Bit   Type   Default Value   Description 
2
0x08   TUN_CAP   [3:0]   R/W   0000   Internal Tuning Capacitors (from 0 to 120pF in steps of 8pF)

Kann man aus diesen Infos irgendwie erkennen, wie man die Antenne 
kalibrieren kann? Wie kommt man darauf, "sensor.calibrate(tun_cap=0x0F)" 
auf "sensor.calibrate(tun_cap=0x0D)" zu ändern und woher weiß man, 
welchen capacitor value man eintragen muss?

Viele Grüße
Max

von Ergo70 (Gast)


Lesenswert?

Max P. schrieb:
> Kann man aus diesen Infos irgendwie erkennen, wie man die Antenne
> kalibrieren kann?

Ja. Der Schwingkreis muss mit 500000 Hz +- 3.5 % Abweichung schwingen. 
Die aktuelle Frequenz kannst Du über den IRQ PIN auslesen und falls es 
mehr als 3.5% Abweichung sind, die Kondensatoren an bzw. abschalten um 
die Frequenz so zu verändern, dass es passt. In den einschlägigen 
Libraries kann man sehen, wie das geht. Steht aber auch im Datenblatt, 
was man in welches Register schreiben muss, um die Kondensatoren zu 
schalten.

Beitrag #6380120 wurde von einem Moderator gelöscht.
von Dieter D. (Firma: Hobbytheoretiker) (dieter_1234)


Lesenswert?

Mit der Ferrit-Antenne eine MW-Empfängers waren die Blitze auch gut zu 
hören. Der Empfänger funktioniert nach dem Prinzip.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.