sensor schakelt niet goed (opgelost)

Hallo,

Ik heb het volgende probleem. Om mijn trapverlichting via een arduino mega te schakelen gebruik ik een aktieve sensor.
De sensor werkt dmv een zend en ontvangst led in één behuizing. Hij heeft een plus, een min en een geschakelde draad. deze draad schakelt naar de min. Deze geschakelde min zit op een digitale ingang geprogrammeerd als input_pullup. Tijdens het testen van de sensor ging de trapverlichting spontaan aan. Na meten kwam ik erachter dat de sensor in rust een negatieve spanning van ongeveer 3Volt uitgeeft en in aktieve toestand een negatieve spanning van 5 volt.
De spanning van 3volt in rust laat de arduino denken dat de sensor aktief is en daardor de trapverlichting in en uitschakelt.
Eigenlijk zou de spanning in rust 0v moeten zijn. Is er een manier om dit aan te passen?

Alvast bedankt voor het meedenken.
Groeten,
Johnny

Oplossing 1)
een spanningsdeler
onder 2V is voor arduino 0.
als je dus met 2 1K weerstanden (mogen andere waarden zijn maar best in de K grote wegens stroomverbruik) een spanningdeler maakt je van de 5 en 3 volt respectievelijk 2.5V en 1.5V

Oplossing 2
een analoge pin gebruiken en in je code schakelen op basis van de gemeten waarde

1 is volgens mij het beste.

Met vriendelijke groet
Jantje

Hoi comteccie.

Hoe is die sensor aangesloten en hoe meet je ?
Je hebt genoemd dat de sensor een plus, min en een geschakelde uitgang hebt.
Je hebt ook genoemd dat je de uitgang op een ingang met pull up hebt aangesloten.
Die laatste is een signaal van 0 volt of 5 volt.
Hoe word het geheel gevoed ?
Is dat uit dezelfde 5 volt als de Arduino ?
Als het niet hetzelfde is, zijn de GND's (de nul volts) met elkaar verbonden ?
Is het überhaupt wel een 5 volt voeding voor de sensor ?

Ik vraag dat omdat je het hebt over een negatief nivo maar niets hebt genoemd dat duidt op een negatieve spanning.
(wat je er niet instopt, kan er hier ook niet uitkomen).
Het kan natuurlijk zijn dat je de meter anders aan zou moeten sluiten, vandaar dat ik daar ook naar vroeg.
Dus waar zet je de meetpennen op ?

Het is een sensor geschikt voor 5v en zit aangesloten op de 5V van de arduino. Als de sensor aktief is wordt de uitgang negatief. Dus ten opzichte van de plus 5v wordt de uitgang een min. Ik heb hem als output_pullup gezet omdat hij dus aktief laag is.
Ik heb trouwens vanavond nog even eea nagemeten. Schijnbaar pikt de kabel waar de sensor op zit aangesloten storingen op waardoor de spanning op de uitgang niet meer stabiel is ( heb de voeding voor de ledlampjes door de dezelfde kabel lopen). Heb de sensor gedemonteerd en weer nagemeten en toen was de uitgang bij niet aktief 0,7V en bij aktief 5,01 V ( gemeten ten opzichte van de plus van de sensor dus). Dit zijn dus de waardes die ik moet hebben
Ik denk dus dat de oplossing is om voor de sensor een aparte kabel te trekken.
Heb trouwens ook nog een 12V spanning lopen om de ledlampjes te voeden. De minnen van de arduino en deze 12V voeding liggen aan elkaar. De ledlampjes zijn kant en klaar en geschikt voor 12V.
Alles word dmv van transistoren via de arduino aangestuurd.
Dit werkt allemaal perfect op de sensoren na dan.

Groeten johnny

je wilt wel input en dus niet output_pullup (als dat al bestaat)
Met vriendelijke groet
Jantje

Hoi Johnny.

Ik begrijp dat het niet altijd meevalt, zeker niet als je even snel een antwoord geeft.
Maar om een goed idee te geven van jouw installatie zodat je een passend antwoord kunt krijgen, is het wel belangrijk dat je de juiste informatie geeft.
Zie het berichtje van Jantje hierboven.
In jouw laatste bericht spreek je jezelf tegen.
Ik begrijp wel wat je bedoelt, maar ik moest het wel 2 keer lezen.

