modeltrein besturing

algemene C code
Berichten: 37
Geregistreerd: 07 Okt 2016, 10:33

Re: modeltrein besturing

Berichtdoor maartentukker » 26 Nov 2016, 20:17

In het eerste voorbeeld staan voor 3 servo's de eindstanden, daarboven [3], [2]. Staat die 2 en 3 voor servo 2 en 3? Zo ja, waar is servo 1? Of hoort die er nog achter?

Advertisement

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: modeltrein besturing

Berichtdoor Koepel » 26 Nov 2016, 23:33

Denk je dat het goed komt ? Als je een sketch hebt die ik heb voorgekauwd en zelf niet begrijpt, dan gaat het mis als je iets wilt wijzigen. Daarom vinden anderen op dit forum het belangrijker dat je iets leert, in plaats van dat ik zeg hoe het kan.

Dit is een array van twee elementen. In de 'c' taal begint de index bij nul.
Code: Alles selecteren
int myFirstArray[2];

myFirstArray[0] = 124;
myFirstArray[1] = 353;


Als je 10 van zulke dingen nodig hebt, dan wordt het: mySecondArray[10][2]

Ik zal nog eens de declaratie laten zien. Het gaat dus om twee getallen voor een servo motor, en dan daar drie stuks van. Ik zal de index er achter schrijven.
Code: Alles selecteren
const int endstops[3][2] =
{
  { 80, 100 },   // servo 1   [0][0] en [0][1]
  { 79,  99 },   // servo 2   [1][0] en [1][1]
  { 82, 105 },   // servo 3   [2][0] en [2][1]
}


