LocoNet på Arduino - att koda en "Multi-dongel"

Boostrar, dekodrar, signaler, m.m. Montering av dekodrar i lok. Datorprogram och programmering.
Användarvisningsbild
LLJ
Inlägg: 4297
Blev medlem: 2012-05-08, 10:27

Re: LocoNet på Arduino - att koda en "Multi-dongel"

Inlägg av LLJ »

@DagCato:
CV97 verkar växla mellan adressen i CV1 och adressen i CV17 och CV18 , dvs mellan två och fyrsiffrig adress. Dock så står det att man växlar mellan dekoderadress och consist adress i vänstra kolumnen.
Lite otydligt vad som egentligen gäller.

Men finns CV97 hos fler dekodrar än Zimo? Annars är det inte användbart i modulsammanhang i allafall.

/Lars
DagCatoSkårvik
Inlägg: 52
Blev medlem: 2013-09-07, 00:51

Re: LocoNet på Arduino - att koda en "Multi-dongel"

Inlägg av DagCatoSkårvik »

Jeg tolker det (ved hjelp av Google translate) til at du kan veksle mellom adresse i CV1 eller CV17/18 og CV19/20. Leser man beskrivelsen til CV19, 20, 21 og 22 gir det mer mening.
Du kan også velge mellom 2 og 4-sifret consistadresse ved hjelp av CV20.
Dersom du går til side 69 og leser beskrivelsen av CV97 får vi det bekreftet :-)

Tror det er kun Zimo som har den. Den ble brukt i Penig i februar under multing av to motorvognsett. Litt kronglete å få til siden vi ikke egentlig visste hva vi gjorde :D
MVH
Dag Cato
Användarvisningsbild
LLJ
Inlägg: 4297
Blev medlem: 2012-05-08, 10:27

Re: LocoNet på Arduino - att koda en "Multi-dongel"

Inlägg av LLJ »

Jag har sett att man multat/splittrat motorvagnar vid en träff i Hartmansdorf. Det fanns då en dator med "knappar" på skärmen där man valde förutbestämda fordon och multade/splittrade dessa.
Om man använde CV97 eller inte vet jag inte men tror man använde annan metod.

/Lars
Användarvisningsbild
StefanFjällemark
Inlägg: 1338
Blev medlem: 2014-09-01, 07:35
Ort: Stenungsund på Västkusten

Re: LocoNet på Arduino - att koda en "Multi-dongel"

Inlägg av StefanFjällemark »

För att köra multipel är en förutsättning fordonen ha närmast identiska fartkurvor så de drar jämnt under körningen.

För att multa fordonen är den enklast med en programvara som replikerar hastighetskommando till en adress vidare till en eller flera andra adresser.
Förmodligen är det en sådan lösning som användes i Hartmansdorf.

Fördelen med en sådan lösning är ju att en dator ansluts till LocoNet och lyssnar på hastigheten för den lokadress som är master. Samma hastighet sänds ut till den eller de lokadresser som skall följa mastern. När dessa fordon inte längre skall följa mastern väljer man i datorn att inte replikera hastighetsdata till detta fordon. Detta kan man t.ex. hantera via en webbsida, så till- och frånkoppling kan hanteras "på distans", t.ex. vid den station där till- eller frånkoppling sker.
Hälsningar från Stefan på västkusten :geek:
Ordförande i Svenskt Modulforum och medlem i FREMO, VMJF och MJF Rälsbiten
BoA
Inlägg: 94
Blev medlem: 2017-10-20, 17:55

Re: LocoNet på Arduino - att koda en "Multi-dongel"

Inlägg av BoA »

Är det inte lite knasigt att blanda in en dator till en sådan simpel funktion.
En microprocessor löser det precis som jag beskrivit tidigare i tråden.
Lösningen bygger på att man själv gör valet multikörning eller inte med sin körkontroll.
Dongen är ju ansluten till loconet!
Jag tycker att lösningen lever upp till det Alexander efterfrågar och det som Stefan beskriver som en lösning.....
Jag är mottaglig för synpunkter på lösningen!
/Bosse
Användarvisningsbild
LLJ
Inlägg: 4297
Blev medlem: 2012-05-08, 10:27

