Probleem drukknoppen quizbak

Beste

Ik ben bezig met het maken van een quizbak.
Werking:
Controleren wie er eerst heeft afgedrukt. In de drukknopen van de spelers zitten lampen. deze branden als ze kunnen afdrukken. Zodra iemand afdrukt heeft, begint de lamp bij deze persoon te pikken andere lampen gaan uit.

Mijn probleem:
Alles werkt tot ik mijn drukknoppen aansluit. Het lijkt eventjes perfect te werken, maar na een tijdje begint mijn quizbak raar te doen. Soms begint een lamp te pinken zonder dat er afgedrukt is geweest. Soms kan je helemaal niet meer afduwen omdat de resetknop plots continu een hoog signaal geeft. Je hebt geen controle meer over het systeem. Ik begrijp er niks meer van. Ik heb al mijn drukknoppen afzonderlijk doorgemeten. Deze werken prima.

Ik heb aan elke ingang een pull-down weerstand gehangen. Dus alle ingangen zouden normaal 0V moeten hebben. Wanneer een drukknop wordt ingedrukt komt er 5v op de ingang.

Ook al zijn mijn knoppen soms niet ingedrukt, meet ik toch soms een kleine spanningen op een ingang. Dit zou toch niet mogen (er zijn pull down weerstanden). Wacht enkele minuten en soms doet de quizbak het terug. Het rare is als ik al mijn drukknoppen afkoppel doet de quizbak het terug prima, als ik met een testdraadje mijn contacten maak. Op de foto zie je de koppeling van de drukknoppen de witte draad is telkens 5V de zwarte is het terugkomend signaal. Heeft er iemand een idee wat ik fout doe? Want ik ben een beetje einde raad. Hoe komt het ondanks de pull-down weerstanden ik toch onbetrouwbare ingangen heb? Doordat dat ik ingangen te kort had, heb ik wel de analoge ingangen gebruikt. Maar deze mag je normaal gezien toch gebruiken als digitale ingangen? Hopelijk weet er iemand raad.

heb je ook de code?
En hoe schakel je de lampen?

Dit is niet de volledige code. Was te lang om hier te posten, max 900 characters. Er zit heel wat meer in. Opstart muziekje, eigen letters voor de display,… Ik heb het programma snel wat vereenvoudigd. Maar ik denk dat het belangrijkste er instaat van de drukknopen. Hopelijk heb je hiermee genoeg.

De leds worden aangestuurd door 4 uitgangen.De uitgangen worden versterkt met een transistor. De leds in de drukknopen werken op 12V (ingebouwde weerstand in de drukknop).

//variabelen
const int player1 = A0;
const int player2 = A1;
const int player3 = A2;
const int player4 = A3;
const int resetbutton = A4;

boolean reset = LOW;
boolean pressed = LOW;
boolean pressed1 = LOW;
boolean pressed2 = LOW;
boolean pressed3 = LOW;
boolean pressed4 = LOW;