De GND is het referentie nivo bij systemen zoals de Arduino.
Daarom moet je een meting altijd doen ten opzichte van dat nivo.
Dan zie je namelijk het zelfde als wat de Arduino ziet en ook naar zit te kijken.
Van een multimeter gaat dan dus de zwarte draad (meestal met het bijschrift "com") naar GND, en dan kun je zien wat er gebeurt op je schakel uitgang van je sensor met de rode draad.
Ik had al het vermoeden dat je zo meet zoals je hierboven vertelde, omdat je aangaf een negatieve spanning te meten, terwijl die er niet kan zijn.
Je zou nu kunnen denken dat de "plus" ook een vast gegeven is en je dat daarom ook prima kunt gebruiken, maar er zijn een heleboel redenen waardoor die plus zou kunnen afwijken (stroomverbruik is daar een heel bekende van).

@ jantje,

Je hebt gelijk, het is inderdaad input_pullup. Iets te snel getikt. :grin:

@mas3
Heb even de specs van de sensor opgezocht; http://arduino-info.wikispaces.com/InfraredDistanceSensor
en de uitgang is een npn open colecctor uitgang. Ik ging er altijd vanuit dat dit type uitgangen naar negatief schakelt.
Met jouw gegeven dat bij de arduino de GND de referentie is, meet ik toch weer iets anders namelijk ( en dan gemeten ten opzichte van de GND van de arduino) dat als de sensor in rust is de uitgang +5V uitstuurd en bij sensor aktief 0V.
Andersom gemeten (maar dat heeft dan eigenlijk geen nut), dus ten opzichte van de +5V van de arduino, is de uitgang bij rust 0V en bij aktief -5V.
Dus als ik jouw verhaal goed begrijp, met GND als referentie en uitgang +5V of 0V, zou ik de ingang op de arduino zo moeten prorammeren dat hij of 5V of 0V ziet.
Je hebt gelijk over het feit om gegevens goed te vernoemen maar gisteravond was ik aan het testen en het werkte nét niet naar behoren en dan wil je even snel een antwoord ( zoal jij al zei).
Toch bedankt voor het meedenken. Ga nu de programmering van de mega aanpassen en kijken of het beter werkt. Ik hou jullie op de hoogte.

Groeten
Johnny

Hoi.

De meeste (maar zeker niet allemaal) sensoren werken op die manier.
Daarmee houd je ook rekening als je een pull up ingang gebruikt.
Die dwingt een ingang namelijk naar 5 volt (ten opzichte van GND :stuck_out_tongue: ) als er niets geen aansturing is.
Als er wel aansturing is, dan wint die het van de pull up weerstand, en word het te bewaken signaal "naar nul getrokken".

Bij een ingang met pull up kijk je dus met name of ie LOW is, je kunt haast aannemen dat ie HIGH is als ie niet LOW is.

Succes met je sketch, ben benieuwd naar je vorderingen.

Nou mensen,
Ik heb mijn sketch aangepast zodat de input_pullup nou een "gewone input" is geworden. Verder heb ik de HIGH's naar LOW gezet omdat als de sensor in rust is, deze 5V uit stuurt en als hij aktief is 0V. Dit werkt nu prima. I zal mijn code even toevoegen.

/*
Trapverlichting met 13 keer inbouw led-spot en ldr om alleen in te schakelen als het donker genoeg is
*/

//LED aansluiting toewijzen
int led1 = 2;       // leds 1 t/m 13, toewijzen aan variabele van het type integer met de naam led1 t/m led13
int led2 = 3;       // en waardes 2 t/m 10, 13, 44 t/m 46
int led3 = 4;
int led4 = 5;
int led5 = 6;
int led6 = 7;
int led7 = 8;
int led8 = 9;
int led9 = 10;
int led10 = 13;
int led11 = 44;
int led12 = 45;
int led13 = 46;

// sensor aansluiting toewijzen
int b_up = 50;                     //sensor onderaan de trap, toewijzen aan variabele van het type integer met de naam b_up en waarde 50
int b_down = 51;                   //sensor bovenaan de trap, toewijzen aan variabele van het type integer met de naam b_down en waarde 51