Re: LocoNet på Arduino - att koda en "Multi-dongel"

Inlägg av LLJ »

Att man använde en dator i Hartmansdorf berodde bl.a. på att man ville vara säker på att endast vissa dekodrar påverkades. Dessutom är det några år sedan nu, så tekniken har utvecklats en del.

/Lars
Användarvisningsbild
AlexanderEhn
Inlägg: 1153
Blev medlem: 2017-07-11, 23:47
Kontakt:

Re: LocoNet på Arduino - att koda en "Multi-dongel"

Inlägg av AlexanderEhn »

BoA skrev: 2020-01-01, 22:59 Eftersom tomten kom med en Digikeijs DR5000 har jag äntligen fått möjligt att fördjupa mig i Alexander:s liksom som min egen tanke runt multipelkörning.

Med hjälp av ett egenhändigt loconetkort med en Arduino Nano och kod fixas det hela

Givet två FLM 7368 DU2 lok med adresserna 5172 resp. 5173 och concist-adress 5174 så kan jag utföra följande senario:

UT4:an satt till adress 5172.
Lok 5172 backar till ett antal godsvagnar.
UT4:an satt till adress 5173.
Lok 5173 backar till ovanstående lok.
UT4:an sätts till adress 5174.
Tågsättet med två drivande lok kör iväg!

Bör vara möjligt att använda någon modul från Möllehem, där man via BT-gränssnittet ev. kan sätta adresserna för Concist-, Head- och Tail-throttle.

Koden bygger på en Throttle klass som håller koll på de slot resp adresser som vi vill använda!

Vid uppstart och anslutning av loconet efterfrågas slots och registrerar throttlar baserat på de vi önskar köra i mult plus den registrerade concist-adressen,

Hastighet, riktning och F kommandon från concist-throttle repeteras till Head och Tail throtttle.

Jag har inte stoppat in någon checksumma i meddelanden, men det verkar fungera ändå.

Kod: Markera allt

#include <LocoNet.h>

class ThrottleClass 
{
  private:
      uint8_t     mySlot ;
      uint16_t    slotAddress;

  public:      
      void init(uint8_t slot, uint16_t address);    
      uint8_t getSlot();
      uint16_t getAddress();
};

void ThrottleClass::init(uint8_t slot, uint16_t address)
{
  mySlot = slot;
  slotAddress = address;
}

uint8_t ThrottleClass::getSlot()
{
  return mySlot;
}

uint16_t ThrottleClass::getAddress()
{
  return slotAddress;
}


static lnMsg  *RxPacket;
static lnMsg  *TxPacket = new lnMsg();

ThrottleClass  ConcistThrottle;
ThrottleClass  HeadThrottle ;
ThrottleClass  TailThrottle;

uint16_t consist_Address = 5174;
uint16_t head_Address    = 5173;
uint16_t tail_Address    = 5172;

int currentSlot = 0;

void setup() 
{  
  LocoNet.init(6);
  Serial.begin(9600);

  LocoNet.send(OPC_RQ_SL_DATA, currentSlot++, 00);
}

