ruessel
Beiträge: 9762

DIY Heltec LoRa32 V3 Spielereien

Beitrag von ruessel »

Heltec hat vor einigen Monaten die dritte Version vom LoRa32 Board veröffentlicht. Beim neuen LoRa32 V3 hat Heltec einige Änderungen an der Hardware vorgenommen. So besitzt die Version 2 den bekannten SX1276 LoRa Chip von Semtech. Mit Version 3 wurde dieser durch einen SX1262 (ebenfalls von Semtech) ersetzt. Diese Änderung führt dazu, dass praktisch fast alle Projekte mit LoRaWAN nicht mehr funktionieren, da Projekte für das V2 Board überwiegend die LMIC-Library als Basis für LoRaWAN nehmen. Die LMIC-Librarys bieten aktuell aber keine Unterstützung für den SX1262 und ein Einstieg in LoRaWAN ist somit komplizierter geworden.

Für mich ist WLAN erst einmal nicht so interessant, ich möchte selber testen wie weit die Module reichen - mit DIY Antennen oder auf anderen Frequenzen. Dafür gab es fertige Skripte wie "LoRa Sender & LoRa Empfänger". Ich habe sehr viele aus dem Netz ausprobiert, es funktionieren nur sehr wenige, die funktionieren, da bleibt das eingebaute OLED aber dunkel - die Anschlüsse wurden in V3 auch geändert.
Heltec selber hat ein Demo veröffentlicht, dieses habe ich sehr stark gekürzt und auch ein wenig verbessert (LED Kontrolle). Dieses läuft nun als Reichweitentester auf Version 3 einwandfrei.

DSC_3273.jpg

Ich habe das Skript "PingPong" genannt, es funktioniert auch so. Wird der Baustein mit Spannung versorgt, horcht er 2 Sekunden auf der Frequenz nach einem Sender, hört er etwas, nimmt er die Botschaft auf und legt einen Zähler dazu. Hört er in den 2 Sekunden nix, wird er selber ein Sender und startet seine Botschaft mit dem Zählerstand 1.
Damit kann ein Baustein zu Hause bleiben, den anderen nimmt man(n) z.B. mit in das Auto und fährt los. Ich habe dafür noch ein LED-Flash einprogrammiert, jedes mal wenn eine Botschaft eintrifft und Fehlerfrei gelesen konnte, blitzt eine LED weiß hell auf, für 0,1 Sekunden. Da jede Sekunde eine Botschaft gesendet wird, blitzt logischerweise im Auto immer eine LED im Sekundentakt. blitzt nix mehr, bin ich ausser der Reichweite! So braucht man noch nicht einmal das OLED abzulesen.
Das OLED zeigt außerdem die Empfangsstärke des Gegenempfänger an, sowie seine eigene Empfangsqualität. Das war es eigentlich auch schon. Hat alles was ich mir im Moment vorstelle.

Im Skript habe ich noch alles wichtige als Kommentar hinterlegt. Zum Beispiel die Nachricht die versendet wird, ich habe ein Baustein mit "Hallo", den anderen mit "Ahoi" versehen. So lassen sich die Module leicht unterscheiden. Wichtig wenn verschiedene Sendeleistung programmiert wurde.

Hier mein Skript das nur mit V3 funzt:

Code: Alles auswählen

/*
 * LoRa_32 PingPong Test 
 * c2023 Ruesseltechnik
*/

#include "Arduino.h"
#include "LoRaWan_APP.h"
#include <Wire.h>  
#include "HT_SSD1306Wire.h"
/********************************* lora  *********************************************/
#define RF_FREQUENCY                                868000000 // Hz - auf angepasster Antenne achten!! Zerstörungsgefahr!!!

#define TX_OUTPUT_POWER                             5        // dBm max.21!! Erlaubt max. in DE - 14

#define LORA_BANDWIDTH                              0         // [0: 125 kHz, - größte Reichweite, langsamste Übertragung.
                                                              //  1: 250 kHz,
                                                              //  2: 500 kHz,
                                                              //  3: Reserved]
                                                              
#define LORA_SPREADING_FACTOR                       7         // [SF7..SF12]Pegel, die durch das SNR (Signal Noise Ratio)noch identifiziert werden. SF7: -123 dBm, SF12: -137 dBm