//helderheid led toewijzen
int brightness = 0;                // helderheid led, toewijzen aan variabele van het type integer met de naam brightness en waarde 0
int brightness2 = 255;             // helderheid2 led, toewijzen aan variabele van het type integer met de naam brightness2 en waarde 255
                 
                   
//variables
static unsigned active = 0;        //wanneer het systeem aktief wordt (standaard ingesteld op 0)


//setup
void setup() { 

//Ledpins instellen als output
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  pinMode(led4, OUTPUT);
  pinMode(led5, OUTPUT);
  pinMode(led6, OUTPUT);
  pinMode(led7, OUTPUT);
  pinMode(led8, OUTPUT);
  pinMode(led9, OUTPUT);
  pinMode(led10, OUTPUT);
  pinMode(led11, OUTPUT);
  pinMode(led12, OUTPUT);
  pinMode(led13, OUTPUT);

//Sensoren instellen als input
  pinMode(b_up, INPUT);       // 
  pinMode(b_down, INPUT);     // 

 }

//loop
void loop() { 

  //Variabelen instellen gebasseerd op de staat van de sensoren
  int up = digitalRead(b_up);                                      // uitlezen staat van sensor onderaan trap
  int down = digitalRead(b_down);                                  // uitlezen staat van sensor bovenaan trap
  int sensorValue = analogRead(A0);                                // uitlezen waarde van lichtsensor op A0 en bewaren in variabele sensorValue
  float voltage = sensorValue *(5.0/1023.0);                       // waarde van sensorValue(0 tot 1023) omzetten in 0 tot 5 en bewaren in variabele voltage
  
  
  if(voltage <=2){                                                 // wanneer waarde van lichtsensor(voltage) is lager dan of gelijk aan 2, dan..
    if (up == LOW) {                                              // kijken of de onderste sensor is geaktiveerd, dan..
        if (active == 1 ) {LedOff();}                              // kijken of active 1 is. Zoja, de functie LedOff uitvoeren. Zoniet...
               else { LedOn(); }                                   // de functie LedOn uitvoeren.             
                                                              
   }                                              
}  
if(voltage <=2){                                                   // wanneer waarde van lichtsensor(voltage) is lager dan of gelijk aan 2 dan...
    if (down == LOW) {                                            // kijken of de bovenste sensor is geaktiveerd, dan...
        if (active == 1 ) {LedOff();}                              // kijken of active 1 is. Zoja, de functie LedOff uitvoeren. Zoniet...
              else  { LedOn(); }                                   // de functie LedOn uitvoeren.             
  
      }
   }
}

void LedOn() {                                                     // Schakelt led's aan bij het naar boven gaan. Deze functie wordt aangeroepen vanuit de code op regel ...

    for (int brightness=0; brightness<=255; brightness+=5){        // led's aanschakelen met helderheid vanaf 0 naar 255(volledig aan) in stappen van 5 (dit wordt een FOR-loop genoemd)
        analogWrite(led1,brightness);                              // schakelt led 1 aan met de waarde brightness bepaalt in regel 87. Enzovoort voor alle dertien led's
        analogWrite(led2,brightness);
        analogWrite(led3,brightness);
        analogWrite(led4,brightness);
        analogWrite(led5,brightness);
        analogWrite(led6,brightness);
        analogWrite(led7,brightness);
        analogWrite(led8,brightness);
        analogWrite(led9,brightness);
        analogWrite(led10,brightness);
        analogWrite(led11,brightness);
        analogWrite(led12,brightness);
        analogWrite(led13,brightness);
        delay(100);                                                // bepaalt de vertraging tussen de dim-stappen (in milliseconden)
        }
        active = 1;                                                // zet active op 1 na het inschakelen van de led's. Deze waarde wordt weer gebruikt in de code op regel ..
       
}


void LedOff(){                                                      // Schakelt led's uit bij het naar boven gaan. Deze functie wordt aangeroepen vanuit de code op regel ...
  
    for (int brightness = 255; brightness >=0; brightness -=5) {   // led's uitschakelen met helderheid vanaf 255 naar 0(uit) in stappen van 5
        analogWrite(led1,brightness);                              // schakeld led 1 uit met de waarde brightness bepaalt in regel 104. Enzovoort voor alle dertien led's
        analogWrite(led2,brightness);
        analogWrite(led3,brightness);
        analogWrite(led4,brightness);
        analogWrite(led5,brightness);
        analogWrite(led6,brightness);
        analogWrite(led7,brightness);
        analogWrite(led8,brightness);
        analogWrite(led9,brightness);
        analogWrite(led10,brightness);
        analogWrite(led11,brightness);
        analogWrite(led12,brightness);
        analogWrite(led13,brightness);
        delay(100);                                                // bepaalt de vertraging tussen de dim-stappen (in milliseconden)
        }
        active = 0;                                                // zet active op 0 na het uitschakelen van de led's. Deze waarde wordt weer gebruikt in de code op regel...
                                                                 
}

