Ethernet Anbindung bei GPIO benutzung fehlerhaft

Heey ich bin Lars und habe ein Problem bei der gleichzeitigen Benutzung des Ethernet Shields und der GPIO Pins.

Arduino Mega 2560 Client
Raspberry Pi 4B Server

Ablauf:
Server sendet Client Json String
Client sendet Server Json String

Wenn ich bei folgendem Code nur einen GPIO Pin initialisiere verbindet sich der Arduino mit dem Raspberry Pi und tauscht erfolgreich die Json Strings aus.
Sobald ich aber mehr als einen Pin als Output deklariere kommt keine Verbindung mehr mit dem Pi zustande.

Würde mich freuen wenn sich jemand bereit erklärt mir bei diesem Problem zu helfen :slight_smile:
Gruß Lars

#include <SPI.h>
#include <Ethernet.h>
#include <ArduinoJson.h>
#include <MobaTools.h>

//Ethernet
byte mac[] = {0xA8, 0x61, 0x0A, 0xAE, 0x96, 0xE6 };
IPAddress ip(192,168,178,3);
IPAddress server(192,168,178,61);
int port = 45689;
EthernetClient client;

//Stepper Motor Basic Parameter
const int basiccircle = 400;                       //Schritte/Umdrehung
const int ramp = 10;                                  //Beschleunigungsschritte
const int speedmax = 75;                         // Min^-1

//Pin Array erstellen
int stepPin[15];

//Json
StaticJsonDocument<200> doc1;
DynamicJsonDocument doc2(1024);
String meinJson;
String reach;
String reachJson;

//Auftragsdaten
int dispenser;
int revolution;
int steps;
int back;

//State Machine
bool state1 = true;
bool state2 = false;
bool state3 = false;
bool state4 = false;
bool state5 = false;
bool state6 = false;
bool state7 = false;

//GPIO Zuweisung Direktion Pin
const  int dirPin   = 22;

//Methode zur Ansteuerung der Stepper Motoren
void stepper(int Number, int Revolution, int Speed, int Basiccircle, int Ramp)
{
  int    steps          = Revolution*Basiccircle;
  double time           = (60000/(Speed*Basiccircle))/2;
  double timenull       = 5;
  double timenow        = timenull;
  double beschleunigung = (timenull - time)/Ramp;

  if (steps > 2*Ramp)
  {
    
    for (int x=0; x < Ramp; x++)
    {
      digitalWrite(stepPin[Number], HIGH);
      delay(0.01);
      digitalWrite(stepPin[Number], LOW);
      delay(timenow);

      timenow += beschleunigung;

      steps = steps - Ramp;
    }
  }
  
  for(int x = 0; x < steps; x++)
  {
    digitalWrite(stepPin[Number], HIGH);
    delay(0.01);
    digitalWrite(stepPin[Number], LOW);
    delay(time);
  }
}

void setup()
{
  //Ausgänge der Stepper festlegen
  stepPin[0]   = 3;
  stepPin[1]   = 4;
  stepPin[2]   = 5;
  stepPin[3]   = 6;
  stepPin[4]   = 7;
  stepPin[5]   = 8;
  stepPin[6]   = 9;
  stepPin[7]   = 11;
  stepPin[8]   = 12;
  stepPin[9]   = 13;
  stepPin[10]  = 14;
  stepPin[11]  = 15;
  stepPin[12]  = 16;
  stepPin[13]  = 17;
  stepPin[14]  = 18;

  pinMode(stepPin[0],  OUTPUT);
  //pinMode(stepPin[1],  OUTPUT);
  //pinMode(stepPin[2],  OUTPUT);
  //pinMode(stepPin[3],  OUTPUT);
  //pinMode(stepPin[4],  OUTPUT);
  //pinMode(stepPin[5],  OUTPUT);
  //pinMode(stepPin[6],  OUTPUT);
  //pinMode(stepPin[7],  OUTPUT);
  //pinMode(stepPin[8],  OUTPUT);
  //pinMode(stepPin[9],  OUTPUT);
  //pinMode(stepPin[10], OUTPUT);
  //pinMode(stepPin[12], OUTPUT);
  //pinMode(stepPin[13], OUTPUT);
  //pinMode(stepPin[14], OUTPUT);

  delay(100);

  //Serielle Schnittstele aufbauen
  Serial.begin(115200);
   while (!Serial) {
    ; 
  }
  Serial.println("Pins initialisiert");
  delay(100);
}


