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

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

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

#11 Inlägg av LLJ » 2020-01-02, 12:34

@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: 45
Blev medlem: 2013-09-07, 00:51

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

#12 Inlägg av DagCatoSkårvik » 2020-01-02, 13:20

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: 3840
Blev medlem: 2012-05-08, 10:27

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

#13 Inlägg av LLJ » 2020-01-02, 16:31

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: 848
Blev medlem: 2014-09-01, 07:35
Ort: Stenungsund på Västkusten

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

#14 Inlägg av StefanFjällemark » 2020-01-02, 20:58

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:
Styrelsemedlem i ModulSyd och medlem i FREMO.

BoA
Inlägg: 50
Blev medlem: 2017-10-20, 17:55

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

#15 Inlägg av BoA » 2020-01-02, 21:24

Ä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
Medlem i ModulSyd och Fremo

Användarvisningsbild
LLJ
Inlägg: 3840
Blev medlem: 2012-05-08, 10:27

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

#16 Inlägg av LLJ » 2020-01-03, 00:31

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: 675
Blev medlem: 2017-07-11, 23:47
Kontakt:

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

#17 Inlägg av AlexanderEhn » 2020-01-05, 02:25

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?!
Bygger Långenäs Långa & Långenäs Korta i N-RE. Byggtråd här!
Kalhyggena byggs tillsammans med pappa, byggtråd här!

Skriv svar

Återgå till "El, elektronik och programvara"

Vilka är online

Användare som besöker denna kategori: 1 och 0 gäst