Laserwaterpas ontvanger

Op 10 september 2020 19:41:28 schreef Lambiek:
Zie ik nu twee printjes? Of kijk ik verleerd?

Je kijkt verkeerd :P. Ik denk dat je de 2 3D aanzichten bedoeld? Dit zijn 2 isometrische aanzichten, 1 van de bovenkant, de ander van de onderkant.

Op 10 september 2020 19:41:28 schreef Lambiek:
Wat is de afstand van je laser ontvanger tot aan je controller? Dit vraag ik inverband met eventuele storing.

Dit zal al gauw een kabel van ca. 5 - 7 meter worden denk ik.

Lambiek

Special Member

Stuur even een Mail, adres staat bij mijn gegevens.

Als je haar maar goed zit, GROETEN LAMBIEK.

@Sparky,

Nu is de uitgang naar de 3/2 klep (Pin 9) geïnverteerd en dat werkt goed. Maar zoals de situatie nu is wordt de klep altijd bediend tenzij er een signaal komt dat dit niet nodig is. Dit zou ik liever andersom zien, dus enkel bediend als dit nodig is bij een signaal net boven of net onder neutraal. Is dit er nog in te krijgen of moet dan heel de code op zn kop?

U vraagt, wij draaien:

code:

#define MAX_INTERVAL 200 // max time a LED can be off while blinking, in ms
#define STABILITY_THRESHOLD 50 // time the input state must be stable before movement starts, in ms

#define DO_NOTHING  0x00
#define MOVE_UP   0x01
#define MOVE_DOWN 0x02
#define MOVE_FAST 0x04
#define MOVE_UPFAST (MOVE_UP | MOVE_FAST)
#define MOVE_DOWNFAST (MOVE_DOWN | MOVE_FAST)

// what to do for each combination of inputs; any combination of 2 or more active inputs means
// do nothing, only the combinations with exactly one active input, except the middle (neatral) input
// result in movement. These are positions 0x01 (1) for up fast, 0x02 (2) for up slow, 0x04 (4) for neutral,
// 0x08 (8) for down slow, 0x10 (16) for down fast. Note the array index starts at 0
const unsigned char Actions[ 32 ] = 
  { DO_NOTHING, MOVE_UPFAST, MOVE_UP, DO_NOTHING, DO_NOTHING, DO_NOTHING, DO_NOTHING, DO_NOTHING, // 0..7
    MOVE_DOWN, DO_NOTHING, DO_NOTHING, DO_NOTHING, DO_NOTHING, DO_NOTHING, DO_NOTHING, DO_NOTHING, // 8..15
    MOVE_DOWNFAST, DO_NOTHING, DO_NOTHING, DO_NOTHING, DO_NOTHING, DO_NOTHING, DO_NOTHING, DO_NOTHING, // 16..23
    DO_NOTHING, DO_NOTHING, DO_NOTHING, DO_NOTHING, DO_NOTHING, DO_NOTHING, DO_NOTHING, DO_NOTHING }; // 24..31

unsigned short InputCounters[ 5 ] = { 0, 0, 0, 0, 0 };
unsigned char ReadInputs, FilteredInputs, PreviousInputs = 0, AutomaticMode = 0, JoystickInput;
unsigned long StabilityCount = 0, ActivityCounter = 0;

void setup()
{
  // pin 0 unused; causes problems when loading new software
  pinMode( 1, OUTPUT ); // LED for automatic mode
  pinMode( 2, INPUT ); // input top LED
  pinMode( 3, INPUT );
  pinMode( 4, INPUT );
  pinMode( 5, INPUT );
  pinMode( 6, INPUT ); // input bottom LED
  pinMode( 7, OUTPUT ); // move UP output
  pinMode( 8, OUTPUT ); // move DOWN output
  pinMode( 9, OUTPUT ); // move FAST output (low=fast)
  pinMode( 10, OUTPUT ); // Error output
  pinMode( 11, INPUT ); // pushbutton for automatic mode
  pinMode( 12, INPUT ); // joystick UP
  pinMode( 13, INPUT ); // joystick DOWN
  pinMode( A0, OUTPUT ); // Debugging status LEDs
  pinMode( A1, OUTPUT );
  pinMode( A2, OUTPUT );
  pinMode( A3, OUTPUT );
  pinMode( A4, OUTPUT );
  pinMode( A5, OUTPUT );
}

