2 arduino’s koppelen

Hardware geleverd door Arduino
Berichten: 9
Geregistreerd: 22 Jul 2019, 16:14

2 arduino’s koppelen

Berichtdoor jobbeke » 30 Apr 2020, 21:51

Ik heb 2 uno’s die dezelfde software draaien en die elk 2 motoren aansturen, nu zou ik graag de status van de 2 motoren uitwisselen via een digitale pin vb pin 5 (out) naar pin 6 (in) op de andere arduino en de gnd verbonden. Kan dit ?

Advertisement

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: 2 arduino’s koppelen

Berichtdoor Koepel » 01 Mei 2020, 00:10

Ja, dat kan, maar het heeft consequenties.
Wat ik hierna opnoem is nog geen 10% van de mogelijkheden.

Hoeveel draden wil je gaan gebruiken ? Een enkele draad samen met GND ?
Dan zou je een SoftwareSerial kunnen draaien op beide boards, waarbij de ene alleen de TX gebruikt en de andere alleen RX.
De SoftwareSerial neemt echter vrijwel de gehele Arduino in beslag, dus dan zal er verder nog maar weinig werken.

Als je AltSoftSerial kunt gebruiken op een lage baudrate, zoals 9600 baud, dan blijft er nog wat voor de Arduino over om andere dingen te doen.
De AltSoftSerial heeft vaste pinnen: https://www.pjrc.com/teensy/td_libs_AltSoftSerial.html.

Via de I2C bus kun je ook gegevens over sturen. Maar helaas is de meeste voorbeeldcode niet correct. Een foutje is snel gemaakt.

Een mogelijkheid is ook nog om het draadloos over te sturen. Soms is dan de SPI bus nodig.

Je kunt misschien de Uno boards vervangen door Leonardo boards, die hebben een vrije hardware seriële poort.

Wat dacht je van een Arduino Mega 2560 toevoegen ? Die heeft 3 vrije seriële poorten.

Des te ingewikkelder je iets maakt, des te groter de kans op problemen.
Is het mogelijk om één Arduino board te gebruiken voor alle motoren ?

Berichten: 9
Geregistreerd: 22 Jul 2019, 16:14

Re: 2 arduino’s koppelen

Berichtdoor jobbeke » 01 Mei 2020, 14:04

Ik heb de status van de 2 motoren nodig omdat ik ze 2 aan 2 synchroon wil laten draaien dmv sensoren, dit werkt nu allemaal. Ik dacht 3 draden voor 2 motoren, ik heb per uno ook een relais schield van telkens 4 relais, vandaar de 2 unos.
Is het niet mogelijk om de 5v van een digitale pin te gebruiken als pull up op de andere arduino ?

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: 2 arduino’s koppelen

Berichtdoor Koepel » 01 Mei 2020, 15:55

Wil je geen gegevens doorsturen, maar een digitale uitgang LOW of HIGH maken en daar de ander op laten synchroniseren ? Natuurlijk kan dat.
Waar je een pullup (weerstand) voor nodig hebt begrijp ik niet.

Dus de GND met elkaar verbinden.
De ene een pinMode(5, OUTPUT) en dan digitalWrite(5, HIGH) of digitalWrite(5, LOW).
De andere een pinMode(6, INPUT) en dan digitalRead(6)

Hoe je dat in je sketch zelf laat synchroniseren is een ander verhaal.

Berichten: 9
Geregistreerd: 22 Jul 2019, 16:14

Re: 2 arduino’s koppelen

Berichtdoor jobbeke » 01 Mei 2020, 16:36

De pullup gebruik ik om mijn sensoren te testen en om de status van de andere motoren te controleren
Ik ben van opleiding programmeur analist en ken niet veel van electronica

Zie hier mijn sketch voor linkse kant, rechtse kant is idem dus totaal 8 relais en 4 motoren (de relais gebruik ik als voorschakeling van auto relais)


/*
Input 1 = Schakelaar motor 1
Input 2 = Einde koers
Input 3 = Schakelaar motor 2
Input 5 = Status motor 1 andere kant
Input 6 = Status motor 2 andere kant
Input 11 = Sleutel Links
Input 13 = Sleutel Rechts
*/

// Lezen sleutel
byte InLinks = 0;
byte InRechts = 0;

//motors
const byte Relais1 = 4;
const byte Relais2 = 7;
const byte Relais3 = 8;
const byte Relais4 = 12;

//sensoren Sensor Motor 1 en 2 zijn sensoren op het einde
byte SensorMotor1;
byte SensorEindeKoers;
byte SensorMotor2;

//onze status naar andere motoren
const byte StatusMotor1Out = 9;
const byte StatusMotor2Out = 10;

//status andere motoren
byte StatusMotor1In;
byte StatusMotor2In;

//Sleutel links of rechts
byte lr = 0;
byte error = 0;

bool Motor1Gestart = 0;
bool Motor2Gestart = 0;


unsigned long mstijd = 0;
unsigned long msvorige = 0;
unsigned int msinterval = 500;
unsigned int mdelay = 3000;
unsigned int mssec;