void loop() {

  RxPacket = LocoNet.receive();

  if( RxPacket )
  {
      if(RxPacket->sd.command == OPC_SL_RD_DATA)
      {
        uint8_t slot = RxPacket->sd.slot;
        uint16_t address = (uint16_t) (( RxPacket->sd.adr2 << 7 ) + RxPacket->sd.adr );

        if(address == consist_Address)
        {
          ConcistThrottle.init(slot, address);
          Serial.print("Consist Slot: ");
          Serial.println(ConcistThrottle.getSlot());
          Serial.print("Consist Address: ");
          Serial.println(ConcistThrottle.getAddress());
        }
        if(address == head_Address)
        {
          HeadThrottle.init(slot, address);
          Serial.print("Head Slot: ");
          Serial.println(HeadThrottle.getSlot());
          Serial.print("Head Address: ");
          Serial.println(HeadThrottle.getAddress());
        }
        if(address == tail_Address)
        {
          TailThrottle.init(slot, address);
          Serial.print("Tail Slot: ");
          Serial.println(TailThrottle.getSlot());
          Serial.print("Tail Address: ");
          Serial.println(TailThrottle.getAddress());
        }
         LocoNet.send(OPC_RQ_SL_DATA, currentSlot++, 00);
      }
      if(RxPacket->sd.command == OPC_LOCO_SPD)
      {
        uint8_t slot = RxPacket->lsp.slot;
        if(slot == ConcistThrottle.getSlot())
        {         
          TxPacket->lsp.command = OPC_LOCO_SPD;
          TxPacket->lsp.slot = HeadThrottle.getSlot();
          TxPacket->lsp.spd = RxPacket->lsp.spd;
          LocoNet.send(TxPacket);
          
          TxPacket->lsp.command = OPC_LOCO_SPD;
          TxPacket->lsp.slot = TailThrottle.getSlot();
          TxPacket->lsp.spd = RxPacket->lsp.spd;
          LocoNet.send(TxPacket);
        }
      }

      if(RxPacket->sd.command == OPC_LOCO_DIRF)
      {
        uint8_t slot = RxPacket->ldf.slot;
        if(slot == ConcistThrottle.getSlot())
        {
          TxPacket->ldf.command = OPC_LOCO_DIRF;
          TxPacket->ldf.slot = HeadThrottle.getSlot();
          TxPacket->ldf.dirf = RxPacket->ldf.dirf;
          LocoNet.send(TxPacket);
          
          TxPacket->ldf.command = OPC_LOCO_DIRF;
          TxPacket->ldf.slot = TailThrottle.getSlot();
          TxPacket->ldf.dirf = RxPacket->ldf.dirf;
          LocoNet.send(TxPacket);
        }
      }

      if(RxPacket->sd.command == OPC_LOCO_SND)
      {
        uint8_t slot = RxPacket->ls.slot;
        if(slot == ConcistThrottle.getSlot())
        {
          TxPacket->ls.command = OPC_LOCO_SND;
          TxPacket->ls.slot = HeadThrottle.getSlot();
          TxPacket->ls.snd = RxPacket->ls.snd;
          LocoNet.send(TxPacket);
          
          TxPacket->ls.command = OPC_LOCO_SND;
          TxPacket->ls.slot = TailThrottle.getSlot();
          TxPacket->ls.snd = RxPacket->ls.snd;
          LocoNet.send(TxPacket);
        }
      }
  }
}


Mycket spänande!
Du får visa mig någotn gång framöver hur det funkar! I Grimslöv kanske?!
Pågående byggprojekt just nu:
"Kombihamnen", blir ingen hamn, men väl en kombiterminal i N-skala med svensk förebild Byggtråd här!
"Glassfabriken" blir en industrimodul med genomgående linje, N-Re.
Användarvisningsbild
AlexanderEhn
Inlägg: 1153
Blev medlem: 2017-07-11, 23:47
Kontakt:

Re: LocoNet på Arduino - att koda en "Multi-dongel"

Inlägg av AlexanderEhn »

Nu har träffen i Grimslöv varit och jag kan ge det mycket glädjande beskedet att Bo och jag testade hans egenutvecklade kort med en Arduino på.

På filmen nedan kan ni se vårt ”proof of concept” på att Bo’s lösning fungerar!

Det behöver finslipas lite och få till ett smidigare användargränssnitt. Just nu krävs en dator med hemkodat program för att dongeln ska hitta slottarna för varje lokadress.

Titta & njut! ;)

