MessagePack Unit für Lazarus (Arduino Uno Q)

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Acia6850
Beiträge: 50
Registriert: Mo 9. Okt 2023, 18:45
OS, Lazarus, FPC: Windows + WSL / Linux Debian Rasbian OS (L 3.0.0 FPC 3.3.2)
CPU-Target: 64Bit
Wohnort: LK Ludwigsburg

MessagePack Unit für Lazarus (Arduino Uno Q)

Beitrag von Acia6850 »

Hallo ich habe in den letzten Tagen Lazarus auf einem Arduino Uno Q 4GB installiert.

Der Arduino Uno Q hat eine MPU und eine MCU.
Die MPU läuft unter Debian Trixie aarch64.

Die MCU mit Arduino Ide Code c++.

Lazarus Packete sind die gleichen wie für Raspberry PI.

Die Lazarus Ide läuft !
Programme kann man kompilieren alles ok.

Die Kommunikation zwichen MPU und MCU läuft über eine Arduino App Lab (Rpc calls)
Auf MPU Linux Seite mit Python über eine Bridge Software Lib
Auf MCU Seite mit C++ und der Bridge Lib

In der Arduino App Lab läuft das ganze in einer virtuellen Python Umgebung.

Es gibt aber eine Möglichkeit mit Python direkt mit der MassagePack Lib und Sockets direkt auf die MCU zugreifen und Daten auszutauschen.


Gibt es Beispiele in Lazarus mit MessagePack und Socket wie in Python.
Dann kann man mit Lazarus den Arduino Uno Q genauso benutzen wie mit der Arduino App Lab.

Vieleich kennt sich da jemand aus und könnte mir Tips geben.


https://docs.arduino.cc/tutorials/uno-q/user-manual/
Arduino MCU Code

Code: Alles auswählen

#include "Arduino_RouterBridge.h"

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);

  Bridge.begin();
  // We use provide_safe to ensure the hardware call runs in the main loop context
  Bridge.provide_safe("set_led_state", set_led_state);
}

void loop() {
}

void set_led_state(bool state) {
  digitalWrite(LED_BUILTIN, state ? LOW : HIGH);
}

Python Code

Code: Alles auswählen

import socket
import msgpack
import sys

# 1. Define the connection to the Router's Unix Socket
SOCKET_PATH = "/var/run/arduino-router.sock"

# 2. Parse command line arguments
# Default to turning LED ON (True) if no argument is provided
led_state = True 

if len(sys.argv) > 1:
    arg = sys.argv[1]
    if arg == "1":
        led_state = True
    elif arg == "0":
        led_state = False
    else:
        print("Usage: python3 msgpack_test.py [1|0]")
        sys.exit(1)

print(f"Sending request to set LED: {led_state}")

# 3. Create the MessagePack RPC Request
# Format: [type=0 (Request), msgid=1, method="set_led_state", params=[led_state]]
request = [0, 1, "set_led_state", [led_state]]
packed_req = msgpack.packb(request)

# 4. Send the request
try:
    with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as client:
        client.connect(SOCKET_PATH)
        client.sendall(packed_req)
        
        # 5. Receive the response
        response_data = client.recv(1024)
        response = msgpack.unpackb(response_data)
        
        # Response Format: [type=1 (Response), msgid=1, error=None, result=None]
        print(f"Router Response: {response}")
        
except Exception as e:
    print(f"Connection failed: {e}")

Grüße

Acia6850

Antworten