Arduino schakelen met arduino?

Alles wat niet past in bovenstaande onderwerpen
Berichten: 9
Geregistreerd: 24 Jun 2018, 19:11

Arduino schakelen met arduino?

Berichtdoor Don75 » 28 Nov 2018, 17:58

Hallo allemaal,
Even een vraag, kan ik een arduino een puls geven (zoals normaal via een schakelaar bijvoorbeeld) via een andere arduino? Dus niet via een bus systeem ofzo.. en mag ik dan een voeding aanhouden, of is het beter deze te scheiden?

Ik ben bezig met een zelfbouwflipperkast en wil graag de diverse systemen (Verlichting,score,mechanisch) uit elkaar houden.. ik denk zo simpeler te kunnen werken daar mijn programmeer kennis laag is..

Vriendelijk gegroet,
Don.

Advertisement

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

Re: Arduino schakelen met arduino?

Berichtdoor Koepel » 28 Nov 2018, 21:42

Natuurlijk kan dat, maar dan weet de zender niet of de ontvanger het ontvangen heeft.

Stel dat de ontvanger in de loop() ergens een delay van 1 seconde heeft, en de puls duurt een halve seconde. Dan wordt dat misschien niet gezien. In dat geval zou je interrupts kunnen gebruiken, maar dan wordt de sketch iets ingewikkelder.

Bij een seriële of I2C bus kun je getallen doorgeven, zoals de score. Dan kan de ontvanger ook gegevens naar de zender doorgeven. En de ontvanger kan bevestigen dat de gegevens ontvangen zijn.

Wanneer de onderdelen een aparte voeding hebben, dan zou je voor de zekerheid alles gescheiden kunnen houden door opto-couplers te gebruiken. Als echter de GND pinnen van beide Arduino boards toch al met elkaar verbonden zijn, dan kun je met een draadje tussen twee pinnen volstaan. Dan zou ik een weerstand van 470 Ω of 1k in die draad kunnen opnemen, dat is een heel stuk veiliger.

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

Re: Arduino schakelen met arduino?

Berichtdoor shooter » 28 Nov 2018, 23:05

wat wil je allemaal gebruiken, en het programmeren kun je zelfs met scratch for arduino, dat is zo simpel dat een kind van 10 het op school krijgt.
bedenk wel dat er best veel vermogen door de mechanische kant gevraagd wordt, dus daar zul je transistoren oid moeten gebruiken.
Heb je al een opztje gemaakt?
paul deelen
shooter@home.nl

Berichten: 9
Geregistreerd: 24 Jun 2018, 19:11

Re: Arduino schakelen met arduino?

Berichtdoor Don75 » 30 Nov 2018, 11:50

bedankt voor je reactie,

ik heb enkele arduino mega's liggen welke ik wil gebruiken. ik ben bezig geweest met dot matrix voor de score maar ik krijg dat enkel aan de gang met scrollende tekst, terwijl ik alleen maar score wil laten zien.
Met een 7 segment display is het me wel gelukt om een puntentelling te maken. echter krijg ik er dan geen extra dingen meer bij. (door mijn gebrek aan kennis in het programmere waarschijnlijk)

Ook ben ik erachter dat ik meer wil dan een enkele arduino aan in en uitgangen heeft.. haha
Zodoende is mijn gedachte om alles te scheiden, en ik ga dit dan ook doen.

ik heb van de week al iets geschreven (in IDE) waarmee ik de targetschakelaars aan de verlichting wil koppelen, ook wil ik zo een puls geven aan de volgende arduino (niet direct maar via een transistor)

const int target1 = A1; //analoge ingang voor targetschakelaar 1 aan pin A1
const int target2 = A2; //analoge ingang voor targetschakelaar 2 aan pin A2
const int target3 = A3; //analoge ingang voor targetschakelaar 3 aan pin A3