void loop()
{
  unsigned char Index;
  
  FilteredInputs = 0;
  ReadInputs = ( digitalRead( 2 ) ) | ( digitalRead( 3 ) << 1 ) | ( digitalRead( 4 ) << 2 ) | ( digitalRead( 5 ) << 3 ) | ( digitalRead( 6 ) << 4 );

  // this loop monitors each input for recent activity; when an input is active, the timer for that inputs
  // is set to MAX_INTERVAL, and starts counting down from there; when it reaches 0, the input is considered
  // inactive. MAX_INTERVAL should be set slightly longer than the maximum time the LED for an input can be off
  // when blinking
  for( Index = 0; Index < 5; Index++ )
  {
    if( ReadInputs & ( 1 << Index ) )
      InputCounters[ Index ] = MAX_INTERVAL;

    if( InputCounters[ Index ] )
    {
      InputCounters[ Index ]--;
      FilteredInputs |= 1 << Index;
    }

    // write each input filter status to a debug LED (A0 + 3 is the same as A3)
    digitalWrite( A0 + Index, !InputCounters[ Index ] );
  }

  if( !FilteredInputs ) // if all timers have expired, not a single input active
    ActivityCounter = 2000; // set timer for 2 seconds; only when signal is lost should all timers expire

  if( ActivityCounter )
  {
    ActivityCounter--;
    FilteredInputs = 0; // only after 2 seconds without any expired timers should the outputs become active
  }
  
  // now check if the input state has been stable for a number of successive cycles, to prevent movement
  // when 2 LEDs are blinking, since one can always be detected slightly earlier or later than the other
  // If current and previous input states are different, reset stability counter
  if( PreviousInputs != FilteredInputs )
    StabilityCount = STABILITY_THRESHOLD;

  // now store the current input state for the next cycle
  PreviousInputs = FilteredInputs;

  // if stability counter has not yet reached the threshold, increment it, and force the input state to 0
  // to prevent any movement
  if( StabilityCount )
  {
    StabilityCount--;
    FilteredInputs = 0;
  }
  
  // write Stability status to debug LED
  digitalWrite( A5, !StabilityCount );

  // write Error LED status; LOW when an error occured (LED with resistor to supply)
  digitalWrite( 10, FilteredInputs );

  JoystickInput = digitalRead( 12 ) | ( digitalRead( 13 ) << 1 ); // 0x01 = UP, 0x02 = DOWN

  if( JoystickInput )
    AutomaticMode = 0;
  else
    if( digitalRead( 11 ) ) // pushbutton for automatic mode
      AutomaticMode = 1;

  if( AutomaticMode )
  {
    // lookup what to do for this state and write to outputs
    digitalWrite( 7, Actions[ FilteredInputs ] & MOVE_UP );
    digitalWrite( 8, Actions[ FilteredInputs ] & MOVE_DOWN );
    digitalWrite( 9, ( !( Actions[ FilteredInputs ] & MOVE_FAST ) ) & Actions[ FilteredInputs ] );
  }
  else
  {
    digitalWrite( 7, JoystickInput == 0x01 ); // valve UP when joystick UP is active (and DOWN isn't)
    digitalWrite( 8, JoystickInput == 0x02 ); // valve UP when joystick DOWN is active (and UP isn't)
    digitalWrite( 9, 0 ); // fast mode
  }

  digitalWrite( 1, AutomaticMode );
  delay(1); // actual loop interval will be slightly longer, because it also takes some time to execute
}

Alleen deze regel is veranderd:
digitalWrite( 9, ( !( Actions[ FilteredInputs ] & MOVE_FAST ) ) && Actions[ FilteredInputs ] );