void setup () 
{

  Serial.begin(9600);
  
  pinMode (A0, INPUT);
  pinMode (A1, INPUT);
  pinMode (A2, INPUT);
  pinMode (A3, INPUT);
  pinMode (A4, INPUT);
 
  
  
for (int thisPin = 8; thisPin < 14; thisPin ++)
  { 
    pinMode (thisPin, OUTPUT); // for loop, pin 8 tot 13 instellen als output voor leds en toeter
  }

void loop () {

// wat volgt: speler 1:  

  if (digitalRead (player1) == HIGH && reset == LOW && pressed == LOW || pressed1 == HIGH )
    {
   
     digitalWrite (led1, ledState);
   
     for (int led = 9; led < 12; led ++)
    { 
      digitalWrite (led, LOW); // for loop, led 2 tot 4 low zetten
    }
     pressed1 = HIGH;
     pressed = HIGH;
 
     
     x=13;
     lcd.setCursor (0,0);
     lcd.print ("     Speler: ");
     lcd.setCursor (0,1);
     lcd.print ("             ");
     custom1();
     
   
    }
  
// Wat volgt: Speler 2:
  else if (digitalRead (player2) == HIGH && reset == LOW && pressed == LOW || pressed2 == HIGH )
  {
   int speler = 2;
   digitalWrite (led2, ledState);
   digitalWrite (led1, LOW);
   digitalWrite (led3, LOW);
   digitalWrite (led4, LOW);
   pressed2 = HIGH;
   pressed = HIGH;
   
  
   
   x=13;
   lcd.setCursor (0,0);
   lcd.print ("     Speler: ");
   lcd.setCursor (0,1);
   lcd.print ("             ");
   custom2();
   
  
  }
 
  
 //Wat volgt: Speler 3:
 else if (digitalRead (player3) == HIGH && reset == LOW && pressed == LOW || pressed3 == HIGH )
  {
   
   digitalWrite (led3, ledState);
   digitalWrite (led1, LOW);
   digitalWrite (led2, LOW);
   digitalWrite (led4, LOW);
   pressed3 = HIGH;
   pressed = HIGH;
   x=13;
   lcd.setCursor (0,0);
   lcd.print ("     Speler: ");
   lcd.setCursor (0,1);
   lcd.print ("             ");
   custom3();
  
  }
  
 
 
 // wat volgt: Speler 4:
 else if (digitalRead (player4) == HIGH && reset == LOW && pressed == LOW || pressed4 == HIGH )
  {
   
   digitalWrite (led4, ledState);
   
   for (int k = 8; k < 11; k ++)
    { 
      digitalWrite (k, LOW); // for loop, led 1 tot 3 low zetten
    }
   
   pressed4 = HIGH;
   pressed = HIGH;
   x=13;
   lcd.setCursor (0,0);
   lcd.print ("     Speler: ");
   lcd.setCursor (0,1);
   lcd.print ("             ");
   custom4();
   
  
  }

// wat volgt is de resetfunctie   
  if (digitalRead (resetbutton) == HIGH)
  {
   reset = HIGH;  
   pressed = LOW;
   pressed1 = LOW;
   pressed2 = LOW;
   pressed3 = LOW;
   pressed4 = LOW;
   thisNote = 0;
  
   
   for (int j = 8; j < 12; j ++)
  { 
    digitalWrite (j, HIGH); // for loop, pin 8 tot 11 hoog zetten, leds laten branden
  }
   
   lcd.setCursor (0,0);
   lcd.print ("Klaar om af     ");
   lcd.setCursor (0,1);
   lcd.print ("te drukken?     ");
   
  }
  else 
  {
   reset = LOW; 
  }

Hier een schema van de leds: zie bijlage

Omdat je zegt dat het programma goed werkt zolang er geen drukknoppen zijn aangesloten, ga ik er vanuit dat de fout daar niet in zit, en de oorzaak dus ofwel in de bedrading ofwel de connectoren ofwel in, de print outlay van, je board zit.
Maar op afstand blijft het speculeren wat de oorzaak kan zijn.

Dus onderstaand verhaal kan evengoed helemaal niet van toepassing zijn.

De oorzaak zou instraling van een stoorbron kunnen zijn.
Hoe lang zijn de draden die naar de drukknoppen lopen ?

De oorzaak zou een aardlus in de kopersporen van de print of in de bedrading kunnen zijn.
Kun je een foto van de koperzijde van de print ?

De oorzaak kan een slechte soldeerverbinding zijn van, of een breuk in, een van de pull_down weerstanden.
Of misschien wel een printspoorbreuk.

GSM's en hf-dimmers kunnen gigantische storingen veroorzaken, vooral als je bedrading dicht langs/ parrallel aan een stoorbron loopt.

Misschien is de oplossing een wijziging van de gebruikte bedrading. De draden naar de drukknoppen kunnen b.v. getwist (in elkaar gedraaid) worden of zelfs afgeschermd.
De pull_down weerstanden kunnen verlaagd worden naar b.v. 1 kohm. Kleine keramischecondensatoren van 1nF kunnen gebruikt worden om stoorstraling kort te sluiten.

Ik moet je zeggen dat ikzelf de schakeling zo ontworpen zou hebben dat ik de INPUT_PULLUP mode had gebruikt en de logica rond de drukknoppen dus geinverteerd zou hebben. De kans op problemen zal daarmee ietsje kleiner zijn omdat de pinnen dan intern hoog geschakeld worden. Maar je zult je redenen wel gehad hebben om het zo te doen en met externe pull_down weerstanden te werken.

cartoonist:
Ik moet je zeggen dat ikzelf de schakeling zo ontworpen zou hebben dat ik de INPUT_PULLUP mode had gebruikt en de logica rond de drukknoppen dus geinverteerd zou hebben. De kans op problemen zal daarmee ietsje kleiner zijn omdat de pinnen dan intern hoog geschakeld worden.

Daar verschillen we duidelijk van mening. Ten eerste zijn de interne pullup's veel te hoog in waarde en kunnen ruis veroorzaken.

Neemt niet weg dat het mogelijk handiger is ff het hele schema hier te publiceren. Paar mogelijke opties:

  • zwevende reset
  • slechte voeding
  • slecht kristal. Eventueel laten draaien op de interne RC
  • Door de leds via de basis te laten lopen, loopt er een aardige stroom door elke pin. Mogelijk is de som van alle stromen in de buurt van de maximale dissipatie van de chip. Maar daar heb ik het hele schema voor nodig.
  • De code zelf....

nicoverduin:
Daar verschillen we duidelijk van mening. Ten eerste zijn de interne pullup's veel te hoog in waarde en kunnen ruis veroorzaken.

Op deze onzin moet ik toch even reageren :sunglasses:

Je kunt parrallel aan de interne pullup nog een weerstand schakelen om de waarde omlaag te brengen als die ca. 40 kilo-ohm interne weerstand voor jouw toepassing een te hoge waarde heeft.

Ruis, hebben we geen last van op een digitale ingang. Als dit echt een probleem was had de chipbakker wel een andere oplossing gekozen.

Wat je wilt.....

Heb je alle aardes en nullen netjes aangesloten? als er 8 drukknoppen aangesloten zijn loopt er stiekem toch 8*0.5 mA is 4 mA en dat is wel genoeg om iets te betekenen.
en nico heeft wel gelijk dat 40 kohm vrij hoog is, zeker als er in de buurt wat hogere spanningen/stromen zijn.
40k op 5 volt is maar 0.125 mA als er dan 230 volt in de buurt is dan loopt dat al heel snel door de isolatie.

Ook de led voor de transistor is een probleem, of zet hem in serie met de andere dus gewoon in de collector, of ook gewoon parrallel aan de drukknopled.

de software zit ook iets moeilijker in elkaar dan nodig is.
maar geef ons inderdaad maar eens het hele programma , wij kijken er wel doorheen, als je goed aangeeft wat je problemen zijn.
heb je het al eens op een simulator laten draaien.

Inderdaad verbaast mij die LED aan de basis van de transistor.
Je jaagt een behoorlijke stroom door de basis van de transistor en ik vraag me zeer af of daar ook wel gebeurt wat de bedoeling is.
Ligt er natuurlijk ook aan welke transistor je gebruikt.

Je kunt ook aan attachment plaatsen.
Dan heb je geen beperking van 900 karakters.
Je kunt je sketch als txt of als ino bestand toevoegen, en eventueel kun je m zippen.

Het is jammer dat T.S. geen volledig schema van de schakeling rond de processor heeft gegeven.
Daarom blijven we hier gissen naar verschillende dingen.

shooter:
als er 8 drukknoppen aangesloten zijn loopt er stiekem toch 8*0.5 mA is 4 mA en dat is wel genoeg om iets te betekenen.

Ook de led voor de transistor is een probleem, of zet hem in serie met de andere dus gewoon in de collector, of ook gewoon parrallel aan de drukknopled.

De drukknoppen, het lijken er 5 te zijn, zijn aangesloten aan een ingang v/d processor waardoor er geen stroom van of naar de processor loopt. De pull_down weerstand zal alleen bij ingedrukte knop 0,5 mA trekken uit de 5 volt voedingslijn. Heeft dus geen effekt op de totale I/O stroom de van de ATmega328

De leds voor de transistor zoals ze hier geschakeld zijn hoeven geen probleem te zijn.

MAS3:
Inderdaad verbaast mij die LED aan de basis van de transistor.
Je jaagt een behoorlijke stroom door de basis van de transistor en ik vraag me zeer af of daar ook wel gebeurt wat de bedoeling is.
Ligt er natuurlijk ook aan welke transistor je gebruikt.

Een processor_pin kan maximaal 40mA leveren en 20mA continue is veilig. Mits de totale stroom van de I/O pinnen niet boven de 200mA uitkomt. Volgens de gegevens die T.S. heeft verstrekt (delen van schema) lijkt die 200 mA niet overschreden te worden.
In de schakeling wordt een groene LED aangesloten met een basis-emitter overgang en een weerstand van 150 ohm.
Spanning over de led ca 2.2 volt V-be van de transistor ca. 0.7 volt spannin over de 150 ohm weerstand ca 5-(2.2+0.7) = 2.1 volt. De stroom vanuit de I/O pin is dus 2.1/150 = ca. 16mA. Dit is volledig verantwoord en dus geen probleem.
Totaal zijn er 4 LED's zichtbaar die totaal dus ongeveer 50mA vanuit de ATmega328 trekken. Ook dit is volledig verantwoord en dus geen probleem omdat de totaalstroom onder de 200mA blijft.

De gebruikte transistor(s) BC547 wordt hier in verzadiging gestuurd met een basisstroom van ca. 16mA en werkt dus als een schakelaar. Dit is normaal en ook de bedoeling van de ontwerper.

Of alles echt verantwoord is kan alleen beoordeeld worden als we het totale plaatje (schema) hebben gezien.

Hallo,

Bedankt voor jullie reacties. In bijlage kunt u het volledige schema vinden en de code.
Ik ben een leek op vlak van elektronica en arduino dus misschien heb ik wel wat foutjes gemaakt :-[
Dit is ook mijn eerste project.

De reden dat ik de leds niet in serie geplaatst had was omdat ik dan niet kon testen zonder mijn drukknoppen. Van de hoge stroom door de transistor was ik niet bewust.

Ik was van het idee hoe hoger de pull-down weerstand hoe minder storingen. Deze beredenering klopt duidelijk niet? Ik heb zelf deze waarde nog verhoogt om even te testen. Dus om minder storing te hebben moet ik deze waarde verlagen? Hoeveel dan precies? 10k zoals voorbeelden op internet? De weerstand die ik eerst op de printplaat had was 4kohm i.p.v 40kohm.
Ik zit wel met lange kabels van ongeveer 4,5m.

De keuze voor pulldown was eveneens niet echt goed doordacht. In een tutorial van arduino gebruikten ze deze methode. Ik heb deze dus gewoon gekopieerd en uitgevoerd voor 5 drukknoppen (4x afduwen + resetknop voor quizmaster). In de toekomst zal ik dus wel opteren voor pull- up.

Door een beperkte kennis in arduino kan het inderdaad zijn dat mijn programma iets te moeilijk is geschreven. Maar ik heb geen idee hoe ik het kan vereenvoudigen. Alle raad is welkom

Ik heb nog even verder gezocht. De printplaat is prima alsook de verbindingen. Maar ik heb wel iets raars voor in mijn mannelijke connector. Er zijn pinnen die precies spanning doorgeven aan elkaar. Het lijkt prima gesoldeerd te zijn. Ik zie geen contact tussen de pinnen. Als ik meet op de piepstand met mijn meettoestel hoor ik geen verbinding. Echter als ik de weerstand meet tussen de 2 pinnen heb ik een waarde van 50kohm. Hoe is dit mogelijk. Hier slaat mijn elektrische kennis toch wel in de knoop. Ik heb ook even geprobeerd om een spanning te plaatsen op één pin en dan de spannig te meten op de andere pin. Er staat daar dan ook een spanning die niet echt constant is. Als ik bijvoorbeeld 5V aanleg meet ik soms 4,5V andere keren 2,5V, soms eens 3,… Blijkbaar toch ergens slecht contact? Maar waar dan? Ik kan toch maar simpelweg die 2 draadjes solderen. (zie foto)

Code quizbak.txt (11.1 KB)

De foto nog vergeten :grin:

Ik was je nog net voor ( 1 minuut ) anders had ik mijn post anders gemaakt.
Ik zie geen gekke dingen in het schema en die 4 groene leds kunnen best zo blijven.

Mijn voorkeur om ingangen als INPUT_PULLUP te gebruiken , hebben niet specifiek betrekking op jouw schakeling. Het voordeel wat ik er in zie is dan je nooit een zwevende ingang kunt hebben en dat je bij gebruik van lange draden , aan het uiteinde van de draad nog een externe pull_up weerstand kan gebruiken.
Naar mijn idee maakt dat de schakeling/bedrading wat minder gevoelig voor h.f. storingen. Maar ik kan dat niet helemaal onderbouwen.

Ik was van het idee hoe hoger de pull-down weerstand hoe minder storingen. Deze beredenering klopt duidelijk niet? Ik heb zelf deze waarde nog verhoogt om even te testen. Dus om minder storing te hebben moet ik deze waarde verlagen? Hoeveel dan precies? 10k zoals voorbeelden op internet? De weerstand die ik eerst op de printplaat had was 4kohm i.p.v 40kohm.
Ik zit wel met lange kabels van ongeveer 4,5m.

Als de schakeling goed is opgebouwd, geen erg lange bedrading en er zijn geen extreme storingsbronnen dan is de interne pull_up weerstand van 40kohm een goed alternatief.
(wat is erg lang voor bedrading ? ...... 4.5 meter is nog niet erg lang.)

Als ik meet op de piepstand met mijn meettoestel hoor ik geen verbinding. Echter als ik de weerstand meet tussen de 2 pinnen heb ik een waarde van 50kohm.

Daar zou je de oorzaak van het probleem kunnen hebben gevonden. Slechte kwaliteit connector of een residu van verbrand plastic of zoiets wat licht geleidend is. Als dit aan je ingangsknoppen gebeurt dan kan het willekeurig ongewenste triggering van een input veroorzaken. Je kunt dit oplossen door de pull_down weerstanden lager te maken dan 10kohm. 1kohm en mogelijk is je probleem dan weg.
Maar het beste maak je de connector goed schoon met spiritus en meet dan nogmaals. In geval van twijffel neem je beter een nieuwe connector.

Heb het probleem gevonden denk ik. Het zit inderdaad in de connector en in de microswitch van de drukknoppen. Heel bizar. Op het eerste zicht is er niks mis mee. Maar als je tussen de contacten meet, meet je wel degelijk een weerstand die schommelt rond de 30 Mega ohm. Ik heb voor de kabels gemakkelijk te solderen gebruik gemaakt van soldeermiddel. Ik vermoed dat dit soldeermiddel het probleem vormt. Je ziet niks mis, maar via de plastic wordt er wel contact gemaakt. Het soldeermiddel maakt blijkbaar een doorzichtig laagje op de pvc dat de stroom geleidt. (Zie foto's)

Toch geen S-39 of zoiets heh?

Ik heb ff die foto beter bekeken, maar als jij 30 mega ohm meet met een pullup (of down) van 10K , dan is de stroom zo minimaal dat je gewoon onder de 0.5V blijft voor LOW indicatie op een digitale poort. Een slecht contact kan wel :slight_smile:

30 meg ohm is prima, gebruik geen flux (dat zit al in de soldeer)

ach 10 kiloohm is prima als weerstand.

en met jouw akelig goede meter zul je wel rare spanningen meten.
dat is heel normaal.
gewoon alles goed aansluiten en in je schema goed kijken wat je meet. als je bijvoorbeeld 2 ingangen op weerstand meet, dan kom je dus twee weerstanden tegen, en dus is het niet oneindig of 30 megohm
alles boven 1 Mohm is open.
aansluiten en elke microswitch voltage meten naar de nul.
als het kan direct op het IC (want daar gaat het tenslotte allemaal om.

30 MOhm is wel heel erg veel.
Het zou zomaar kunnen dat dat een meetfout is, en ik vraag me af of het er hier wel toe zal doen.

Soldeermiddel ?
Kun je dat nader beschrijven ?
Als het S39 is, dan kun je alle elektronica die je daarmee behandeld hebt voor het solderen, direct in de vuilnisbak gooien.
S39 is een zuur, en behalve dat dat het oppervlak reinigt, tast het je (koper) oppervlak ernstig aan.
Dit spul mag je NOOIT MEER gebruiken voor dit soort soldeer werkzaamheden, als je dat al gedaan zou hebben.

[edit]
Gebruik harskern soldeer in plaats daarvan, en zorg dat je soldeert bij de juiste temperatuur.
De hars daarin heeft een vergelijkbare functie, maar spaart het kwetsbare koper.
Het kan even wat experimenteren vergen om die juiste temperatuur te vinden.
[/edit]

Ik heb van mijn opa een doos vol met gassoldeerbouten gekregen, nee niet die met een aansteker, maar gewoon grote blokken koper aan een steeltje. van de firma WILJOP (Maashaven) hij was daar de eigenaar. al jaren overleden trouwens, net als de zaak.