Ergens anders schreef ik zoiets:
Een index van een array begint bij 0. De grove onderverdeling komt eerst, dat zijn hier de servo's. De fijnere onderverdeling staat achteraan, dat zijn hier de twee getallen voor de twee standen.
Dus als je 5 planeten hebt, elk met 10 steden, en 50 straten per stad, en 3 huizen per straat, en 2 bewoners per huis. Dan kun je de leeftijd van elk persoon opslaan met dit: int leeftijd[5][10][50][3][2];
Hoeveel mensen zijn er in dat planetenstelsel ? (antwoord: op een paar na het aantal inwoners van Westervoort https://nl.wikipedia.org/wiki/Westervoort).

Berichten: 37
Geregistreerd: 07 Okt 2016, 10:33

Re: modeltrein besturing

Berichtdoor maartentukker » 08 Jan 2017, 10:16

Het is gelukt, duurde even maar met behulp van het internet en zelf knutselen, proberen, aanpassen, etc... werkt het.
Nu is het een kwestie van meerdere pinnen erbij en kijken waarmee wat geschakeld kan worden.
Ik heb iig schakelaars die servo's icm led's aandrijven en eventueel tegelijk een relais aansturen. Ook reed switches sturen een relais aan.
Verder gaan de inputs van de schakelaars naar 2 arduino mega's die elk hun eigen ding ermee doen.

Voeding is nu een grote 10A 12Volt voor alles en komt binnen via Vin en Vcc voor het relais. Een adapter voed nog het breadboard met daarop de servo en reed switches.
Grd is overal doorverbonden.

Code: Alles selecteren
//
// Relais module met externe voeding 12V op JD-VCC en GRD
// Arduino aansturing relais 1 via pin 8, Arduino 5V voeding op VCC naast relais aansluitingen, GEEN GRD voor arduino sturing, dit loopt intern
//
/*
- Beide arduinos GND connected, via breadboard
- INPUT_PULLUP configuratie op beide breadboards hetzelfde inclusie 10K resistor
- middelste pin schakelaar gaat naar beide breadboards
- Wanneer er een array gemaakt wordt, schakeld het relais niet... LED brandt dan ook zwak?????

*/
const byte block1[]       = {6, 7};            // koppel pin 6 aan sensor 1 (blok in) en 7 aan sensor 2 (blok uit)

const byte buttonpins[]   = {A0, A1, A2, A3};  // array van schakelstanden
const byte relaypins[]    = {23, 24, 25, 26};  // array van relay uitgangen
const byte relay1         = 8;                 // uitgang relay tbv block1

const byte numberbuttons  = 4;
const byte numberrelays   = 4;

int blockstate            = 1;                 // variable voor sensor status
int buttonstate           = 1;                 // variable voor schakelaar (button) status


void setup () {

  // tekst ter herkenning programma
  Serial.begin(9600);
  Serial.println("reed sensor met relais en schakelaar met input 2 arduinos WERKEND");

  for (byte j = 0; j < numberrelays + 1; j++)   // relay pinnen configureren
  {
    pinMode (relaypins[j], OUTPUT);
  }
  for (byte j = 0; j < numberbuttons + 1; j++)  // button pinnen configureren
  {
    pinMode (buttonpins[j], INPUT_PULLUP);
  }
  for (byte x = 0; x < 2; x++)                  // reed sensoren configureren
  {
    pinMode(block1[x], INPUT);
  }
  pinMode (relay1, OUTPUT);                     // relay 1 configureren (reed contact)
}

void loop () {

  for (byte x = 0; x < 2; x++) {

    blockstate = digitalRead(block1[x]);

    if (blockstate == HIGH && block1[x] == 6) {        // als sensor 1 geactiveerd, dan relay 1 getrokken (vorig blok spanningsloos), (NC contact)
      digitalWrite(relay1, LOW);
    }
    if (blockstate == HIGH && block1[x] == 7) {        // tot sensor 2 geactiveerd is, dan relay 1 open (weer spanning op vorig blok)
      digitalWrite(relay1, HIGH);
    }
  }

  for (byte j = 0; j < numberbuttons + 1; j++)  {

    buttonstate = digitalRead(buttonpins[j]);          // schakel relais afhankelijk van buttonpin
    if (buttonstate == HIGH) {
      digitalWrite(relaypins[j], HIGH);
    }
    if (buttonstate == LOW) {
      digitalWrite(relaypins[j], LOW);
    }
  }
}



Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: modeltrein besturing

Berichtdoor shooter » 08 Jan 2017, 11:22

je mag LOW en HIGH ook andere namen geven , dan is duidelijker dat als een relais LOW is het relais aan is dus bijv #define aan LOW
verder moet je de volgorde waar je op test even bekijken, want als 2 blokken bezet zijn dan wordt het blok alweer aangezet, (heeft te maken met SR en RS flipflop.
bij de buttons zou je in een array aan kunnen geven of een bediening NC of NO is.

Verder zou ik ook de blockstatus in een array zetten, dan kun je daar straks ledjes op je schakelbord mee bekijken.

12 Volt is wat veel, voor de Vin zeker als je veel pinnen aansluit, dus beter om de arduinos via een externe 5V regelaar te laten lopen.
die mag natuurlijk wel van de 12 V afkomen.
paul deelen
shooter@home.nl

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: modeltrein besturing

Berichtdoor Koepel » 08 Jan 2017, 18:34

Kleiner dan en zonder plus één.

In de 'c' en 'c++' taal begint een array bij nul.
Je telt op twee plaatsen bij het aantal er eentje bij op, maar dan ga je voorbij de grenzen van het array.

Stel een array van 4 elementen, dan heb je een paar mogelijkheden:
Code: Alles selecteren
const int myPins[] = { 10, 11, 12, 13 };
const int myOtherPins[4] = { 6, 7, 8, 9 };
#define NUMBER_PINS 4
const int morePins[NUMBER_PINS] = { 2, 3, 4, 5};
const int numberPins = 4;


Dan wordt een for-loop altijd gedaan met een "kleiner dan" teken en dus zonder "plus één".
Want het array heeft 4 elementen, dat is dus index [0] tot en met index [3]. Dit zijn een paar mogelijkheden:
Code: Alles selecteren
  for (int i=0; i<numberPins; i++)
  ...

  for( int i=0; i<NUMBER_PINS; i++)
  ...

Berichten: 37
Geregistreerd: 07 Okt 2016, 10:33

Re: modeltrein besturing

Berichtdoor maartentukker » 03 Feb 2017, 12:44

Ik heb even een vraag van andere orde. Ik ben bezig een L298n motorcontroller te gebruiken om treinen te laten afremmen bij een station. Nu is het de bedoeling dat een trafo van fleischmann de rails voed, maar ook de controller om eenzelfde spanning te hebben.
De travo voed de doorlopende rails en de controller op zijn beurt weer de rails voor het station.
Wanneer een trein bij het station komt registreerd een reed contact dit en moet de controller de spanning afbouwen zodat de trein stopt.
Wanneer ik nu de spanning meet als alles aangesloten is zie ik dat de uitgaande spanning van de travo is verdubbeld naar 24V ipv 12V zonder controller.
De travo heeft een 0V middenstand en kan zowel linksom als rechtsom (+, -) 12V spanning leveren.
Hoe kan de controller van 12V, 24V maken ondanks dat ik normaal alleen bij de door mij gebruikte stand +12V meet?

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: modeltrein besturing

Berichtdoor nicoverduin » 03 Feb 2017, 19:50

maartentukker schreef:Ik heb even een vraag van andere orde. Ik ben bezig een L298n motorcontroller te gebruiken om treinen te laten afremmen bij een station. Nu is het de bedoeling dat een trafo van fleischmann de rails voedt, maar ook de controller om eenzelfde spanning te hebben.
De trafo voedt de doorlopende rails en de controller op zijn beurt weer de rails voor het station.
Wanneer een trein bij het station komt registreert een reed contact dit en moet de controller de spanning afbouwen zodat de trein stopt.
Wanneer ik nu de spanning meet als alles aangesloten is zie ik dat de uitgaande spanning van de trafo is verdubbeld naar 24V ipv 12V zonder controller.
De trafo heeft een 0V middenstand en kan zowel linksom als rechtsom (+, -) 12V spanning leveren.
Hoe kan de controller van 12V, 24V maken ondanks dat ik normaal alleen bij de door mij gebruikte stand +12V meet?

Het wordt wel erg lastig als niet duidelijk is hoe alles is aangesloten en ook aangeeft hoe je de spanning afbouwt met de controller die de stroom regelt en de spanning constant houdt op de voedingsspanning
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: modeltrein besturing

Berichtdoor shooter » 03 Feb 2017, 20:43

ja dat 24 Volt kan wel hoor. De trafo is eigenlijk een 24 Volt met middenaftakking.
Het is echt veel slimmer om een voeding met een vaste spanning onder de tafel te leggen, en daar dan het rijwerk vanaf halen, en van een andere de lampjes en wissels.

maar zorg ervoor dat je de spanning voor je L298N vast aansluit op je trafo, dus de trafo op max zetten en dan onder de tafel leggen en nooit meer aankomen. die shieldjes kunnen er niet tegen als de spanning er verkeerd om op komt.

van die rijspanning maak je een paar aftakkingen die naar de L298N bordjes gaat. zorg dat de stroom beperkt wordt tot 2 Ampere zelfs bij kortsluiting. (en dat komt heel vaak voor als de lok over een geisoleerde las rijd. of een wissel. bijvoorbeeld met grote weerstanden van 6 ohm.

Op 1 shieldje kun je al 2 stroomkringen aansluiten, dus in het begin je buitenbaan, en het zijspoor apart.
dan kun je dus op je hoofdbaan gewoon rijden en op het zijspoor rangeren. en dat tegelijk.
dat kun je dus met 2 potmeters of 2 joystick of 2 schuifpotmeters die naar de arduino gaan, en die zorgen dan voor de sturing van de L298N bordjes, met richting en snelheid.
Uiteraard kun je een reedcontact gebruiken , als deze aan geweest is, dan telkens de PWM verlagen tot deze 0 is.
paul deelen
shooter@home.nl

Vorige

Terug naar C code

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 7 gasten