Nu wordt dat ventiel alleen aangestuurd als er ook een ander ventiel actief is. Ik had bedacht dat de status van dat ventiel niet belangrijk was als de andere ventielen dicht zijn, en wilde juist het aantal schakel bewegingen minimaliseren.

Een manager is iemand die denkt dat negen vrouwen in één maand een kind kunnen maken

Op 11 september 2020 09:52:07 schreef SparkyGSX:
Ik had bedacht dat de status van dat ventiel niet belangrijk was als de andere ventielen dicht zijn, en wilde juist het aantal schakel bewegingen minimaliseren.

Daar heb je ook gelijk in. Functioneel is de status niet belangrijk wanneer er niets bediend wordt. Alleen ben ik er niet zo'n voorstander van als continue dat ventiel bekrachtigd wordt als het niet nodig is. Als ik bijvoorbeeld even aan de koffie zit :)

@Sparky,

Ik heb net jouw laatste code in de Arduino geladen en de opzet getest. De outputs reageren nu goed bij input pin3, dan worden 7 en 9 HIGH. Maar bij input pin5 wordt alleen 8 HIGH terwijl hij dan ook 9 erbij moet schakelen. Kan jij dit verklaren?

Ik zie het al, een stom typfoutje: die & (bitwise AND) moest && zijn (logische AND)

Een manager is iemand die denkt dat negen vrouwen in één maand een kind kunnen maken
Lambiek

Special Member

@TS,

Ik heb eens na zitten denken over het geheel en persoonlijk vind ik alles op 5VDC niet zo'n goed idee.

Ik zou naar 12VDC gaan voor de in en uitgangen en dan het 5VDC gebeuren alleen voor de controller houden. Ook zou ik de ingangen over een optocoupler halen zie voorbeeld.

Op deze manier krijg je ook een kleine vertraging op de ingang, het zelfde als bij een plc ingang. Dit is met 100nF je kunt ook 10nF of 5nF gebruiken, dan wordt de vertraging iets korter.

Denk hier eens over na als je wil.

De uitgangen kun je over een ULN2803 halen of over bijv. een BC547 of een BC517.

Of koop zoiets, dan ben je in één keer klaar. Daar kun je het zelf niet voor maken of laten maken.

https://www.universal-solder.ca/product/canaduino-plc-300-24-arduino-m…

Als je haar maar goed zit, GROETEN LAMBIEK.

Op 11 september 2020 15:36:12 schreef Lambiek:
Ik heb eens na zitten denken over het geheel en persoonlijk vind ik alles op 5VDC niet zo'n goed idee.

Waarom dan? Ik zie niet in wat het voor voordeel heeft om dat kleine stukje op 12V te laten werken, en het nut van een optocoupler direct achter een fototransistor (die ook al een optocoupler vormt met de LED) zie ik ook echt niet.

Bijkomend nadeel is ook dat het lastig is om een nette 12V te maken van de voeding op een voertuig, aangezien die onder de 12V zakt tijdens het starten.

De relais voeden met 12V kan natuurlijk wel, maar als er op het boordnet ook negatieve pieken voorkomen (volgens ISO 7637-2 en ISO 16750 is dat normaal), gaat die transistor eraan, als je geen extra maatregelen neemt.

Een manager is iemand die denkt dat negen vrouwen in één maand een kind kunnen maken
Lambiek

Special Member

Dus jij zou het ingang gedeelte op 5VDC houden en het uitgang gedeelte op 12VDC?

Die optocoupler had ik er tussen omdat die onder de 6V niets doet en omdat je een lichte vertraging hebt.

Als je haar maar goed zit, GROETEN LAMBIEK.

Ja, ik zie het voordeel van de ingangen op 12V niet eigenlijk; voor de ruismarge hoef je het niet te doen, want op 5V gaat die optocoupler ook al in geleiding.

Als je de microcontroller wilt beschermen bij transients, is een 10k weerstand in serie met de ingang ook genoeg.