Nu heb ik het volgende probleem. Als ik na het resetten van de arduino voor de eerste keer door een sensor loop, gaan de led´s netjes aan. Maar na het gedimd opkomen( dmv pwm) gaan ze ook weer uit... en weer aan.. en weer uit.. enz.
Ze mogen pas weer uit gaan als ik nogmaals door een sensor heen loop.
Ik heb wel ontdekt dat de sensor continu geaktiveert wordt als de led´s eenmaal branden. Nu heb ik het vermoeden dat dit wordt veroorzaakt door de pwm uitgangen want als de led´s nog uit zijn is de sensor netjes in rust. De led´s worden aangestuurd dmv van bc547 torren en hebben een aparte 12V voeding waarvan ik de GND heb verbonden met de GND van de arudino.
Iemand suggesties, oplossingen of vragen over dit probleem?

Groeten,
Johnny

de ledjes zende ook IR uit dus vandaar het effect !
feedback van licht triggert de IR sensor ?
8)

Dexterbot:
de ledjes zende ook IR uit dus vandaar het effect !
feedback van licht triggert de IR sensor ?
8)

Het klinkt misschien idioot maar dit is een heel waarschijnlijke verklaring.
Met een buisje op je sensor kan al heel wat verhelpen. Dan moet je de irled wel beter richten. Een mobieltje (met camera) kan je daar dan weer mee helpen.

Jantje

Hoi,

Het zou natuurlijk kunnen dat de sensor op het licht van de led's reageert, maar volgens de spec's van de sensor,http://arduino-info.wikispaces.com/InfraredDistanceSensorzend de ir led gemoduleerd licht uit zodat (licht)invloeden van buitenaf onwaarschijnlijk zijn.
De sensor bevat een led en ontvanger in 1 behuizing dus ik hoef hem niet te richten, enkel met een stelschroefje op de achterkant de te detecteren afstand in te stellen.
Volgens mij heb ik ergens gelezen (weet alleen niet meer waar) dat pwm signalen over een kabel als een antenne gaat werken en dat dit ontstoord moet worden. Weet alleen niet goed waar en op welke manier. Iemand een idee?
Ik ga nog wat testjes uitvoeren om te kijken of ik verder nog iets kan ontdekken.

Johnny

comteccie:
Volgens mij heb ik ergens gelezen (weet alleen niet meer waar) dat pwm signalen over een kabel als een antenne gaat werken en dat dit ontstoord moet worden. Weet alleen niet goed waar en op welke manier. Iemand een idee?
Ik ga nog wat testjes uitvoeren om te kijken of ik verder nog iets kan ontdekken.

Het antenne effect is natuurlijk waar maar (rond de 500-600 Hz blokgolf die wat ronde kantjes krijgt bij lange dragen door capacitief gedrag.) ik kan me echter niet voorstellen dat daar jouw probleem ligt. Tenzij je met elle lange kabels aan het werk bent.

comteccie:
Nou mensen,
Ik heb mijn sketch aangepast zodat de input_pullup nou een "gewone input" is geworden. Verder heb ik de HIGH's naar LOW gezet omdat als de sensor in rust is, deze 5V uit stuurt en als hij aktief is 0V. Dit werkt nu prima.

Mag ik vragen waarom je hier voor gekozen hebt ?
Wat er nu gebeurt is dat als de sensor iets detecteert, dan word de ingang van de Arduino met GND verbonden en ziet ie een LOW.
Als de sensor niets detecteert, word die ingang met niets verbonden, en ziet de Arduino van alles en nog wat, maar geen vaste waarde.
Dan zweeft die ingang namelijk en dat is nou precies wat je niet wil.
Je moet er dus voor zorgen dat er altijd een bekend nivo op de ingang staat, anders krijg je precies wat je nu ziet.

