Hallo,
vorab möchte ich betonen, dass dies mein erstes Arduino Projekt ist und ich noch sehr wenig Ahnung habe, wie bestimmte Bauteile mit meinem Code interagieren bzw. welche Besonderheiten evtl. zu beachten sind. Programmiererfahrung habe ich bereits. (Ich benutze einen Arduino Uno R3)
Ich habe mir ein Torzählwerk für einen Airhockey Tisch gebastelt. Nach viel Recherchearbeit funktioniert auch eigentlich alles ganz gut nur die Infrarot LED und der Sensor bereiten mir ein wenig Kopfschmerzen.
Beim Programmieren hatte ich die LED und Sensor noch recht eng zusammen stehen, quasi als "Trockenübung" wobei das Reaktionsverhalten noch ganz gut war. (Ich konnte meine Finger oder auch den Puck zwischen beide halten und es wurde fast immer eine Unterbrechung erkannt...)
Ich hatte allerdings schon im Vorraus etwas Zweifel, ob sich das ganze überhaupt mit einer Infrarot LED und einem Sensor realisieren lässt, da ich ahnte, dass der Puck zu schnell und zu dünn für das System ist. Nach provisorischem Einbau in den Airhockey Tisch habe ich nun ein sehr komisches Verhalten des Sensors bemerkt:
- Er reagiert nur noch sehr schwer auf jegliche Unterbrechungen egal wie eng LED und Sensor
zusammen stehen, - Es scheint egal zu sein ob die LED überhaupt leuchtet, wenn ich den Sensor mit dem Finger abdecke
wird ein Signal registriert. - An der LED kommen nur 0,45V an, obwohl die meisten erst ab 1,3V - 1,9V betrieben werden. (Ich
habe das Gefühl, dass das Signal zu schwach ist)
Die LEDs sind beide an Port 3~ gesteckt und parallel geschaltet. (Brauche das Signal nur gleichzeitig auf beiden Seiten) Die Sensoren sind an Port 2 und 4 gesteckt.
Um die LEDs anzusteuern benutze ich die IRremote.h Library
Ich war mir lange unsicher ob ich die Sensoren als Digitalen oder Analogen Input interpretieren lasse. Da ich aber nur eine volle Unterbrechung registrieren will, dachte ich, dass die Digitale Variante funktionieren sollte...(nach Guide)
Außerdem habe ich in meinem Code eine Art Menü eingebaut, (Habe ein Display und Schalter zur Spielmodi Wahl/ Torstandsanzeige) welches in der Loop() abgefragt/ aktualisiert wird, sodass die Senorenabfrage nicht in der Loop() sondern in einer While-Schleife stattfindet. Gibt es deswegen Probleme? Ist die While-Schleife zu "langsam" um eine Unterbrechung genau zu registrieren?
Alles in allem habe ich alles nach verschiedenen Guides/Tutorials zusammengebaut und meine eigenen Ergänzungen gemacht. Vor allem was die Schaltung angeht.
Hier die IR-LED/Sensor Kombo die ich benutze:
Code(NUR DAS WICHTIGE):
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <IRremote.h>
#include <IRremoteInt.h>
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
//....weitere unwichtige Variablen
//.
//.
//....................
#define PIN_IR 3
#define PIN_DETECT 2
#define PIN_DETECT_TWO 4
#define PIN_STATUS 13
IRsend irsend;
//....
void setup()
{
pinMode(enterButton, INPUT_PULLUP);
pinMode(modeButton, INPUT_PULLUP);
pinMode(buzzer, OUTPUT);
pinMode(PIN_DETECT, INPUT);
pinMode(PIN_DETECT_TWO, INPUT);
pinMode(PIN_STATUS, OUTPUT);
irsend.enableIROut(38);
irsend.mark(0);
lcd.begin(20,4);
//.....
homescreen();
updateMenu();
}
void loop() {
//Menü
if(!digitalRead(modeButton))
{
modeCounter++;
updateMenu();
delay(100);
while(!digitalRead(modeButton));
}
if(!digitalRead(enterButton))
{
execute();
delay(100);
updateMenu();
delay(100);
while(!digitalRead(enterButton));
}
}
//Beispielspielmodi
//goalsReq = variable Anzahl von Toren zum Sieg
void goals(int goalsReq){
lcd.clear();
lcd.home();
delay(1000);
while(digitalRead(enterButton) && isWon == false)
{
irsend.space(0);
delay(1);
irsend.mark(0);
if(!digitalRead(PIN_DETECT))
{
beep();
goalCounter_One++;
lcd.clear();
}
if(!digitalRead(PIN_DETECT_TWO))
{
beep();
goalCounter_Two++;
lcd.clear();
}
updateGoalDif(goalCounter_One, goalCounter_Two);
checkForWin(goalsReq);
}
goalCounter_One = 0;
goalCounter_Two = 0;
isWon = false;
lcd.clear();
}
//......
//....
Ich hoffe jemand kann mir weiterhelfen!
MfG.
NineCookiez
PS: Falls die Schaltung ein Hauptsächlicher Fehlergrund sein könnte, werde ich sie noch posten.(Ist nur etwas blöd verbaut, muss sie erst wieder rausfummlen und sketchen )