int Score1 = 22; //score1 = 10 punten aan pin 22
int Score2 = 23; //score2 = 15 punten aan pin 23
int Score3 = 24; //score3 = 25 punten aan pin 24

int Led1 = 25; //Led1 uitgang aan pin 25
int Led2 = 26; //Led2 uitgang aan pin 26
int Led3 = 27; //Led3 uitgang aan pin 27


void setup() {

pinMode (target1, INPUT_PULLUP);
pinMode (target2, INPUT_PULLUP);
pinMode (target3, INPUT_PULLUP);

pinMode (Score1, OUTPUT);
pinMode (Score2, OUTPUT);
pinMode (Score3, OUTPUT);

pinMode (Led1,OUTPUT);
pinMode (Led2,OUTPUT);
pinMode (Led3,OUTPUT);

for (int i=25; i<28; i++);

}

void loop() {

if (digitalRead (target1) == LOW) { // zodra target1 ingedrukt is
while (digitalRead (target1)== LOW) {} // zolang target1 ingedrukt is
delay(20); // contactdender elimineren
digitalWrite (Led1,HIGH); // Led1 gaat aan
digitalWrite (Score1,HIGH); // score1 wordt verstuurd
delay(5); // pulsduur
digitalWrite (Score1,LOW); // einde scorepuls
}

if (digitalRead (target2) == LOW) { // zodra target2 ingedrukt is
while (digitalRead (target2)== LOW) {} // zolang target2 ingedrukt is
delay(20); // contactdender elimineren
digitalWrite (Led2,HIGH); // Led2 gaat aan
digitalWrite (Score1,HIGH); // score1 wordt verstuurd
delay(5); // pulsduur
digitalWrite (Score1,LOW); // einde scorepuls
}

if (digitalRead (target3) == LOW) { // zodra target3 ingedrukt is
while (digitalRead (target3)== LOW) {} // zolang target3 ingedrukt is
delay(20); // contactdender elimineren
digitalWrite (Led3,HIGH); // Led3 gaat aan
digitalWrite (Score1,HIGH); // score1 wordt verstuurd
delay(5); // pulsduur
digitalWrite (Score1,LOW); // einde scorepuls
}

if (digitalRead (Led1) == HIGH && digitalRead (Led2) == HIGH && digitalRead (Led3) == HIGH){ //lees uit of Led1,2 en 3 hoog zijn
while (digitalRead (Led1) == HIGH && digitalRead (Led2) == HIGH && digitalRead (Led3) == HIGH) //terwijl deze hoog zijn
delay (500); //hoog laten voor 500 milliseconde
digitalWrite (Led1,LOW); //led1,2 en 3 gaan uit
digitalWrite (Led2,LOW);
digitalWrite (Led3,LOW);
digitalWrite (Score2,HIGH); //score2 wordt verstuurd
delay(5); //pulsduur
digitalWrite (Score2,LOW); //einde puls

}

}

waarschijnlijk te omslachtig voor de ervaren mensen zoals jullie, maar zo begrijp ik het zelf nog.. haha(ik ben totaal nieuw in dit en wil het leren en ik moet ergens beginnen toch ;))

Berichten: 9
Geregistreerd: 24 Jun 2018, 19:11

Re: Arduino schakelen met arduino?

Berichtdoor Don75 » 30 Nov 2018, 18:26

hier nog de code die ik in gedachte had voor de 2e arduino (score)
Code: Alles selecteren

#define MAX7219_DIN 6  // set up voor het 7 segment display
#define MAX7219_CS  7
#define MAX7219_CLK 8

#define ScoreCount 4   // set up aantal scoretypes

int Score1 = 9;
int Score2 = 10;
int Score3 = 11;
int Score4 = 12;

typedef struct Score   
{                         
  byte detectPin;
  byte hit;
};

uint16_t score;       //variabele om score op te slaan


  int last_a = 0;
  int last_b = 0;
  int last_c = 0;
  int last_d = 0;