https://youtu.be/0nAgMNWfLRs
Pågående byggprojekt just nu:
"Kombihamnen", blir ingen hamn, men väl en kombiterminal i N-skala med svensk förebild Byggtråd här!
"Glassfabriken" blir en industrimodul med genomgående linje, N-Re.
Henrik Maude
Inlägg: 158
Blev medlem: 2015-11-14, 18:18

Re: LocoNet på Arduino - att koda en "Multi-dongel"

Inlägg av Henrik Maude »

Härligt. När färdig produkt finns tillgänglig blir det helt klart inköp. Multipelkörning är nått jag gärna sysslar med.
/ Henrik Maude
barnbarns barn till Ivan Öfverholm
Användarvisningsbild
AlexanderEhn
Inlägg: 1153
Blev medlem: 2017-07-11, 23:47
Kontakt:

Re: LocoNet på Arduino - att koda en "Multi-dongel"

Inlägg av AlexanderEhn »

Fick en väldigt intressant idé som feeback efter inlägg på Facebook, postar det här för att spara alla tankar på ett och samma ställe.
En idé om hur man skulle kunna styra och konfigurera:

Man utser en funktionsknapp till global multningsknapp M och en till S. Arduino lyssnar efter M och när den dyker upp så vet den att denna adress nu är master i ett multat set.

Därefter kör man fram nästa lok, det till att det har rätt körriktning och trycker på funktionsknappen för S. Arduino ser att en ny adress har fått S-funktionen och tolkar den som slav i det multadr setet. Sen kan man lägga till fler slavar tills man vill börja på ett nytt set med M-knappen på ett nytt lok.

Multningen avbryts av att man klickar ur M, eller tar bort loken ett och ett genom att klicka ur respektive S.
Styrning sker sen med kontrollen för det lok som har M aktiv och Arduino kopierar hastighet och riktning (baserat på den riktning som varje lok hade från start) till alla slavlok.

Skulle det kunna funka? Då skulle det räcka med en Arduino för all multning och man skulle inte behöva en särskild adress för det multafe setet.

Jag tänker att man utser exempelvis funktion 22 och 23 till M och S för alla lok.

Jag beskriver hur jag tänker mig ett flöde:
  • att lok 9 12 och 33 ska multas med 9 som master
  • så ställer du körriktning rätt på 9, trycker funktion 22, som nu blir Master
  • byter till lok 12, kopplar ihop det med 9, ställer rätt körriktning och trycker sen 23. Detta är nu slav i multen.
  • Sen upprepar du samma sak med lok 33, som kanske är ett påskjutslok i slutet av tåget istället. Lok 33 blir ytterligare en slav.
  • Sen kör du alla tre loken från lok 9.
  • När påskjutsloket inte längre behövs kopplar du bort det från setet genom att välja 33, slå av funktion 23 och köra undan det från tåget.
  • Därefter kan du fortsätta köra 9 och 12 från lok 9.
Arduinon behöver då lyssna på alla lokadresser och reagera på när funktion 22 och 23 aktiveras och avaktiveras för att hålla reda på när multipel-seten skapas eller tas isär, samt kopiera mastrarnas körinfo till slavarna.
Vilka funktionsknappar som den ska lyssna efter kan man ha ett cv för i arduinon (som skulle kunna ha en funktionsdekoderadress).
Det borde väl funka?

Jag inser en sak, nackdelen med denna idén blir tydlig i trafikspel med köruppdrag där multning och brytning av mult ska kunna göras "on the fly" och enklaste sätt.
Det kan vara svårt att skriva instruktioner i köruppdraget att vissa funktionsknappar ska tryckas in vid viss tidpunkt för att kunna multas
Det är enklare att ha ett körhandtag liggandes på "multstationen" som lokföraren byter till.
Pågående byggprojekt just nu:
"Kombihamnen", blir ingen hamn, men väl en kombiterminal i N-skala med svensk förebild Byggtråd här!
"Glassfabriken" blir en industrimodul med genomgående linje, N-Re.
Skriv svar

Återgå till "El, elektronik och programvara"