#define LORA_CODINGRATE                             1         // [1: 4/5, Je kleiner die Codierungsrate ist (die kleinste ist 4/8), desto höher ist die On-Air-Zeit bei einer Übertragung, damit deutlicher.
                                                              //  2: 4/6,
                                                              //  3: 4/7,
                                                              //  4: 4/8]
                                                              
#define LORA_PREAMBLE_LENGTH                        8         // Es bedeutet, dass alle 4 Nutzbits je nach Wert durch 5, 6, 7 oder 8 Übertragungsbits codiert werden.  
                                                              
                                                              
#define LORA_SYMBOL_TIMEOUT                         0         // Bei Empangsabbruch die Zeit den Empfänger schlafen zu legen
#define LORA_FIX_LENGTH_PAYLOAD_ON                  false
#define LORA_IQ_INVERSION_ON                        false

#define RX_TIMEOUT_VALUE                            1000
#define BUFFER_SIZE                                 30 // Definiere die zu übertragende Datengröße
char txpacket[BUFFER_SIZE];
char rxpacket[BUFFER_SIZE];

static RadioEvents_t RadioEvents;
void OnTxDone( void );
void OnTxTimeout( void );
void OnRxDone( uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr );

typedef enum
{
    LOWPOWER,
    STATE_RX,
    STATE_TX
}States_t;

int16_t txNumber;
int16_t rxNumber;
States_t state;
bool sleepMode = false;
int16_t Rssi,rxSize;

String rssi = "RSSI --";
String packSize = "--";
String packet;
String send_num;
String show_lora = "Empfange Daten:";

unsigned int counter = 0;
bool receiveflag = false; // Software Flag für LoRa Empfänger, empfangene Daten machen es "wahr"
long lastSendTime = 0;        // Letzte Sendezeit
int interval = 1000;          // Interval zwischen zwei Sendungen
uint64_t chipid;
int16_t RssiDetection = 0;


void OnTxDone( void )
{
	Serial.print("TX done......");
	state=STATE_RX;

}

void OnTxTimeout( void )
{
  Radio.Sleep( );
  Serial.print("TX Timeout......");
	state=STATE_TX;
}

void OnRxDone( uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr )
{
	rxNumber++;
  Rssi=rssi;
  rxSize=size;
  memcpy(rxpacket, payload, size );
  rxpacket[size]='\0';
  Radio.Sleep( );
  Serial.printf("\r\nreceived packet \"%s\" with Rssi %d , length %d\r\n",rxpacket,Rssi,rxSize);
  Serial.println("Warte um naestes Paket zu senden");
	receiveflag = true;
  state=STATE_TX;
}


void lora_init(void)
{
  Mcu.begin();
  txNumber=0;
  Rssi=0;
  rxNumber = 0;
  RadioEvents.TxDone = OnTxDone;
  RadioEvents.TxTimeout = OnTxTimeout;
  RadioEvents.RxDone = OnRxDone;

  Radio.Init( &RadioEvents );
  Radio.SetChannel( RF_FREQUENCY );
  Radio.SetTxConfig( MODEM_LORA, TX_OUTPUT_POWER, 0, LORA_BANDWIDTH,
                                 LORA_SPREADING_FACTOR, LORA_CODINGRATE,
                                 LORA_PREAMBLE_LENGTH, LORA_FIX_LENGTH_PAYLOAD_ON,
                                 true, 0, 0, LORA_IQ_INVERSION_ON, 3000 );

  Radio.SetRxConfig( MODEM_LORA, LORA_BANDWIDTH, LORA_SPREADING_FACTOR,
                                 LORA_CODINGRATE, 0, LORA_PREAMBLE_LENGTH,
                                 LORA_SYMBOL_TIMEOUT, LORA_FIX_LENGTH_PAYLOAD_ON,
                                 0, true, 0, 0, LORA_IQ_INVERSION_ON, true );
	state=STATE_TX;
}


/********************************* lora  *********************************************/

SSD1306Wire  factory_display(0x3c, 500000, SDA_OLED, SCL_OLED, GEOMETRY_128_64, RST_OLED); // addr , freq , i2c group , resolution , rst