De relais op een 12V voeding (met een diode in serie) lijkt wel een goed idee; 5V relais zijn doorgaans relatief klein, op 12V kun je standaard Automotive relais gebruiken, en je loopt met het risico dat je troep op de 5V voeding krijgt.

Een manager is iemand die denkt dat negen vrouwen in één maand een kind kunnen maken

Bedoel je dan alle inputs(fototransistors, joystick en drukknop) op de 5V houden?

Lambiek

Special Member

Op 12 september 2020 00:01:32 schreef SparkyGSX:
Ja, ik zie het voordeel van de ingangen op 12V niet eigenlijk; voor de ruismarge hoef je het niet te doen, want op 5V gaat die optocoupler ook al in geleiding.

De gedachte achter de optocoupler was dat die niets doet onder de 6VDC op de ingang en dat je een kleine vertraging hebt. En de foto transistor is ook een optocoupler "ben ik met je eens" maar daar hangt wel een kabel aan van +/- 7 meter en direct aan de ingangen.

maar als er op het boordnet ook negatieve pieken voorkomen (volgens ISO 7637-2 en ISO 16750 is dat normaal), gaat die transistor eraan, als je geen extra maatregelen neemt.

Waar kan die negatieve spanning vandaan komen of door wat kan dat veroorzaakt worden? En dat heb je bij 5VDC toch ook?

Als je de microcontroller wilt beschermen bij transients, is een 10k weerstand in serie met de ingang ook genoeg.

Dat zou nog een optie zijn.

De relais op een 12V voeding (met een diode in serie) lijkt wel een goed idee;

Hoe bedoel je dat, een diode in serie met de relais spoel? Dus in doorlaat tussen plus en relais of anders?

Als je haar maar goed zit, GROETEN LAMBIEK.

Ja, dat lijkt me wel het gemakkelijkst.

Wat is je bedoeling met de rest van dit project? Er moet nog wel wat gebeuren voordat dit geschikt is voor montage op een voertuig. Het zal mechanisch solide moeten worden gebouwd, met bescherming tegen vocht en vuil, en je hebt ook nog wel wat nodig om de voeding te beschermen.

@Lambiek: zo'n kabel direct aan de ingangen in inderdaad echt geen goed idee, maar 10k in serie met 100nF naar de ground is meestal goed genoeg; die AVR heeft goede interne clamping diodes (net als PICs trouwens).

Die optocouplers zijn niet perse een slecht idee hoor, maar ik vind het wat overdreven. Het ligt er ook aan hoe de TS hier verder mee wil gaan; als je een board gaat ontwerpen kun je zoiets simpel doen, als het een samenstelling van een Arduino, ingekocht relaisboard, en een protoshield of zo moet worden, gaat dat al moeilijk worden.

Waar kan die negatieve spanning vandaan komen of door wat kan dat veroorzaakt worden?

Die negatieve pieken komt van opslingering van kabels door het abrupt uitschakelen van verbruikers, voornamelijk de injectors en bobines. In de ISO normen staat dat allemaal beschreven, en ISO 7637-2 is online wel te vinden.

Hoe bedoel je dat, een diode in serie met de relais spoel? Dus in doorlaat tussen plus en relais of anders?

Ja, in serie met de inkomende voeding; bij een negatieve piek gaat de diode parallel aan het relais in geleiding, en komt die piek dus helemaal over de transistor te staan, in een richting die hij echt niet leuk vind.

In de praktijk valt het vaak wel mee met die rommel op het boordnet, de telefoonladers met alleen een 7805 of MC34063 zonder enige beveiligingen blijven vaak ook nog wel een tijdje heel (maar uiteindelijk gaan ze altijd, is mijn ervaring). Het is zo'n kleine moeite om een paar maatregelen te nemen, dat ik dat zeker zou doen.

Een manager is iemand die denkt dat negen vrouwen in één maand een kind kunnen maken

