Arduino schakelen met arduino?
9 berichten
• Pagina 1 van 1
Arduino schakelen met arduino?
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.
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
Re: Arduino schakelen met arduino?
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.
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.
Re: Arduino schakelen met arduino?
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?
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
shooter@home.nl
Re: Arduino schakelen met arduino?
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 )
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 )
Re: Arduino schakelen met arduino?
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);
}
Re: Arduino schakelen met arduino?
de 2e code is grotendeels gekopieerd, (het max7219 gedeelte) maar als werkt vindt ik het goed
Re: Arduino schakelen met arduino?
Volgens mij maak je het met twee Arduino boards minstens twee keer zo moeilijk
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 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.
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 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.
Re: Arduino schakelen met arduino?
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.
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.
Re: Arduino schakelen met arduino?
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.
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.
9 berichten
• Pagina 1 van 1
Wie is er online?
Gebruikers in dit forum: Geen geregistreerde gebruikers en 2 gasten