bool resendflag=false;
bool deepsleepflag=false;
bool interrupt_flag = false;
void interrupt_GPIO0()
{
	interrupt_flag = true;
}
void interrupt_handle(void)
{
	if(interrupt_flag)
	{
		interrupt_flag = false;
		if(digitalRead(0)==0)
		{
			if(rxNumber <=2)
			{
				resendflag=true;
			}
			else
			{
				deepsleepflag=true;
			}
		}
	}

}
void VextON(void)
{
  pinMode(Vext,OUTPUT);
  digitalWrite(Vext, LOW);
  
}

void VextOFF(void) //Vext default OFF
{
  pinMode(Vext,OUTPUT);
  digitalWrite(Vext, HIGH);
}
void setup()
{
	Serial.begin(115200);
	VextON();
	delay(100);
	factory_display.init();
	factory_display.clear();

	chipid=ESP.getEfuseMac();//Die Chip-ID ist im Wesentlichen seine MAC-Adresse (Länge: 6 Bytes).
	Serial.printf("ESP32ChipID=%04X",(uint16_t)(chipid>>32));//print High 2 bytes
	Serial.printf("%08X\n",(uint32_t)chipid);//print Low 4bytes.

	attachInterrupt(0,interrupt_GPIO0,FALLING);
	lora_init();
	packet ="Warte auf Datenempfang!";
  factory_display.drawString(0, 10, packet);
  factory_display.display();
  delay(100);
  factory_display.clear();
	pinMode(LED ,OUTPUT);
	digitalWrite(LED, LOW);  
}


void loop()
{
interrupt_handle();
 if(deepsleepflag)
 {
	VextOFF();
	Radio.Sleep();
	SPI.end();
	pinMode(RADIO_DIO_1,ANALOG);
	pinMode(RADIO_NSS,ANALOG);
	pinMode(RADIO_RESET,ANALOG);
	pinMode(RADIO_BUSY,ANALOG);
	pinMode(LORA_CLK,ANALOG);
	pinMode(LORA_MISO,ANALOG);
	pinMode(LORA_MOSI,ANALOG);
	esp_sleep_enable_timer_wakeup(600*1000*(uint64_t)1000);
	esp_deep_sleep_start();
 }

 if(resendflag)
 {
	state = STATE_TX;
	resendflag = false;
 }

if(receiveflag && (state==LOWPOWER) )
{
	receiveflag = false;
	packet ="Inhalt:";
	int i = 0;
	while(i < rxSize)
	{
		packet += rxpacket[i];
		i++;
	}
	packSize = "R_Size: ";
	packSize += String(rxSize,DEC);
	packSize += " R_rssi: ";
	packSize += String(Rssi,DEC);
	send_num = "Sende Nummer: ";
	send_num += String(txNumber,DEC);
	factory_display.drawString(0, 0, show_lora);
  factory_display.drawString(0, 10, packet);
  factory_display.drawString(0, 20, packSize);
  factory_display.drawString(0, 50, send_num);
  factory_display.display();
  delay(10);
  factory_display.clear();
}

switch(state)
  {
    case STATE_TX:
      delay(1000);
      txNumber++;
      sprintf(txpacket,"Ahoi %d,Rssi:%d",txNumber,Rssi); // Sendenachricht die verschickt wird, hier ein freundliches Ahoi!
      Serial.printf("\r\nsending packet \"%s\" , length %d\r\n",txpacket, strlen(txpacket));
      Radio.Send( (uint8_t *)txpacket, strlen(txpacket) );
      state=LOWPOWER;
      break;
    case STATE_RX:
      Serial.println("into RX mode");
      Radio.Rx( 0 );
      digitalWrite(LED, HIGH);
       delay(100);
   digitalWrite(LED, LOW);
      state=LOWPOWER;
      break;
    case LOWPOWER:
      Radio.IrqProcess( );
      break;
    default:
      break;
  }
}
Bei Zeiten könnte diese Spielerei ausgebaut werden, z.b. mit GPS Daten etc.
Ziel könnte auch sein über lange Distanzen Kameras zu steuern.
Gruss vom Ruessel
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.



ruessel
Beiträge: 9762

Re: DIY Heltec LoRa32 V3 Spielereien

Beitrag von ruessel »

Hier ein recht neues Video, dass sehr ausführlich zeigt, wie man V3 programmiert. Traut euch, ist keine Raketenwissenschaft!

Gruss vom Ruessel



ruessel
Beiträge: 9762