Op 12 september 2020 09:42:04 schreef SparkyGSX:
Wat is je bedoeling met de rest van dit project? Er moet nog wel wat gebeuren voordat dit geschikt is voor montage op een voertuig. Het zal mechanisch solide moeten worden gebouwd, met bescherming tegen vocht en vuil, en je hebt ook nog wel wat nodig om de voeding te beschermen.

Welke voeding bedoel je? De 12V komt vanaf de accu dus dat zit wel goed. En vwb montage, dat is nou net iets waar ik wél goed in ben!

Lambiek

Special Member

Op 12 september 2020 09:42:04 schreef SparkyGSX:
@Lambiek: zo'n kabel direct aan de ingangen in inderdaad echt geen goed idee, maar 10k in serie met 100nF naar de ground is meestal goed genoeg;

Dat bedoel ik dus ook, een kabel van 7 meter is een pracht van een antenne voor allerlei troep. Dus vandaar die optocoupler aan de ingang met het filter.

Die optocouplers zijn niet perse een slecht idee hoor, maar ik vind het wat overdreven.

Dus jij zou zeggen houd de ingangen op 5VDC met een weerstand van 10K in serie met de ingang en een 100nF naar de gnd.

Die negatieve pieken komt van opslingering van kabels door het abrupt uitschakelen van verbruikers, voornamelijk de injectors en bobines.

Maar dit is een diesel "neem ik aan" en daar heb je geen ontsteking met bobines. En de injectors gaan via een brandstofpomp neem ik aan, al zijn er ook tractoren waarbij de injectie elektronisch geregeld wordt.

Ja, in serie met de inkomende voeding;

Op deze manier dus.

In de praktijk valt het vaak wel mee met die rommel op het boordnet, de telefoonladers met alleen een 7805 of MC34063 .....

Ik had daar het liefst een schakelende voeding gezien.
Zoiets dus.

https://nl.rs-online.com/web/p/switching-regulators/9068487/

Als je haar maar goed zit, GROETEN LAMBIEK.

@TS: de 12V vanaf je accu is geen "schone" 12V, het is verstandig om een beetje beveiliging te voorzien, om de ergste rommel buiten de deur te houden. Nu is de load dump in ISO 7637-2 en ISO 16750-2 wel erg ruig; 80V op een 12V systeem (dat is wanneer de dynamo de accu stevig aan het laden is, en de verbinding naar die accu verbroken wordt).

Zo'n voeding als Lambiek voorstelt is prima, als je daar even een seriediode voor zet, met een bufferelco met keramische of MKP parallel, en als je het goed wilt doen nog een TVS voor de korte en hoge pieken.

Een manager is iemand die denkt dat negen vrouwen in één maand een kind kunnen maken
Lambiek

Special Member

Op 12 september 2020 10:29:54 schreef SparkyGSX:
Zo'n voeding als Lambiek voorstelt is prima, als je daar even een seriediode voor zet, met een bufferelco met keramische of MKP parallel, en als je het goed wilt doen nog een TVS voor de korte en hoge pieken.

Zo iets dus.

Hier heb ik nog een opmerking over.

zo'n kabel direct aan de ingangen in inderdaad echt geen goed idee, maar 10k in serie met 100nF naar de ground is meestal goed genoeg;

Ik zie daar toch liever nog een pull-down van 10K, maar als je dat doet krijg je maar 2.5V op je ingang. En dat is ook weer kritisch.

EDIT:

@TS,

Net even het adapter printje gevreesd.

Als je haar maar goed zit, GROETEN LAMBIEK.

Op 12 september 2020 10:29:54 schreef SparkyGSX:
@TS: de 12V vanaf je accu is geen "schone" 12V, het is verstandig om een beetje beveiliging te voorzien, om de ergste rommel buiten de deur te houden. Nu is de load dump in ISO 7637-2 en ISO 16750-2 wel erg ruig; 80V op een 12V systeem (dat is wanneer de dynamo de accu stevig aan het laden is, en de verbinding naar die accu verbroken wordt).