// the setup function runs once when you press reset or power the board
void setup() {

  pinMode(Score1, INPUT);
  pinMode(Score2, INPUT);
  pinMode(Score3, INPUT);
  pinMode(Score4, INPUT);

  //   Serial.begin(9600);
  //   Serial.println("Ready to begin!");
 
  initialiseMAX7219();
  output(0x0f, 0x00); //display test register - test mode off
  output(0x0c, 0x01); //shutdown register - normal operation
  output(0x0b, 0x07); //scan limit register - display digits 0 thru 7
  output(0x0a, 0x0f); //intensity register - max brightness
  output(0x09, 0xff); //decode mode register - CodeB decode all digits
  output(0x08, 0x0c); //digit 7 (leftmost digit) data
  output(0x07, 0x0b);
  output(0x06, 0x0d);
  output(0x05, 0x0e);
  output(0x04, 0x08);
  output(0x03, 0x07);
  output(0x02, 0x06);
  output(0x01, 0x05); //digit 0 (rightmost digit) data
}

// the loop function runs over and over again forever
void loop()
{
  detectScore();
  displayScore(score);
}


//dit laat de score zien
void displayScore(int score)
{
  //reken het aantal getallen uit
  String myString = String(score);
  int numberOfDigits = myString.length();
    //laat ongebruikte getallen leeg
    for (int i = 8; i > numberOfDigits; i--)
    {
      output(i, 0x0F);
    }
 
    //schrijf de getallen naar het display
    for (int i = 1; i <= numberOfDigits; i++)
    {
      output(i, myString[numberOfDigits-i]);
    }
} //einde van score display

//dit controleert wanneer de scoretypes hoog zijn
void detectScore()
{
  int a = digitalRead(Score1);
  int b = digitalRead(Score2);
  int c = digitalRead(Score3);
  int d = digitalRead(Score4);

      //Controleer of Score1 hoog is
       if(a != last_a){
          if (a == HIGH) {    // Score1 is hoog
        }
        else {                // Score1 is weer laag Score wordt opgeteld
          Serial.print(score);     score += 10;
        }
        delay(50);
        last_a = a;
        }
      //Controleer of Score2 hoog is       
       if(b != last_b){
          if (b == HIGH) {    // Score2 is hoog
        }
        else {                // Score2 is weer laag Score wordt opgeteld       
          Serial.print(score);     score += 15;
        }
        delay(50);
        last_b = b;
        }
      //Controleer of Score3 hoog is 
       if(c != last_c){
          if (c == HIGH) {   // Score3 is hoog
        }
        else {               // Score3 is weer laag Score wordt opgeteld     
          Serial.print(score);     score += 25;
        }
        delay(50);
        last_c = c;
        } 
      //Controleer of Score4 hoog is
       if(d != last_d){
          if (d == HIGH) {   // Score4 is hoog
        }
        else {               // Score4 is weer laag Score wordt opgeteld       
          Serial.print(score);    score += 100;
        }
        delay(50);
        last_d = d;
        }

}


void initialiseMAX7219()   //  MAX7219 7-Segment LED Display
{
  digitalWrite(MAX7219_CS, HIGH);
  pinMode(MAX7219_DIN, OUTPUT);
  pinMode(MAX7219_CS, OUTPUT);
  pinMode(MAX7219_CLK, OUTPUT);
}
//common routine to talkt o MAX7219
void output(byte address, byte data)
{
  digitalWrite(MAX7219_CS, LOW);
  shiftOut(MAX7219_DIN, MAX7219_CLK, MSBFIRST, address);
  shiftOut(MAX7219_DIN, MAX7219_CLK, MSBFIRST, data);
  digitalWrite(MAX7219_CS, HIGH);
}

Berichten: 9
Geregistreerd: 24 Jun 2018, 19:11

Re: Arduino schakelen met arduino?

Berichtdoor Don75 » 30 Nov 2018, 18:28

de 2e code is grotendeels gekopieerd, (het max7219 gedeelte) maar als werkt vindt ik het goed ;)

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

