PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Auslösen von Befehlen, durch Signalübergabe eines Arduinos an ein anderen Arduino



wendtdir
26.04.2018, 18:43
Hallo,

der Titel ist relativ lang, nennt aber meine Anliegen.

Ich habe zwei Arduinos. Beim zweiten Arduino habe ich einen Digitalen I/O Pin auf Input gesetzt und beim ersten einen Digitalen Pin auf Output. Ich möchte, folgendes erreichen, wenn ich im ersten Arduino den Output-Pin auf High setze, soll auf dem zweiten Arduino ein Programm ablaufen.

Ist das möglich?

Code Arduino 1




#define test 9

void setup() {

pinMode(test, OUTPUT);

}

void loop() {

digitalWrite(test, HIGH);

}



Code Arduino 2




#define rot 8
#define gruen 2
#define kp 6



void setup() {

pinMode (rot, OUTPUT);
pinMode (gruen, OUTPUT);
pinMode (kp, INPUT);

}

void loop() {


if (digitalRead(kp) == HIGH){

digitalWrite (rot, HIGH);
digitalWrite (gruen, HIGH);
}

else {

digitalWrite (rot, HIGH);
digitalWrite (gruen, LOW);
}


delay(1000);

}

Wenn kp High ist, also eine Spannung anliegt, sollen beide LEDs leuchten, wenn keine Spannung am Pin KP anliegt, soll nur rot leuchten.

33432

Es schaut aber so aus, als würde die grüne LED mal leuchten mal nicht, habe ich einen Fehler in meinem Gedankengang?

wkrug
26.04.2018, 22:42
Ich würde mal das delay(1000); rausmachen.
Denn so lange der Controller im Delay wartet kann er nichts anderes mehr tun undie LED's bleiben wie sie waren.

Ist das möglich?
Es gibt unzählige Möglichkeiten so etwas zu realisieren.
Eine Möglichkeit wäre auch durch ein Signalflanke am Controller 1 einen Interrupt an Controller 2 auszulösen.
Das hätte den Vorteil das das Programm nur einmal pro Signaländerung ausgeführt würde.
Pin Change Interupts gehen natürlich auch.
Auch eine Komunikation über eine der Hardwareschnittstellen ( USART, SPI, I²C ) zwischen den beiden Controllern ist möglich und bietet viel mehr Austauschoptionen als ein simpler Portpin.

Rabenauge
27.04.2018, 10:31
Schreib das mal ungefähr so:

bool leseWert;
leseWert=digitalRead(kp);
if(leseWert==HIGH)
{
.....
.....
}

Deine Methode _müsste_ eigentlich auch funktionieren, aber aus Erfahrung weiss ich: manchmal funktioniert es eben nicht.

HaWe
27.04.2018, 13:18
Schreib das mal ungefähr so:

bool leseWert;
leseWert=digitalRead(kp);
if(leseWert==HIGH)
{
.....
.....
}

Deine Methode _müsste_ eigentlich auch funktionieren, aber aus Erfahrung weiss ich: manchmal funktioniert es eben nicht.

Ich finde persönlich, bool sollte man nur mit TRUE oder FALSE verwenden, nicht mit high oder low, auch wenn es logisch äquivalent ist.

stattdessen gehen aber sicherlich auch die Datentypen char oder byte für leseWert problemlos mit deinem Code, und sie benötigen in C(++) auch denselben Speicher.

i_make_it
27.04.2018, 15:32
Auc hwenn es hier vermutlich nicht die Ursache ist,
Digitalsignale haben 3 Spannungszustände.
Low, nicht Definiert und High.
Momentan ist der Ausgang High wenn der Eingang High ist und wenn der Eingang Low und nicht definiert ist ist der Ausgang Low.

Kehrt man die Befehlslogik um, ist der Ausgang nur Low wenn der Eingang low ist.
Sonst ist er High.


if (digitalRead(kp) == LOW){

digitalWrite (rot, HIGH);
digitalWrite (gruen, LOW);
}

else {

digitalWrite (rot, HIGH);
digitalWrite (gruen, HIGH);
}


Ein Versuch würde zeigen ob es was bringt oder nicht.

wendtdir
27.04.2018, 16:17
Hallo,

danke, für die vielen Antworten. Ich werde das alles mal nach und nach ausprobieren. Bin schon froh, dass ich in meinem Gedankengang also nicht so falsch lag.