void setup() {
pinMode (1, INPUT);
pinMode (2, INPUT);
pinMode (3, INPUT);

pinMode (5, INPUT);
pinMode (6, INPUT);
pinMode (0, INPUT);
pinMode (11, INPUT);

pinMode (StatusMotor1Out, OUTPUT);
pinMode (StatusMotor2Out, OUTPUT);

pinMode (Relais1, OUTPUT);
pinMode (Relais2, OUTPUT);
pinMode (Relais3, OUTPUT);
pinMode (Relais4, OUTPUT);

pinMode(LED_BUILTIN, OUTPUT);

digitalWrite(1, HIGH);
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);

Serial.begin(9600);
motor1links(LOW);
motor2links(LOW);
motor1rechts(LOW);
motor2rechts(LOW);
}

void loop() {
leescontact();
if (lr == 0) {
motor1links(LOW);
motor2links(LOW);
motor1rechts(LOW);
motor2rechts(LOW);
}


if (error == 0) {
if (lr == 1) {
naarlinks();
}
}
if (error == 0) {
if (lr == 2) {
naarrechts();
}
}
}

void naarlinks() {
if (Motor2Gestart == LOW) {
if (Motor1Gestart == LOW) {
motor1linksstart();
} else {
motor1linksstop();
}
}
if (Motor1Gestart == LOW) {
if (Motor2Gestart == LOW) {
motor2linksstart();
} else {
motor2linksstop();
}
}
}

void motor1linksstart() {
if (SensorMotor2 == HIGH) {
if ((SensorEindeKoers == LOW && SensorMotor1 == HIGH) || SensorMotor1 == LOW) {
digitalWrite(StatusMotor1Out, HIGH);
if (StatusMotor1In == HIGH) {
motor1links(HIGH);
}
}
}
}
void motor1linksstop() {
if (SensorEindeKoers == HIGH || SensorMotor1 == HIGH || SensorMotor2 == LOW) {
motor1links(LOW);
msvorige = 0;
} else {
if (StatusMotor1In == LOW) {
if (msvorige == 0) {
msvorige = millis();
}
mstijd = millis();
if (msvorige + msinterval >= mstijd) {
motor1links(LOW);
}
}
}
}
void motor1links(bool LH) {
digitalWrite(Relais2, LH);
Motor1Gestart = LH;
digitalWrite(StatusMotor1Out, LH);
delay(mdelay);
/*
if (LH == LOW && SensorEindeKoers == LOW) {
error = 1;
}
*/
}

void motor2linksstart() {
if (SensorMotor1 == HIGH) {
if ((SensorMotor2 == HIGH && SensorEindeKoers == HIGH) || SensorMotor2 == LOW) {
digitalWrite(StatusMotor2Out, HIGH);
if (StatusMotor2In == HIGH) {
motor2links(HIGH);
}
}
}
}
void motor2linksstop() {
if (SensorMotor2 == HIGH || SensorMotor1 == LOW) {
motor2links(LOW);
msvorige = 0;
} else {
if (StatusMotor2In == LOW) {
if (msvorige == 0) {
msvorige = millis();
}
mstijd = millis();
if (msvorige + msinterval >= mstijd) {
motor2links(LOW);
}
}
}
}
void motor2links(bool LH) {
digitalWrite(Relais4, LH);
Motor2Gestart = LH;
digitalWrite(StatusMotor2Out, LH);
delay(mdelay);
/*
if (LH == LOW && SensorEindeKoers == HIGH) {
error = 2;
}
*/
}

void naarrechts() {
if (Motor2Gestart == LOW) {
if (Motor1Gestart == LOW) {
motor1rechtsstart();
} else {
motor1rechtsstop();
}
}
if (Motor1Gestart == LOW) {
if (Motor2Gestart == LOW) {
motor2rechtsstart();
} else {
motor2rechtsstop();
}
}
}

void motor1rechtsstart() {
if (SensorMotor2 == HIGH) {
if ((SensorEindeKoers == HIGH && SensorMotor1 == HIGH) || SensorMotor1 == LOW) {
digitalWrite(StatusMotor1Out, HIGH);
if (StatusMotor1In == HIGH) {
motor1rechts(HIGH);
}
}
}
}
void motor1rechtsstop() {
if (SensorMotor1 == HIGH || SensorMotor2 == LOW) {
motor1rechts(LOW);
msvorige = 0;
} else {
if (StatusMotor1In == LOW) {
if (msvorige == 0) {
msvorige = millis();
}
mstijd = millis();
if (msvorige + msinterval >= mstijd) {
motor1rechts(LOW);
}
}
}
}
void motor1rechts(bool LH) {
digitalWrite(Relais1, LH);
digitalWrite(Relais2, LH);
Motor1Gestart = LH;
digitalWrite(StatusMotor1Out, LH);
delay(mdelay);
/*
if (LH == LOW && SensorEindeKoers == HIGH) {
error = 1;
testled(error);
}
*/
}