Een kabel met een PWM signaal kan inderdaad als antenne functioneren, maar dan wel een zend antenne.
Dat is dan dus de bron van een storing, niet de ontvanger ervan.
Dat kun je waarschijnlijk wel wegfilteren, maar vermoedelijk levert dat eerder meer ellende op dan minder.
Ik verwacht ook niet dat dit de oorzaak is van de problemen die je nu waarneemt.

De sensor zelf schakelt standaard bij aktief worden naar gnd , daarom heb ik ze op deze manier aangesloten en geprogrammeerd. Verder heb ik pullup weerstanden erop zitten zodat de sensor, als hij in rust is, naar de plus wordt getrokken. Dus er gaat niks zweven.
Ik heb trouwens ontdekt wat het probleem was. De 5 volt spanning voor de twee sensoren was net iets teveel voor de arduino. Daardoor werd de spanning op de sensoren net iets beneden de 5 volt getrokken wat ervoor zorgde dat ze begonnen te flipperen. Met 1 sensor erop had ik dat probleem niet. Twee erop was net iets teveel voor de arduino.
Een oude nog werkende pc voeding heeft dit probleem opgelost
Bedankt mensen voor het meedenken.

Groeten
Johnny

Hoeveel stroom trekken die dingen dan??????

Hoi Nico,

Volgens de specs 25mA per stuk. Maar ik stuur ook nog eens 13 torren aan via de arduino. Denk toch dat het iets teveel van het goede was. Met 1 sensor aangesloten had ik geen problemen, maar met twee sensoren aangesloten gingen ze raar flipperen. Maarja het zijn ook maar van die goedkope chinese ebay prulletjes. Ik weet het anders ook niet.
Nu ik een aparte voeding heb gebruikt zijn alle problemen opgelost.

Groeten,
Johnny

Ik vind het nog steeds een vreemd verhaal. Heb je wel een 1K weerstand tussen de arduino pinnen en de basis van elke transistor gedaan? Dan zou je max 1mA per transistor trekken. Of heb je die torren op de basis rechtstreeks aan een arduino pin hangen?
Als je een 10K weerstand hebt gebruikt voor de uitgang van die sensor trek je ook minder dan 1mA voor de data lijn + 25mA worstcase voor de zender.
Ik kom niet verder dan iets van 50-60mA. Ik vermoed dat er iets anders nog fout zit.

Hoi comteccie.

Je noemt nu voor het eerst de hardware pull ups (of ik ze dat nu voor het eerst).
Daarom leest het voor mij alsof je jezelf tegenspreekt.
Als je hulp nodig hebt, is het wel belangrijk dat je de juiste, complete informatie geeft.
Want anders krijg je dus niet passende tips en opmerkingen, waardoor je veel langer dan nodig bezig bent je probleem op te lossen.
En uiteindelijk word die informatie dan toch nog gegeven.
Dus waarom niet meteen.

Ik ben het verder helemaal eens met Nico, de conclusies die je getrokken hebt zou ik niet zo snel uit de gegeven informatie halen.
Ook niet met de 13 torren die je aanstuurt met de Arduino, als je een geschikte variant kiest en die voorziet van de juiste weerstanden dan zou een en ander niet snel een probleem mogen vormen.

Nu is het dus zo dat je door die dikkere voeding een stabieler geheel ziet, maar je weet dan nog niet of er niet toch nog iets niet OK is.
Het zou dan beter zijn om te meten (is weten, zul je vast vaker gehoord hebben).
Zo voorkom je dan overbelasting die later een ernstiger gevolg kan (niet moet) hebben.

Sorry jongens,

Jullie hebben natuurlijk helemaal gelijk. Ik ging iets te haastig te werk om het probleem aan jullie uit te leggen en ging er vanuit dat sommige dingen vanzelfsprekend zijn. Bv met die pullup weerstanden en een 1k weerstand aan de basis van de transistor.
Alhoewel het probleem zich nu niet meer voordoet zal ik proberen een tekeningetje te maken hoe alles zit aangesloten. Ik wil toch zeker weten dat ik niets over het hoofd zie.
Moet alleen even kijken wanneer ik daar tijd voor heb. In ieder geval bedankt voor de input zover.

Groeten,
Johnny