Hallo,
ich bin ein kompletter Neuling im Bereich Coding, dass schonmal im vorraus
Mein Setup sieht momentan so aus:
RaspberryPi ist mit dem Arduino Mega über I2C verbunden. RPi ist Master und Arduino Slave. Am Arduino hängt ein 8 Channel Relay.
Verkabelung:
RPi zu Arduino
Ground <-> Ground
SDA <-> SDA
SCL <-> SCL
Arduino zu Relay
Pin 22-29 <-> Pin 1-7
Ground <-> Ground <-- Überhaupt nötig ? Schaltet auch ohne Verbindung
5V <-> VCC <-- Für Elektronik
Externes Netzteil zu Relay
5V <-> JD-VCC <-- Zum Schalten der Relays
Ground <-> Ground
RPi und Arduino haben jeweils ein eigenes Externes Netzteil.
Wenn ich dem Arduino vom RPi eine Zahl über I2C sende sollte dieser den entsprechenden Pin entweder HIGH oder LOW schalten, so dass das der entsprechende Channel aktiviert wird. Funktoniert auch, ich kann jeden Channel einzeln Schalten.
Nun zum Problem:
Hoffe ich kann das jetzt verständlich erklären
Wenn ich denselben Channel schalte dann funktoniert es jedesmal ohne Fehler, kann ihn so oft An- und Ausschalten wie ich möchte, aber sobald ich den nächsten oder ein anderen Channel Schalten will, muss ich den Befehl zwei mal Senden:
Sende Befehl für Ch1 -> Ch1 geht an
Sende Befehl für Ch2 -> Ch2 bleibt aus
Sende Befehl für Ch2 erneut -> Ch2 geht an <-- In diesem Zustand kann ich so oft wie ich will An- und Ausschalten.
Sende Befehl für Ch3 -> Ch3 bleibt aus
Sende Befehl für Ch4 -> Ch4 geht an <-- In diesem Zustand kann ich so oft wie ich will An- und Ausschalten.
Sende Befehl für Ch5 -> Ch5 gleibt aus
usw.
Ich kann auch querbeet durchwechseln erst Ch3 (bleibt aus), dann Ch8 (geht an) usw.
Es sieht so aus als ob nur jeder zweite befehl ankommt. Obwohl ich, wenn ein Channel angegangen ist, ich ihn so oft Schalten kann wie ich möchte, aber sobald ich den Channel wechsle, ich erst wieder zwei mal den Befehl senden muss.
Der Serielle Monitor zeigt mir aber an das jeder Befehl korrekt beim Arduino ankommt.
So nun noch zum Code:
Arduino
#include <Wire.h>
#define SLAVE_ADDRESS 0x04
int ZahlVonPi = 0;
int state = 0;
void setup() {
for (int PinVonArdu = 22; PinVonArdu <= 29; PinVonArdu++){ //Definiert mehrere Pins, in dem Fall Pin 22-29
pinMode(PinVonArdu,OUTPUT);
}
Serial.begin(9600); // Starte serial output
Wire.begin(SLAVE_ADDRESS); //I2C Slave Adress
// Definiere Empfang und Sendemodul fuer I2C Kommunikation
Wire.onReceive(receiveData);
Wire.onRequest(sendData);
Serial.println("Bereit!");
}
void loop() {
}
void receiveData(int byteCount){
while(Wire.available()) {
ZahlVonPi = Wire.read();
Serial.print("daten erhalten: ");
Serial.println(ZahlVonPi);
for (int PinVonArdu = 22; PinVonArdu <= 29; PinVonArdu++){
if (ZahlVonPi == PinVonArdu)
if (state == 0){
digitalWrite(PinVonArdu, HIGH);
state = 1;
}
else{
digitalWrite(PinVonArdu, LOW);
state = 0;
}
}
}
}
void sendData(){
Wire.write(ZahlVonPi);
}
RaspberryPi
import smbus
import time
# for RPI version 1, use "bus = smbus.SMBus(0)"
bus = smbus.SMBus(1)
# This is the address we setup in the Arduino Program
address = 0x04
def writeNumber(value):
bus.write_byte(address, value)
# bus.write_byte_data(address, 0, value)
return -1
def readNumber():
number = bus.read_byte(address)
# number = bus.read_byte_data(address, 1)
return number
while True:
var = input("Enter Pin number: ")
if not var:
continue
writeNumber(var)
print "RPI: Hi Arduino, I sent you ", var
number = readNumber()
print "Arduino: Hey RPI, I received a digit ", number
print
Hoffe Ihr versteht was ich meine
Mit freundlichen Grüßen
MasterTroll