Re: DIY Heltec LoRa32 V3 Spielereien

Beitrag von ruessel »

DSC_3285.jpg

Mit einem LiPo wird die Sache mobil. Für diesen Akku habe ich gerade 5,- EUR ausgegeben, habe gleich eine Nummer größer genommen, kleiner (1000 mAh) wird nicht günstiger.
Beim Akku kauf auf PH1.25 achten, das ist der Steckeranschluß - hier ist er winzig - eben 1,25mm Abstand der Kontakte.
Das Modul läuft sofort an, stecke ich 5V USB an, wird der Akku geladen, dies zeigt eine LED in Orange an. Vielleicht wird sie bei vollem Akku grün?
Habe keine Ahnung.

Auch wie ich nun beim Laden des Akkus die Funktion des Sendens abschalten kann, ist mir ein Rätsel.

Beim Akku laden wird es warm.... ich messe 50 Grad auf der Platine!
Ich messe einen Stromverbrauch beim Laden von rund 480 mA.


P.S.
Ist der Akku voll, geht die orange LED einfach aus......
Gruss vom Ruessel
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.



ruessel
Beiträge: 9762

Re: DIY Heltec LoRa32 V3 Spielereien

Beitrag von ruessel »

DSC_3286.jpg

Mein Tageswerk.
Akkuhalterung die auch den Baustein mit aufnimmt gedruckt, diese NoName Frischhaltedosen für je 1,65 EUR gekauft, Schalter und Antenne gebohrt, löten und Montage.
Dann habe ich nun das Skript noch geändert, auf möglichst hohe Reichweite. Heute ist auch meine Stationsantenne (+6dB) vom Chinesen gekommen, paßt natürlich nicht, brauche Adapter dazu.

Die Sendeleistung war bis heute auf 5dBm, ein Kurztest hatte so 150m Reichweite, nun habe ich voll aufgedreht (+22)...... demnächst mal schauen was das bringt. Akkus über Nacht aufladen, sollten um die 50 Stunden ohne Unterbrechung senden können - wenn der Aufdruck mit 3000 mAh stimmt, Chinesenware, meist nur echte 50% drin.

Frage: Was passiert wenn jetzt ein dritter Baustein mit dem selben Skript dazu kommt? Was wird dann angezeigt? Die Spiele sind eröffnet.
(eine Fernbedienung, 2 Kameras Ferngesteuert empfangen)
Gruss vom Ruessel
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.



ruessel
Beiträge: 9762

Re: DIY Heltec LoRa32 V3 Spielereien

Beitrag von ruessel »

868.jpg
Im Spektrum sieht das Sendesignal so aus wie oben gezeigt. Reichweite ist so ein Ding für sich. Beide Teile mit der Stummelantenne auf freier Sicht um die 200-300 Meter, je nach Gelände.
Bin dann auf eine +5 dBi Antenne auf dem Dach gegangen (4 Meter über Grund) und mit Stummelantenne mit dem Auto losgefahren, nach 1.5 Km war Schluß. Nun habe ich eine weitere Chinesenantenne für 868 MHz bestellt (11,- Euro), mal schauen wie weit ich dann komme. Alle genannten Entfernungen im leicht bebauten Gebiet (keine Hochhäuser).
Gruss vom Ruessel
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.



ruessel
Beiträge: 9762

Re: DIY Heltec LoRa32 V3 Spielereien

Beitrag von ruessel »

Gestern Abend kam noch die zweite +5dB Antenne vom Chinesenmann.

Statt gute 200 Meter nur mit Stummelantenne waren nun im leicht bebauten Gebiet über 3 Km Verbindung möglich, bevor der Zähler stehen blieb. Bei -118 dB Empfang war meist die Verbindung so schlecht, das der Prozessor noch Infos Empfang aber nicht mehr dekodieren konnte. Evtl. kann ich da was noch in der Software optimieren, noch weitere -10dB sollten drin sein.

Die Ausbreitung von 868 MHz ist manchmal etwas seltsam. Ich bin noch über freies unbebautes gefahren, auch da war nach ca. 3Km Luftlinie schluss. Aber auch je näher ich an die Autobahn gefahren bin, desto schlechter war die Verbindung, sogar bei nur 1 Km Entfernung brach die Verbindung zusammen, 50 Meter vor der Autobahn.
Die 10-30 Km sind meiner Meinung nach nur in Bayern von Berg zu Berg möglich. Im platten Land stören die Häuser..... mich würde noch der Baustein mit 433 MHz reizen, evtl. sind bei der Frequenz höhere Reichweiten drin, trotz Bebauung.