Zo'n voeding als Lambiek voorstelt is prima, als je daar even een seriediode voor zet, met een bufferelco met keramische of MKP parallel, en als je het goed wilt doen nog een TVS voor de korte en hoge pieken.

We gaan die ingang inderdaad "opschonen" om eventuele pieken te voorkomen. Nu ben ik daar zelf niet zo bang voor want de 12V punten zijn in de tegenwoordige trekkers ook gestabiliseerd. Een moderne trekker doet niet veel onder voor een moderne auto wat dat betreft.

Ik heb nog wel even een verzoek vwb de code. Op de analoge outputs zitten nu LED's ter controle van de programma status. Maar deze zal ik niet gaan gebruiken omdat het mij toch niet veel zal zeggen als er zo'n ledje brandt. In plaats daarvan zou ik liever de 5 LED's als output hebben die de LED's van de laserontvanger kopieren omdat deze niet meer zichtbaar zullen zijn. Is dit mogelijk?

Op 12 september 2020 10:48:45 schreef Lambiek:Ik zie daar toch liever nog een pull-down van 10K, maar als je dat doet krijg je maar 2.5V op je ingang. En dat is ook weer kritisch

Niet als je de pull-down voor de serieweerstand zet.

@TS: Wil je dat ze mee knipperen? Wat ze nu doen, is de status van de ingangen volgen na het filter; dus het enige verschil is dat ze niet knipperen, maar blijven branden in de uit-periode van de LEDs van de ontvanger. Alleen A5, die aangeeft of de ingang stabiel is, zou je dan weg kunnen laten. Uitgang D1 geeft aan of de automatische mode actief is, ik neem aan dat je die gewoon wilt behouden.

Als je de regel

code:

digitalWrite( A0 + Index, !InputCounters[ Index ] );

vervangt door

code:

digitalWrite( A0 + Index, !ReadInputs & ( 1 << Index ) );

volgen ze de ingangen; als je de LEDs van de uitgang naar de ground zet, in plaats van vanaf de voeding naar de uitgang (sourcen vs. sinken) moet je het uitroepteken weghalen.

[Bericht gewijzigd door SparkyGSX op woensdag 16 september 2020 21:13:23 (53%)

Een manager is iemand die denkt dat negen vrouwen in één maand een kind kunnen maken

Op 16 september 2020 19:16:06 schreef SparkyGSX:

@TS: Wil je dat ze mee knipperen?

Ik ben persoonlijk meer voorstander van gewoon branden ipv knipperen. Eigenlijk gewoon zoals we de outputs voor de relais ook aansturen.

Echt precies terwijl ik de code schrijf :-p

Dan doen ze zonder wijzigingen gewoon wat je wilt, in mijn beleving.

Een manager is iemand die denkt dat negen vrouwen in één maand een kind kunnen maken

Aha, dan heb ik deze zin van jou niet goed begrepen.

Op 7 september 2020 20:39:55 schreef SparkyGSX:

De analoge pinnen worden niet analoog gebruikt, maar voor 6 LEDs die de interne status weergeven; A0 t/m A4 geven de status van de ingangen na het filter, terwijl A5 weergeeft of de status stabiel is bevonden. Elk van deze pinnen moet daarvoor een LED krijgen met een weerstand in serie, van de uitgang naar de ground voeding.

Maar nu ik hem nog eens goed lees begrijp ik dat A0 t/m A4 gewoon al de output weergeeft die naar de relais wordt gestuurd?
Had ik ze toch maar even aangesloten dan..... :S

Nee, die geven de status van de ingangen, na het filter dat het knipperen moet onderdrukken. Als je LEDs wil die de status weergeven van de relais, waarom zet je die LEDs dan niet gewoon parallel met de relais? Elke LED even een weerstandje geven, natuurlijk.

Een manager is iemand die denkt dat negen vrouwen in één maand een kind kunnen maken

Ja dat kan natuurlijk ook. Maar zoals jij hem omschrijft is het beter. Wat is eigenlijk de reden dat ze een weerstand naar de voeding krijgen ipv naar de GND?