Hi,
i try to get some data from my arduino to my raspi 3. I use 2 Arduinos 1 sender 1receiver.
Sender Sends and Receiver receives. everything is fine, I Using the LoRa.h lib for Arduino
thats my Sender CodeNow same on Raspi but without external Libs.
i using wiring Pi and WiringPiSPI
the Communikation with the LoRa Ra02 Modul works while reaading Registers or set registers.
and i also receive some stuff
Arduino sends "1234567890"
Raspi receives "1234-$&/()=)/"
thats my Code
I dont have any idea about that problem, maybe you got one.
i try to get some data from my arduino to my raspi 3. I use 2 Arduinos 1 sender 1receiver.
Sender Sends and Receiver receives. everything is fine, I Using the LoRa.h lib for Arduino
thats my Sender Code
Code:
#include <SPI.h>#include <LoRa.h>int counter = 0;int SyncWord = 0x22;uint32_t freq = 434E6;uint8_t sf = 12;uint32_t bw = 62.5E3;uint8_t cr4 = 8;#define LORA_CS 10 // Chip Select Pin#define LORA_RESET 9 // Reset Pinvoid setup() { Serial.begin(9600); while (!Serial); Serial.println("LoRa Sender"); // Set up LoRa if (!LoRa.begin(freq)) { Serial.println("Starting LoRa failed!"); while (1); } LoRa.setSpreadingFactor(sf); // Set spreading factor (6-12) LoRa.setSignalBandwidth(bw); // Set bandwidth LoRa.setCodingRate4(cr4); // Set coding rate (4/5, 4/6, 4/7, 4/8) LoRa.setSyncWord(SyncWord); // Set sync word // Optional: Reset the LoRa module to initialize it pinMode(LORA_CS, OUTPUT); pinMode(LORA_RESET, OUTPUT); digitalWrite(LORA_CS, HIGH); digitalWrite(LORA_RESET, LOW); delay(10); digitalWrite(LORA_RESET, HIGH); delay(10); Serial.println("LoRa Initialized");}void loop() { // Example: Read the LoRa module's register 0x42 (Version) //uint8_t regValue = LoRaReadRegister(0x42); // Serial.println(regValue, HEX); // Send data with LoRa Serial.print("Sending packet: "); Serial.println(counter);LoRa.beginPacket();LoRa.println("1234567890"); // Sendet exakt 9 BytesLoRa.endPacket(); counter++; Serial.print("Read Reg: "); Serial.println(LoRaReadRegister(0xD1)); delay(5000); // Wait 5 seconds before sending next packet}uint8_t LoRaReadRegister(uint8_t reg) { // Manually control SPI to read a register digitalWrite(LORA_CS, LOW); // Activate the LoRa module (chip select = LOW) SPI.transfer(reg & 0x7F); // Send the register address (bit 7 is 0 for read operation) uint8_t regValue = SPI.transfer(0x00); // Send 0x00 to read the value from the register digitalWrite(LORA_CS, HIGH); // Deactivate the LoRa module (chip select = HIGH) return regValue;}i using wiring Pi and WiringPiSPI
the Communikation with the LoRa Ra02 Modul works while reaading Registers or set registers.
and i also receive some stuff
Arduino sends "1234567890"
Raspi receives "1234-$&/()=)/"
thats my Code
Code:
#include <stdio.h>#include <stdint.h>#include <wiringPi.h>#include <wiringPiSPI.h>#include <stdlib.h>// SPI-Einstellungen#define SPI_CHANNEL 0#define SPI_SPEED 200000// Pins (wiringPi-Nummerierung)// Hinweis: LORA_CS entspricht hier dem Chip Select Pin (BCM GPIO 6)#define LORA_CS 10#define LORA_RST 6// LoRa-Konfigurationint SyncWord = 0x22;uint32_t freq = 434E6;uint8_t sf = 12;uint32_t bw = 62500; // 62,5 kHzuint8_t cr4 = 8;// --- SPI Lese- und Schreib-Funktionen ---// Liest ein Register über SPI (MSB=0 für Lesezugriff)uint8_t LoRa_Read(uint8_t reg) { uint8_t buf[2] = { reg & 0x7F, 0x00 }; digitalWrite(LORA_CS, LOW); wiringPiSPIDataRW(SPI_CHANNEL, buf, 2); digitalWrite(LORA_CS, HIGH); delay(10); return buf[1];}// Schreibt einen Wert in ein Register (MSB=1 für Schreibzugriff)void LoRa_Write(uint8_t reg, uint8_t value) { uint8_t buf[2] = { reg | 0x80, value }; digitalWrite(LORA_CS, LOW); int ret = wiringPiSPIDataRW(SPI_CHANNEL, buf, 2); digitalWrite(LORA_CS, HIGH); if (ret == -1) { printf("SPI Write error on register 0x%X\n", reg); } delay(10); printf("Write 0x%X: 0x%X\n", reg, value);}// Liest den aktuellen IRQ-Status (Register 0x12)uint8_t LoRa_State(){ return LoRa_Read(0x12);}// --- Initialisierung und Testfunktionen ---// Testet, ob das LoRa-Modul reagiert (Version sollte 0x12 sein)int LoRa_Test() { uint8_t version = LoRa_Read(0x42); // RegVersion (0x42) printf("LoRa Version: 0x%02X\n", version); if (version != 0x12) { printf("Fehler: LoRa-Modul antwortet nicht korrekt! Version: 0x%02X\n", version); return 0; } printf("LoRa-Modul reagiert korrekt.\n"); return 1;}// Setzt den LoRa-Modus (R = Receive, T = Transmit, S = Standby)void LoRa_Mode(uint8_t Mode) { switch (Mode) { case 'R': // Empfangsmodus // Zuerst in Sleep-Modus, dann RX-Modus (z. B. kontinuierlicher Empfang) LoRa_Write(0x01, 0x80); // Sleep-Modus delay(10); LoRa_Write(0x01, 0x85); // RX-Modus (kontinuierlich) delay(10); break; case 'T': // Sendemodus LoRa_Write(0x01, 0x80); // Sleep-Modus delay(10); LoRa_Write(0x01, 0x83); // TX-Modus delay(10); break; case 'S': // Standby-Modus LoRa_Write(0x01, 0x81); // Standby im LoRa-Modus delay(10); break; default: printf("Unbekannter Modus: %c\n", Mode); return; } uint8_t returnMode = LoRa_Read(0x01); printf("Set LoRaMode to: 0x%02X\n", returnMode); printf("State: 0x%02X\n", LoRa_State());}// Initialisiert das LoRa-Modulvoid LoRa_Init() { // Zunächst in Sleep-Modus wechseln, damit Konfigurationen sicher vorgenommen werden können LoRa_Write(0x01, 0x80); // Sleep-Modus delay(20); // Frequenz einstellen: Beispiel 434 MHz = 0x6C8000 LoRa_Write(0x06, 0x6C); // Frequency MSB LoRa_Write(0x07, 0x80); // Frequency MID LoRa_Write(0x08, 0x00); // Frequency LSB // Modem-Konfiguration: // Register 0x1D: Bandbreite und Coding Rate (62,5 kHz, CR 4/8) LoRa_Write(0x1D, 0x68); // Register 0x1E: Spreading Factor 12, CRC aktiv (0xC4 = 11000100) LoRa_Write(0x1E, 0xC4); // SyncWord setzen LoRa_Write(0x39, SyncWord); // Anschließend in Standby-Modus wechseln LoRa_Write(0x01, 0x81); delay(20); // Test des LoRa-Moduls if (!LoRa_Test()) { printf("LoRa-Test fehlgeschlagen. Beende Programm...\n"); exit(1); }}// Burst-Lesezugriff auf den FIFO (Register 0x00)// Liest 'length' Bytes in einem einzigen SPI-Transfer in 'buffer'void LoRa_BurstReadFIFO(uint8_t *buffer, int length) { uint8_t spiBuffer[length + 1]; spiBuffer[0] = 0x00; // FIFO-Adresse (0x00) für Lesezugriff (MSB=0) digitalWrite(LORA_CS, LOW); wiringPiSPIDataRW(SPI_CHANNEL, spiBuffer, length + 1); digitalWrite(LORA_CS, HIGH); for (int i = 0; i < length; i++) { buffer[i] = spiBuffer[i + 1]; }}// --- Empfangsfunktion mit verbesserter Fehlerprüfung ---void LoRa_Receive() { uint8_t irq; int packetSize = 0; uint32_t startTime = millis(); uint32_t timeout = 10000; // Timeout von 10 Sekunden // Wechsel in den Empfangsmodus LoRa_Mode('R'); printf("Warte auf Empfang...\n"); // Warten, bis RxDone (Bit 6 in Register 0x12) gesetzt ist oder Timeout erreicht wird do { irq = LoRa_Read(0x12); if (irq & 0x40) { // RxDone break; } delay(50); } while (millis() - startTime < timeout); if (!(irq & 0x40)) { printf("Timeout: Kein Paket empfangen.\n"); return; } // Prüfen, ob ein CRC-Fehler vorliegt (Bit 5 in Register 0x12) if (irq & 0x20) { printf("Empfangenes Paket hat einen CRC-Fehler.\n"); LoRa_Write(0x12, 0xFF); // IRQ-Flags zurücksetzen return; } // Lese die Payload-Länge aus Register 0x13 (expliziter Header) packetSize = LoRa_Read(0x13); printf("Payload Length: %d\n", packetSize); // Payload-Länge validieren (muss zwischen 1 und 255 liegen) if (packetSize <= 0 || packetSize > 255) { printf("Ungültige Payload-Länge: %d\n", packetSize); LoRa_Write(0x12, 0xFF); // IRQ-Flags zurücksetzen return; } uint8_t payload[256]; delay(10); // Kurzer Delay zur Stabilisierung // Auslesen des FIFO-Inhalts (Burst Read) LoRa_BurstReadFIFO(payload, packetSize); // Ausgabe der empfangenen Bytes als Hex printf("Empfangene Bytes: "); for (int i = 0; i < packetSize; i++) { printf("0x%02X ", payload[i]); } printf("\n"); // Ausgabe als String (sofern ASCII-kodiert) printf("Empfangene Nachricht: '"); for (int i = 0; i < packetSize; i++) { printf("%c", payload[i]); } printf("'\n"); // Ausgabe des RSSI-Werts printf("Empfangene RSSI: %d\n", LoRa_Read(0x1A)); // IRQ-Flags zurücksetzen LoRa_Write(0x12, 0xFF);}// --- Sendefunktion ---void LoRa_Send(uint8_t *data, uint8_t length) { // Setze die Payload-Länge im entsprechenden Register LoRa_Write(0x22, length); printf("Schreibe FIFO-Daten: '%s' mit Länge: %d\n", data, length); for (int i = 0; i < length; i++) { printf("data[%d]: 0x%02X\n", i, data[i]); LoRa_Write(0x00, data[i]); // Schreibe in das FIFO (Register 0x00) } delay(10); // Wechsel in den Sendemodus LoRa_Mode('T'); // Warte, bis das Senden abgeschlossen ist (TxDone, Bit 3 in Register 0x12) while (!(LoRa_Read(0x12) & 0x08)) { delay(10); } // IRQ-Flag für TxDone zurücksetzen LoRa_Write(0x12, 0x08); printf("Gesendet: '%s'\n", data);}int main() { // WiringPi initialisieren und SPI einrichten wiringPiSetup(); wiringPiSPISetup(SPI_CHANNEL, SPI_SPEED); // CS- und RST-Pins konfigurieren pinMode(LORA_CS, OUTPUT); pinMode(LORA_RST, OUTPUT); digitalWrite(LORA_CS, HIGH); // Hardware-Reset des LoRa-Moduls digitalWrite(LORA_RST, HIGH); delay(100); digitalWrite(LORA_RST, LOW); delay(100); digitalWrite(LORA_RST, HIGH); delay(100); // Initialisiere das LoRa-Modul LoRa_Init(); uint8_t message[] = "Hallo LoRa!"; int counter = 0; while (1) { printf("Debug Print: %d\n", counter++); // Ausgabe einiger Register zur Überprüfung printf("0x13 (Payload Length): 0x%X\n", LoRa_Read(0x13)); printf("0x06 (Freq MSB): 0x%X\n", LoRa_Read(0x06)); printf("0x07 (Freq MID): 0x%X\n", LoRa_Read(0x07)); printf("0x08 (Freq LSB): 0x%X\n", LoRa_Read(0x08)); printf("0x1E (Modem Config 2): 0x%X\n", LoRa_Read(0x1E)); printf("0x1D (Modem Config 1): 0x%X\n", LoRa_Read(0x1D)); printf("0x39 (SyncWord): 0x%X\n", LoRa_Read(0x39)); printf("0x01 (OpMode): 0x%X\n", LoRa_Read(0x01)); printf("0x12 (IRQ Flags): 0x%X\n", LoRa_Read(0x12)); // Nachricht senden (optional) // LoRa_Send(message, sizeof(message) - 1); delay(300); // Empfange ein Paket LoRa_Receive(); delay(1000); // 1 Sekunde Pause } return 0;}Statistics: Posted by Mathrim — Fri Mar 21, 2025 12:18 pm