karte1.jpg
Gruss vom Ruessel
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.



 Aktuelle Beiträge [alle Foren]
 
» >Der LED Licht Thread<
von Darth Schneider - Sa 9:22
» Eigenes kartenspiel mit software erstellen.
von walang_sinuman - Sa 9:13
» Was schaust Du gerade?
von Frank Glencairn - Sa 9:13
» Panasonic S5 - Allgemeine Fragen, Tipps und Tricks, Zeig deine Bilder/Videos usw.
von Bildlauf - Sa 9:12
» Behind The Boom with Boom Operator Ken Strain | URSA Exclusive
von pillepalle - Sa 9:03
» Davinci Resolve, Color Card und Monitorkalibrierung
von Jost - Sa 8:09
» VideoGigaGAN - Adobe zeigt generative KI Super Resolution für Bewegtbilder
von BildTon - Sa 6:42
» Fadenvorhang animieren- wie mache ich das?
von buster007 - Fr 22:38
» Sendung Ersatzteile aus nicht EU Ländern nach Deutschland
von soulbrother - Fr 21:01
» Lumix S5II Bildzittern, Pulsieren
von Peter-LS - Fr 20:58
» Neues Blackmagic DaVinci Resolve 19 bringt über 100 neue Funktionen
von Frank Glencairn - Fr 20:58
» - Erfahrungsbericht - DJI Pocket 3
von Frank Glencairn - Fr 20:09
» Ich brauche dringend Teilnehmende an meiner Studie für meine Masterarbeit
von freezer - Fr 19:05
» Motor Smart: Intelligenter AutoFocus-Motor von PDMovie nutzt LiDAR und KI
von roki100 - Fr 18:04
» AMD Radeon RX 7900 GRE mit 16GB und 256 Bit - preiswerte Grafikkarte für DaVinci Resolve?
von iasi - Fr 17:27
» Videointerview mit dem eigenem KI-Zwilling
von Frank Glencairn - Fr 16:44
» Flackern bei der Digitalisierung - USB Grabby
von Laboriosa - Fr 13:36
» Aktuelle rechtliche Situation für AI generierte Inhalte
von Frank Glencairn - Fr 10:57
» Kamera Kaufberatung Budget ca. 2000€
von suchor - Fr 9:47
» LVX AURORA VISTA Primes - Re-Housing und Vintage Tuning jetzt auch in Europa
von slashCAM - Fr 9:39
» Was hast Du zuletzt gekauft?
von klusterdegenerierung - Fr 7:14
» Nach 7 Jahren mit der OG BMPCC finde ich das Bild noch immer schön.
von Frank Glencairn - Fr 7:02
» Apple Vision Pro: Verkaufsstart (USA) ab Februar für 3.499,- Dollar + neuer Werbeclip
von Darth Schneider - Fr 5:57
» Linsen (Vintage, Anamorphic & Co.)
von Funless - Do 23:58
» H264 4K Minischneideprogramm Empfehlung? Freeware?
von Videopower - Do 22:31
» Hi 8 Videos schärfer machen
von Manschy - Do 20:52
» WORKFLOW: Stockfootage & Resolve
von freezer - Do 19:20
» AMDs Notebook APU Strix Halo - besser als Apples M3 Pro Chip?
von berlin123 - Do 17:34
» AJA: ColorBox 2.1 ACES-Workflow und DRM2 für das DIT-Cart erklärt
von slashCAM - Do 15:48
» Insta360 X4 360°-Action-Kamera filmt in 8K
von -paleface- - Do 14:19
» Ambisonics in Resolve
von Axel - Do 12:09
» MP4 Video verlustfrei exportieren
von Frank Glencairn - Do 10:54
» NAB 2024 Neuigkeiten
von Frank Glencairn - Do 10:23
» Was hörst Du gerade?
von soulbrother - Do 8:55
» Blackmagic PYXIS 6K: Die Vollformat „Box“-Kamera mit Viewfinder, 2x SDI, Sideplates (!) uvm.
von cantsin - Do 8:39