void loop()
{
  //Ethernet Connection Aufbauen
  if(state1){

    //ETHERNET Verbindung aufbauen
    Ethernet.begin(mac, ip);
    
    //..dem Ethernet Shield Zeit zum initilisieren geben
    delay(1000);
    Serial.println("connecting...");
    delay(20);
  
    // Überprüfen ob Verbindung besteht
    if (client.connect(server, port)) {
      Serial.println("connected");
      state1 = false;
    } 
    else {
      // Verbindung Fehlgeschlagen
      Serial.println("connection failed");
      delay(10);
    }
  }

  //Kommunikation
  if(client.available())
  {
    //Json Empfangen
    reach = "";
    while (client.available()) //So lange Nachricht nicht vollständig gelesen wurde
    {
     char reading = client.read();
     reach += reading;
    }
    reachJson = reach;
    //Json umwandeln
    deserializeJson(doc2, reachJson);

    //Parameter Übergabe
    dispenser = doc2["dispenser"];
    revolution = doc2["revolution"];
       
    //Variablen Ausgabe
    Serial.print("Dispenser Nummer: ");
    Serial.println(dispenser);
    Serial.print("Umdrehungen: ");
    Serial.println(revolution);

    state2 = true;  
    delay(100);
  }  

  if (state2)
  {
    stepper(dispenser, revolution, speedmax, basiccircle, ramp);
    delay(1000);
    Serial.println("ready");

    meinJson = "";
    doc1["dispenser"] = dispenser;
    doc1["level"] = 1000;
    serializeJson(doc1, meinJson);
    client.print(meinJson);

    state2 = false;
  }

 if (!client.connected())
 {
     Serial.println();
     Serial.println("disconnecting.");
     client.stop();

     state1 = true;
  }
}

Code Python:

import socket
import json
from time import sleep

#Ethernet
HOST = "192.168.178.61"  # Standard loopback interface address (localhost)
PORT = 45689 # Port to listen on (non-privileged ports are > 1023)

msg    = "";
msgcon = bytearray(msg, 'utf-8')
state1 = True
state2 = False

#Auftragsdaten
dispenser  = 3
revolution = 1000

#Empfangene Daten
level = 0

#Json Dictionary
json_reach = ""
json_send  = {''}

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind((HOST, PORT))
    s.listen()
    conn, addr = s.accept()
    with conn:
        print(f"Connected by {addr}")
        
        state1 = True
        state2 = False
        
        while True:            
                #Starbefehl geben
                msg = input("Starte Anforderung!\n")
                
                #Auftragsden in Json Strngspichern und konvertieren
                json_send = {'dispenser': dispenser, 'revolution': revolution}
                json_send_conv = bytearray(json.dumps(json_send), 'utf-8')
                
                #Auftgsdaten schicken
                conn.send(json_send_conv)
                
                #Daten empfangen
                data = conn.recv(1024)
                json_reach = json.loads(data)
                sleep(1)           
                
                
                #Json Übergabewerte in Variablen speichern
                dispenser = json_reach['dispenser']
                level = json_reach['level']
                
                #Variablen ausgeben
                print("Dispenser:", dispenser, " hat einen Füllstand von", level)
                print(level)
                
                if not data:
                    s.close()
                    break

D0 und D1 sind bei Mega , UNO, Nano, Serial Pins für USB Verbindung damit funktioniert der Serial Monitor

Die sind aber nicht in Benutzung. :wink: Der Anfang ist bei Pin3.

Das Problem ist eher das Ethernetshield auf dem MEGA und Pin 10 (SS) auf dem Shield, der beim Mega ja unten auf 53 liegt in Kombination mit dem SPI, der da ggfls. den AVR auf Slave zieht.

Dan bin Bild :wink:
Wirklich :wink: habe vertauscht die [0] und nicht geachtet auf die Zuweisung :woozy_face:

ETH_SS auf 10 scheint ja nicht benutzt zu sein, aber könnte der SD_SS auf 4 ein Problem mit dem im Sketch genutzten Pin 4 machen?

Danke für die schnellen Antworten!

Pin 4 war der Übeltäter :slight_smile:

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.