Sida 1 av 1

Arduinoprogram för stigande resp. fallande flank

Postat: 29 november 2014, 12:41:48
av Maxieboy
Jag håller på med att sätta in lite elektronik på min modelljärnväg. Jag vill styra bommar så att dem går ner när loket passerar första givaren innan bomanläggningen och att bommarna går upp igen när sista vagnen har passerat givaren på andra sidan bomanläggningen. Jag använder IR-moduler (IS471FE) för att detektera och vill använda Arduino NANO V3 för att styra detta plus lite annat som påverkas i samma område. Hur IR-mottagaren sitter monterad framgår av bifogad bild. Bommarna styrs via relä.

Det lär finnas två interruptingångar på en Arduino NANO så det är dem jag vill använda. Två ingångar och två utgångar i inledningsskedet.

Jag behöver alltså en programsnutt som läser givaren på stigande flank i första fallet och på fallande flank i andra fallet.
Hur skriver jag programmet? Jag har inte gjort så mycket programmering ännu men kan det mest grundläggande.
Såhär ser koden ut för tillfället...

void setup()
{
volatile int falling = HIGH;
volatile int rising = HIGH;
int count = 0;
pinMode(2, INPUT); //S3
pinMode(3, INPUT); //S4
pinMode(4, OUTPUT); //R1
attachInterrupt();
}
void loop()
{
if (digitalRead(2) == HIGH, RISING) //S3Givaren vid utfarten från Stationen blir påverkad av Loket/Vagnen/Rälsbussen, vilken som nu går först i tåget//
digitalWrite(4, HIGH); //Relä R1 drar och sätter igång bomfällning//
if (digitalRead(3) == HIGH, FALLING) //S4 fallande flank när sista vagnen lämnar givaren.
digitalWrite(4, LOW); //Reläet R1 faller och bommarna går upp//
}

Re: Arduinoprogram för stigande resp. fallande flank

Postat: 29 november 2014, 12:59:31
av Bosen
Det finns väl ingen anledning att använda interrupt för att bommarna ska gå upp igen.
Alltså bom ner på stigande flank och sen polla och kolla om tåget är kvar. När tåget är borta så kör upp bommarna igen.

Re: Arduinoprogram för stigande resp. fallande flank

Postat: 29 november 2014, 13:46:37
av Maxieboy
Beskriv gärna hur. Polla??? Det är en givare var sida om övergången och tåg i båda riktningar.
Bommen får ju inte börja gå upp förrän sista vagnen passerat.

Re: Arduinoprogram för stigande resp. fallande flank

Postat: 29 november 2014, 15:31:09
av sodjan
> Polla???

Det betyder att man med jämna intervall kollar något. D.v.s istället
för att brevbäraren ringe på dörren så går du och kollar brevlådan
lite då och då.

Fungerar utmärkt om det är en enkel reglerapplikation (som i detta
fall) och önskade svarstider är så pass långsamma som i detta fall.
Men "långsam" menar jag allt som är över 1/10 sek, ungefär.

Då låter helt enkelt Arduinon ligga i en stor loop där man hela tiden
kollar var som händer och om rätt vilkor är upppfylda (i kombination
med aktuellt status, så klart) så gör man saker, "bom upp" t.ex.

Fördelen är att du kan använda alla ingångar helt fritt utan att
vara låst till en eller två som kan användas till interrupt.

Re: Arduinoprogram för stigande resp. fallande flank

Postat: 29 november 2014, 15:43:36
av Icecap
Om Arduinon bara ska styra bommarna är det enkelt och den kan ganska säkert styra en hel del samtidig.

Nu vet jag inte om det behövs men ett bra sätt kan vara att skapa en timer-interrupt som kör med känd hastighet. En hastighet på kanske 10 gg/sek eller mer är helt OK.

Kod: Markera allt

volatile WORD Time_Counter1, Time_Counter2;
#define DELAY_TIME 5

I Timer-ISR: (10Hz)
if(Time_Counter) Time_Counter--;

I Main-loop:
while(true)
  {
  if(Sensor1 || Sensor2) Time_Counter1 = DELAY_TIME;
  if(Sensor3 || Sensor4) Time_Counter2 = DELAY_TIME;
  if(Time_Counter1)
    {
    // Styr bom1 ner
    }
  else
    {
    // Styr bom1 upp
    }
  if(Time_Counter2)
    {
    // Styr bom2 ner
    }
  else
    {
    // Styr bom2 upp
    }
  }
Nu beror en del ju på hur bommen styrs upp och ner. Är det bara en pinne som ska gå 1 eller 0 är det ju enkelt, är det RC-servo pulser blir det en aning med komplicerat.

Re: Arduinoprogram för stigande resp. fallande flank

Postat: 29 november 2014, 19:25:00
av Maxieboy
Tack för feedback och hjälp. Jag skall testa denna och se hur jag kommer vidare :)