Re: Arduino schakelen met arduino?

Berichtdoor Koepel » 30 Nov 2018, 19:47

Volgens mij maak je het met twee Arduino boards minstens twee keer zo moeilijk :shock:

Alles op één Arduino Mega 2560 met gebruik van millis() in plaats van delay() heeft voordelen.

Je geeft pulsen van 5 ms. Dat is heel erg kort. Daarna haal je die puls weg, en volgens mij is dan ook de score weg.
En de ontvanger heeft delays van 50 ms. Dus die puls van 5 ms heb je dan al 10 keer gemist.

Volgens mij gaat je idee niet werken :cry: Ik zie ook geen manier om het wel werkend te krijgen met pulsen. Het lijkt me beter dat je iets geheel anders kiest.

Je gebruikt Arduino functies en eigen functies met parameters en de C++ taal. Dus je hebt de basis. Het gaat er nu om, dat je de echte wereld kunt omzetten naar iets dat logisch is (een tekening met blokjes, een waarheidstabel, een stroomdiagram), en dat dan weer omzetten naar code. Hou daarbij in de gaten dat bij iedere delay() de sketch even niets zit doen, terwijl er ondertussen dingen aan de ingangen kunnen veranderen.

Heb je wel eens een sketch gemaakt die commando's van de seriële monitor leest ? Een seriële verbinding is eenvoudig.
Daarna wordt het snel moeilijker.
Alles op één Arduino board en de hele sketch met millis() heeft enorme voordelen, maar dat kost tijd om dat onder de knie te krijgen.
Het kan nog moeilijker en tegelijk ook eenvoudiger. Er is een eenvoudige schedular voor een Arduino M0/Zero/MKR: https://www.arduino.cc/en/Reference/Scheduler. Dan is de code eenvoudig, maar het kan ook sneller helemaal verkeerd gaan.

Berichten: 9
Geregistreerd: 24 Jun 2018, 19:11

Re: Arduino schakelen met arduino?

Berichtdoor Don75 » 30 Nov 2018, 20:22

Okay, Bedankt voor je reactie :)
De delays is wel logisch inderdaad. Dat ga ik veranderen.

Maar even voor mijn beeld vorming.
Ik geef nu met een schakelaar een puls naar de score code en dat werkt (slechts tot 65000 punten weliswaar dus daar zit nog iets fout .. ??)
Maar waarom zou dit pulsje niet anders gegeven kunnen worden? Via een transistor bijvoorbeeld.

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

Re: Arduino schakelen met arduino?

Berichtdoor Koepel » 30 Nov 2018, 21:51

Zie mijn eerste reactie op je vraag.
Wanneer de sketch delay()'s heeft, dan is het mogelijk een puls te ontvangen met een interrupt.
Het wordt dus sowieso investeren in tijd, om interrupts en millis() te bekijken.

Als ik naar beide sketches kijk, dan mis ik een logische opbouw. Dus als daar interrupts aan toegevoegd worden, dan is het alsnog nodig om die sketches anders te doen.

Okay, je kunt bijvoorbeeld de score optellen met een puls en dan nog een tweede signaal om met een puls de score te resetten.
Maar nu wil je de score doorgeven met 4 signalen voor +1, +15, +25 en +100. En hoe ga je dat resetten naar nul ?

De Arduino Uno heeft maar twee "echte" interrupts. De Mega 2560 heeft er gelukkig zes. Voor de interrupts op de andere pinnen is een library nodig: https://github.com/GreyGnome/EnableInterrupt.
En dan is het alsnog nodig om de puls niet te kort te maken, omdat sommige libraries (NeoPixel, DHT11/DHT22) de interrupts soms uitzetten.

De Arduino Mega 2560 heeft 3 ongebruikte seriële poorten. Dan kun je een paar van die boarden via een seriële verbinding met elkaar laten praten.

Terug naar Theekransje

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 1 gast