void motor2rechtsstart() {
if (SensorMotor1 == HIGH) {
if ((SensorEindeKoers == LOW && SensorMotor2 == HIGH) || SensorMotor2 == LOW) {
digitalWrite(StatusMotor2Out, HIGH);
if (StatusMotor2In == HIGH) {
motor2rechts(HIGH);
}
}
}
}
void motor2rechtsstop() {
if (SensorMotor2 == HIGH || SensorMotor1 == LOW) {
motor2rechts(LOW);
msvorige = 0;
} else {
if (StatusMotor2In == LOW) {
if (msvorige == 0) {
msvorige = millis();
}
mstijd = millis();
if ((msvorige + msinterval) >= mstijd) {
motor2rechts(LOW);
}
}
}
}
void motor2rechts(bool LH) {
digitalWrite(Relais3, LH);
digitalWrite(Relais4, LH);
Motor2Gestart = LH;
digitalWrite(StatusMotor2Out, LH);
/*
if (LH == LOW) {
error = 4;
while (error != 0) {
if (SensorEindeKoers == LOW) {
leescontact();
error = 4;
testled(error);
} else {
error = 0;
}
}*/
delay(mdelay);
}


void leescontact() {
if (digitalRead(1) == LOW) {
SensorMotor1 = HIGH;
} else {
SensorMotor1 = LOW;
}
if (digitalRead(2) == LOW) {
SensorEindeKoers = HIGH;
} else {
SensorEindeKoers = LOW;
}
if (digitalRead(3) == LOW) {
SensorMotor2 = HIGH;
} else {
SensorMotor2 = LOW;
}
// StatusMotor1In = digitalRead(5);
// StatusMotor2In = digitalRead(6);
StatusMotor1In = HIGH;
StatusMotor2In = HIGH;

InLinks = digitalRead(0);
InRechts = digitalRead(11);
if (InLinks == LOW && InRechts == LOW) {
lr = 0;
}
if (InLinks == HIGH && InRechts == HIGH) {
lr = 0;
error = 100;
} else {
if (InLinks == HIGH) {
lr = 1;
}
if (InRechts == HIGH) {
lr = 2;
}
}
}

void testled(int mssec) {
mssec = mssec * 1000;
digitalWrite(LED_BUILTIN, HIGH);
delay(mssec);
digitalWrite(LED_BUILTIN, LOW);
delay(500);

}

Gebruikers-avatar
Berichten: 631
Geregistreerd: 15 Nov 2015, 11:54

Re: 2 arduino’s koppelen

Berichtdoor Gij Kieken » 01 Mei 2020, 18:10

Gebruik een arduino mega als je i/o te kort komt ofwel bv een i²c uitbreiding als je het toch op een uno wilt.

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: 2 arduino’s koppelen

Berichtdoor shooter » 04 Mei 2020, 09:35

je hebt nogal wat mogelijkheden:
allereerst je programma denk eens aan switch case dat is de volgemnde stap in je kennis. dan kun je een stuk overzichtelijker werken.
de volgende is om alles netjes in een schema te zetten wat je wilt en goede namen. maak ook eens functies aan met variabelen, schrijf commentaar erbij dan blijft het onderhoudsvriendelijk.
en ja je kunt gewoon twee pinnen koppelen, een is dan een uitgang en de andere een ingang. zet er wel een weerstand tussen van 10000 ohm dan blijft je arduino het altijd doen, twee uitgangen tegen elkaar is twee arduino binnen 1 seconde kapot.
een volgende stap is communicatie tussen twee arduinos maken. bijvoorbeeld i2c, maar ook parralel is mogelijk, gebruik dan een bekend protocol, ipv zelf verzonnen, dan leer je wat bij, kijk dan naar CRC en foutcorrectie en zo bouw je nog wat leuks ook nog.
zorg wel dat je commentaar en een verslag maakt daar heb je wat aan op school.
paul deelen
shooter@home.nl

Berichten: 9
Geregistreerd: 22 Jul 2019, 16:14

Re: 2 arduino’s koppelen

Berichtdoor jobbeke » 05 Mei 2020, 00:50

shooter schreef:je hebt nogal wat mogelijkheden:
allereerst je programma denk eens aan switch case dat is de volgemnde stap in je kennis. dan kun je een stuk overzichtelijker werken.
de volgende is om alles netjes in een schema te zetten wat je wilt en goede namen. maak ook eens functies aan met variabelen, schrijf commentaar erbij dan blijft het onderhoudsvriendelijk.
en ja je kunt gewoon twee pinnen koppelen, een is dan een uitgang en de andere een ingang. zet er wel een weerstand tussen van 10000 ohm dan blijft je arduino het altijd doen, twee uitgangen tegen elkaar is twee arduino binnen 1 seconde kapot.
een volgende stap is communicatie tussen twee arduinos maken. bijvoorbeeld i2c, maar ook parralel is mogelijk, gebruik dan een bekend protocol, ipv zelf verzonnen, dan leer je wat bij, kijk dan naar CRC en foutcorrectie en zo bouw je nog wat leuks ook nog.
zorg wel dat je commentaar en een verslag maakt daar heb je wat aan op school.

Tis wel een praktijk project voor mijn zwembad

Terug naar Arduino hardware

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 12 gasten