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 ![]()
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