Doel:€250.00
Donaties:€125.00

Per saldo:€-125.00

Steun ons nu!

Laatst bijgewerkt
op 06-12-2019
Algemeen

De stichting

Recente berichten

kerstbaantjes/winterbanen door Baan Wally
Vandaag om 00:46:58
Mallnitzer Tauernbahnstrecke ÖBB N Spoor door Schachbrett
Vandaag om 00:41:13
Timmer på Dalsland. door Hendrik Jan
Vandaag om 00:26:46
Boogstraal Fleischmann rails door Mechiel_
Vandaag om 00:25:22
Van Dapol spoor 0 class 08 naar NS 500/600 door ingenium
06 december 2019, 23:57:59
NCS 7/8 tot NS 61 62 Maffei lok in spoor 0 door FritsT
06 december 2019, 23:38:49
Piko NS1100, materieelbespreking door roadster36
06 december 2019, 23:37:06
Hoch über dem Fluss Albula (Project 0m, iets heel anders: Rhätische Bahn) door Ronald Halma
06 december 2019, 23:24:50
Van Biervliet/B Models 2019 door Joran
06 december 2019, 22:52:27
Cranicher Altbahn door Noordernet
06 december 2019, 22:43:36
Wensendraadje Nederlands 2020 door Reinier Z.
06 december 2019, 22:43:17
Plaats hier foto's van modeltreinen in een onverwachte omgeving door RICROO
06 december 2019, 22:42:00
EifelBurgenBahn door Wim Hesselink
06 december 2019, 22:41:30
Mijn eerste H0-modeltreinbaan in aanbouw door Wim Vink
06 december 2019, 22:29:52
Projekt 083-338 door 44
06 december 2019, 22:19:38
Frans loodsje door Noordernet
06 december 2019, 22:18:40
Bouw Bührtal III door Daniel Caso
06 december 2019, 22:09:42
Mat 54 in Schaal 0 door Mitchell
06 december 2019, 21:59:59
De CanBus komt naar Kranenberg, Arduino's en de CanBus door meino
06 december 2019, 21:48:46
Lettertype Duitse spoorwegen door Jeanne
06 december 2019, 21:43:54
BR 94 Trix rijdt niet meer door Olivier77
06 december 2019, 21:19:24
1/32 schaal, 'Papier Berken", andere bomen , grassen en meer. door Daniel Caso
06 december 2019, 21:06:51
Haardvuurtje in de hut door jerrytrein
06 december 2019, 20:52:48
Modulebaan.nl in Zutphen 21 en 22 december 2019 door Marc tramt
06 december 2019, 20:12:11
Wissels wel/niet van DCC-spanning voorzien via diodebrug? door PeterNS
06 december 2019, 19:50:36
Raadplaatje door René 4312
06 december 2019, 19:43:12
Onlangs gespot - gefotografeerd, de foto's door Floris
06 december 2019, 19:14:34
Show je realistische treinsamenstelling door 1200blauw
06 december 2019, 18:35:38
Faller 2019 door ex-DR V100
06 december 2019, 18:31:41
Bahnstrecke 5867 door Frank 123
06 december 2019, 17:36:21
  

Auteur Topic: De CanBus komt naar Kranenberg, Arduino's en de CanBus  (gelezen 6366 keer)

Robert E

  • Offline Offline
  • Berichten: 835
    • Micro controllers en modelspoor
Re: De CanBus komt naar Kranenberg, Arduino's en de CanBus
« Reactie #45 Gepost op: 17 november 2019, 21:11:52 »
Citaat
Maar dan kan wel voor "irritaties"zorgen als er meerdere mensen aan moeten werken

Ident tool gebruiken....


Citaat
2 of 4 spaties?

Spaties, die ellende als je file eens opent op andere machine die toevallig niet de juiste IDE heeft en file opent in kladblok / Notepad++

Trouwens, als C "man" is die hele OO ook een overgang ondanks dat ik OO achtig programmeer in C....
Al helemaal de struggle / overgang naar C# die ik moet en wil maken  :)
Naja, uitdaging :)

Mvg

Robert
MDRRC-II goedkope DIY centrale voor DCC en MM

meino

  • Offline Offline
  • Berichten: 571
Re: De CanBus komt naar Kranenberg, Arduino's en de CanBus
« Reactie #46 Gepost op: 17 november 2019, 23:42:44 »
In Arduino IDE zit ergens een optie die de code netjes maakt als ik me goed herinner.
<Ctrl>t

Overigens gebruik ik meestal Netbeans, daarin kan ik in de Editor options de gewenste formatting(indentatie) per taal opgeven, die dan automatisch wordt uitgevoerd.

Groet Meino
A clean desk is a sign of an empty mind

Kranenberg

Te 2/2

  • Offline Offline
  • Berichten: 651
  • Metrop-Märklin
Re: De CanBus komt naar Kranenberg, Arduino's en de CanBus
« Reactie #47 Gepost op: 18 november 2019, 12:55:51 »
Netbeans
Kun je Netbeans of Eclipse ook gebruiken bij Arduino schrijfsels, dan?
(ben er zelf kennelijk al weer een tijdje uit)
Jan Willem

analoog hybride DC baan (2-rail+3-rail),
CH, peco, piko, roco, k-rail

bask185

  • Offline Offline
  • Berichten: 235
Re: De CanBus komt naar Kranenberg, Arduino's en de CanBus
« Reactie #48 Gepost op: 18 november 2019, 13:34:46 »
if(x < 5) {
    if(y > 6) {
        doeIets();
        if(z == 7) {
            doeIetsAnders(); }
    helloWorld(); } }
Zal prima compilen maar doet wat anders dan de indentatie doet vermoeden.
In tegendeel. De identatie laat precies zien waar wat bijhoort.
Als je het normaal "standaard" noteert. Veranderen de indentaties namelijk niet.

if(x < 5) {
    if(y > 6) {
        doeIets();
        if(z == 7) {
            doeIetsAnders();
        }
        helloWorld();
    }
}
of nog "erger":
if(x < 5)
{
    if(y > 6)
   {
        doeIets();
        if(z == 7)
        {
            doeIetsAnders();
        }
        helloWorld();
    }
}
Ik heb dus ondervonden dat methode 1 (die van mij dus) niet onderdoet aan de "standaards". En methode #3 heeft dubbel zo veel regels als #1

Bovendien!
Citaat
Om te "forceren" (lees: makkelijk kunnen controleren) dat ik genoeg sluit-accolades plaats om niet per ongeluk de boel verkeerd te groeperen.
Ik gebruik hiervoor: de bracket highlighting tool die in bijna elke half knappe editor zit. We mogen niet vergeten dat we gezegend zijn met schitterende alles kunnende text editors zoals Vs code, of sublome of netbeans of ...
#indentatie flaming off  :P

Er zijn trouwens 3 dingen die ik met macro's doe om fouten en onduidelijkheden te voorkomen
  • Ik maak ze aan, waar ik ze nodig heb, zodat je deze automatisch leest, voordat je code leest waar ze gebruikt worden
  • Ik test de macro's afzonderlijk op bugs, voordat ik ze op 300 plaatsen gebruik
  • In mijn state machines zijn de 4 cruciale macro's (die de klok laten tikken) allemaal gegeneerd en alle gebruiken zijn ook gegenereerd. Aangezien de computer voor mij, goed geteste macro's 'tikt', kan ik of m'n collega er geen fouten in maken

In C zijn macro's ook handig voor functies met "verschillend aantal argumenten". Eigenlijk heeft C dat niet muv die var args ellende ed. En printf() enzo.
Met macro's maak ik dan 'lookalike' functies waarbij sommige argumenten voor je worden ingevuld. Een mooi voorbeeldje:
Op werk gebruikten we ooit de functie:
startAfter(&foo, 500, 200, 0);
Deze functie startte functie foo na 500 ms en bleef dat vervolgens om de 200ms doen. Als het laatste argument 1 is, dan wordt foo maar 1x uitgevoerd. Dat noemden we oneshot timers.
Voor het 'gemak' hadden we 2 simpele macro's:
#define trigger(func,interval) startAfter(func,interval,1)
#define start(func,interval) startAfter(func,interval,0)
ipv startAfter tikten we of start of trigger, afhankelijk of een functie herhaaldelijk of 1 malig uitgevoerd moest worden. En heel af en toe was het nodig dat we wel startAfter moesten gebruiken. Super elegant als je geen method overloading (gebruik ik de goede term) tot je beschikking heb, als zeg ik het zelf.
macro flaming ook off  ::)

Ik heb zelf ook assembly hel gedaan en ik weet dat een goede switch-case zich transleert naar een jumptabel. Ik zie echter niet het probleem met de restrictie van het gebruik van int en char... of wat ik gewoon als bytes zie. Dat werkt toch gewoon?  ::). met uControllers raak ik sws geen floats of doubles aan.

Wat ik zelf wel mis aan een switch-case is dat je niet cases kan uitvoeren adhv getallen gebieden. Je hebt geen case (var >= 0 && var < 10):

Je kan hier nog wel eens omheen werken met de handige Map(var, 0,10,0,100) functie. Die dan je getallengebiedjes omzet naar een bruikbare int voor een switch case. Maar soms ook niet en dan zit je toch vast aan een if-else ketting. :-[


Kun je Netbeans of Eclipse ook gebruiken bij Arduino schrijfsels, dan?
(ben er zelf kennelijk al weer een tijdje uit)
Je kan ook kladblok gebruiken. Als je in arduino naar settings ga (Ctrl + comma) dan kan je het boxje (externe editor) aanvinken en kan je elke editor naar keuzen gebruiken. De arduino IDE kan dan geen code meer aanpassen en de coder verandert meteen mee met je andere editor bij elke save. Dan gebruik je Arduino alleen maar om te compilen.

Je kan het ook meteen goed doen en arduino met Vs code en een arduino plugin compileren. Of je compileert via een terminal. Dan kan je met elke editor compileren waarmee je scripts kan aanroepen.

meino

  • Offline Offline
  • Berichten: 571
Re: De CanBus komt naar Kranenberg, Arduino's en de CanBus
« Reactie #49 Gepost op: 18 november 2019, 15:17:53 »
Kun je Netbeans of Eclipse ook gebruiken bij Arduino schrijfsels, dan?
(ben er zelf kennelijk al weer een tijdje uit)
Ja dat kan. Ik heb zelf Netbeans opgetuigd om een Arduino project te kunnen maken, Dat werkt met makefiles. Maar ik gebruik het zelf niet meer om een schets mee te bouwen, dat gaat goed, maar het switchen van platform (UNO->Mega etc) kost vrij veel handelingen, en ook het automatisch hercompileren van de bibliotheken gaat niet. Verder vond ik ook het uploaden complex.
Aangezien mijn schetsen over het algemeen vrij simpel zijn, het meeste werk doe ik in een bibliotheek, blijf ik daarvoor de Arduino IDE gebruiken. Ik gebruik Netbeans wel voor het maken en onderhouden van de gebruikte bibliotheken, maar dat beperkt zich tot edit werk van de .cpp en .h bestanden, waarbij de Netbeans editor en navigator het werk aanmerkelijk makkelijker maakt.

Groet Meino
A clean desk is a sign of an empty mind

Kranenberg

Robert E

  • Offline Offline
  • Berichten: 835
    • Micro controllers en modelspoor
Re: De CanBus komt naar Kranenberg, Arduino's en de CanBus
« Reactie #50 Gepost op: 18 november 2019, 21:08:31 »
Citaat
of Eclipse ook gebruiken bij Arduino schrijfsels,

Sloeber is kant en klare Eclipse omgeving voor Arduino inc. support voor andere arduino varianten als de EPS8266 / STM32's enz.

https://eclipse.baeyens.it/

Die Arduino IDE omgeving is toch net een typemachine maar dan net iets slimmer, maar niet veel :)

Citaat
Ik heb dus ondervonden dat methode 1 (die van mij dus) niet onderdoet aan de "standaards".

Voor mij persoonlijk visuele puinhoop, ik ben van de

Citaat
of nog "erger":
manier van werken...

Mvg

Robert
« Laatst bewerkt op: 18 november 2019, 21:10:25 door Robert E »
MDRRC-II goedkope DIY centrale voor DCC en MM

meino

  • Offline Offline
  • Berichten: 571
Re: De CanBus komt naar Kranenberg, Arduino's en de CanBus
« Reactie #51 Gepost op: 19 november 2019, 00:00:30 »
of nog "erger":

Ik ben ook van die school. Komt uit de tijd van vi op een VT100 of xterm window. Dan kon je makkelijk met een % checken of de blokken correct waren. Als de plaats van de brackets in de regel versprong dan had je een probleem.

Groet Meino
A clean desk is a sign of an empty mind

Kranenberg

bask185

  • Offline Offline
  • Berichten: 235
Re: De CanBus komt naar Kranenberg, Arduino's en de CanBus
« Reactie #52 Gepost op: 19 november 2019, 08:06:34 »
Voor mij persoonlijk visuele puinhoop

Kijk Meino, ik heb er weer "zo'n eentje" gevonden  :o

Wat de boer (spreekwoordelijk bedoeld) niet kent dat noemt ie maar een puinhoop

meino

  • Offline Offline
  • Berichten: 571
Re: De CanBus komt naar Kranenberg, Arduino's en de CanBus
« Reactie #53 Gepost op: 19 november 2019, 10:10:44 »
@bask185
Dat Robert een sterke mening hier over heeft, is zijn visie. Als je in een grote ontwikkelgroep werkt, waarbij het onderhoud door anderen dan de oorspronkelijke ontwikkelaar plaats vindt, dan kan een standaard stijl belangrijk zijn. Maar uiteindelijk gaat het er om dat de programmeur zich happy voelt met een bepaalde stijl. Dus geef ik geen waardeoordeel over een bepaalde stijl. Wel heb ik zelf een voorkeur stijl, die ik in Netbeans heb geconfigureerd.

Ik denk dat het tijd wordt om deze discussie te stoppen.

Groet Meino
A clean desk is a sign of an empty mind

Kranenberg

bask185

  • Offline Offline
  • Berichten: 235
Re: De CanBus komt naar Kranenberg, Arduino's en de CanBus
« Reactie #54 Gepost op: 19 november 2019, 11:16:11 »
Ik denk dat het tijd wordt om deze discussie te stoppen.
Akkoord!

Heb je nog voortgang gemaakt met je baan?

Patrick Smout

  • Offline Offline
  • Berichten: 287
Re: De CanBus komt naar Kranenberg, Arduino's en de CanBus
« Reactie #55 Gepost op: 19 november 2019, 13:47:06 »
Hoi Meino,

niet zeker of je deze kent

https://openlcb.org/about-openlcb/introduction-to-openlcb/

Misschien een idee om (mee) op een standaard in wording te springen.

mvg,

Patrick Smout

meino

  • Offline Offline
  • Berichten: 571
Re: De CanBus komt naar Kranenberg, Arduino's en de CanBus
« Reactie #56 Gepost op: 19 november 2019, 14:26:55 »
Patrick

bedankt voor het linkje, ik ga het zeker eens goed bestuderen.

Groet Meino
A clean desk is a sign of an empty mind

Kranenberg

Karst Drenth

  • Offline Offline
  • Berichten: 9346
  • NS blauw, groen, rood, bruin, grijs en standgroen
    • Plan U op Sleutelspoor
Re: De CanBus komt naar Kranenberg, Arduino's en de CanBus
« Reactie #57 Gepost op: 19 november 2019, 14:46:17 »
Citaat van: meino
ik ga het zeker eens goed bestuderen.

En als je dan toch bezig bent ;)

https://www.nmra.org/lcc

Een nieuwe NMRA standaard gebaseerd op OpenLCB.  8)

Grtzz,

Karst

meino

  • Offline Offline
  • Berichten: 571
Re: De CanBus komt naar Kranenberg, Arduino's en de CanBus
« Reactie #58 Gepost op: 19 november 2019, 17:35:35 »
Na al deze discussies wordt het weer tijd om naar het onderwerp terug te keren.
Wel is het zo, dat ik toch nog even goed naar mijn code heb gekeken. En naar aanleiding van de discussie over interfaces, heb ik toch nog wat gewijzigd. Ik heb nu een echte interface gedefinieerd in de vorm van een virtuele klas (CbusInterface).
Ik laat nu het CanBus.h bestand zien en aan de hand hiervan iets te vertellen.

Ik begin met een stel definities:

#include <SPI.h>
#include <mcp2515.h>

#define CANBUS_DEBUG 0
#define CANBUS_DEBUG1 0

//
// Id's of the different types of controllers on the CanBus
//      Maximum nr of ID's is 127!!!
//
enum systemId {
    BEZETMELDER_CONTROLLER_ID = 1,   //  16 Bezetmelder controllers supported
    WISSEL_CONTROLLER_ID = 17,       //  16 Wissel controllers supported
    SEIN_CONTROLLER_ID = 33,         //  16 Sein controllers supported
    DCC_INTERFACE_ID = 126,          //   1 DCC Interface system supported
    S88_INTERFACE_ID = 127           //   1 S88 Interface system supported
};

//
//  Error codes
//
enum cbError {
    CB_OK = 0,
    CB_FAIL = 1
};

//
//  There are several types of messages, each is identified by an unique number
//  the lowest id's have the highest priority
//
//  DCC_ACC   defines a DCC Accesory command
//  OCC_DT    defines an Occupance detector that triggered
//  DCC_LOC   defines a DCC locomotive command
//

enum messageId {
    OCC_DT = 1, DCC_ACC = 2, DCC_LOC = 3
};

//
//  Struct used for the Occupance Detector message
//
typedef struct
{
    unsigned short    address;
    byte              state;
} OCC_DT_MSG;

//
//  Struct used for the DCC Accessory command
//
typedef struct
{
    unsigned short    address;
    byte              direction;
} DCC_ACC_MSG;

//
// A request for sending a message is handled by putting it on
// the send queue. The heartbeat method is the responsible for
// the actual sending.
//
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
#define NROFSENDBUFFERS 32      // Buffers on the MEGA
#endif
#if defined(__AVR_ATmega328P__) || defined(__AVR_ATmega168__)
#define NROFSENDBUFFERS 4       // Buffers on the UNO
#endif

//
//  Type definition for the call back routine which will handle a received
//  message.
//
typedef void (*msgReceiver_t)(unsigned char aMsgLen, void *msgData);
Hierin worden zaken als Systeem id's, bericht layouts, bericht types etc gedefinieerd.

De interface definitie die de klasse die met de physieke CanBus/bibliotheek communiceerd, moet implementeren.
//
//  The Interface which has to be implemented by all classes that seperate the
//  CanBus class from the used hardware and supporting library.
//
class CBusInterface {
protected:
    friend class CanBus; // Give CanBus access to the internals
       
    virtual void begin(byte aSystemId) = 0;
    virtual cbError sendMsg(messageId anId, unsigned int aMsgLen, void *msgData) = 0;
    virtual void heartBeat() = 0;
    virtual void setMsgReceiver(messageId aMsgId, msgReceiver_t aMsgReceiver) = 0;
    virtual void prepareForSend() = 0;
};
Alle methods van deze interface zijn protected, dit omdat deze niet direct vanuit de gebruikers schets aangeroepen mogen worden, maar dat altijd onder controle van de CanBus klasse moet gebeuren.

De klasse die met het MCP2515 kaartje via de "arduino_mcp2515_master" bibliotheek communiceert.
//
//  This class implents the CBusInterface and supports the MCP2515 chip in
//  combination with the "arduino-mcp2515-master" library.
//
class Mcp2515 : public CBusInterface {
private:
   
//
//  Stuff for the send buffers
//
#define MAXRETRIES 10
    int  sendRetryCount = 0;
    int  nrOfSendBuffers = 0;
    volatile long lastTimeSend = 0;

    volatile int firstEmptySB = 0;
    volatile int firstUsedSB = -1;
    volatile can_frame *sendBuffers = nullptr;
 
#define MESSAGE_WAIT_TIME 10                // Max 100 messages per second
    int  sendWaitTime = MESSAGE_WAIT_TIME;  // Minimum time between successive
                                            // sends, this to throttle the
                                            // the rate of messages produced
                                            // by this sender.
 
    byte systemId;
    MCP2515 *can_bus;
   
    msgReceiver_t msgReceiver[16];
   
    int activeFilter = 0;
   
    void setMaskAndFilter(const unsigned long aFilter);
    void acceptMsgId(messageId aMsgId);
   
    cbError sendMsg();
    void receiveMsg();
   
    init(int aCsPin, int aSendWaitTime, int aNrOfSendBuffers);
   
protected:
    friend class CanBus; // Give CanBus access to the internals
     
    void begin(byte aSystemId);
    cbError sendMsg(messageId anId, unsigned int aMsgLen, void *msgData);
    void heartBeat();
    void setMsgReceiver(messageId aMsgId, msgReceiver_t aMsgReceiver);
    void prepareForSend();
   
public:
    Mcp2515(int aCsPin);
    Mcp2515(int aCsPin, int aSendWaitTime, int aNrOfSendBuffers);
   
    int getSendWaitTime();
    void setSendWaitTime(int aSendWaitTime);
};
De methods van de CBusInterface zijn protected, zodat alleen de CanBus klasse toegang heeft. De constructors Zijn publiek, zodat deze objecten in de gebruikers schets gemaakt kunnen worden. Daar zijn er twee varianten van, een die een object met default waarden voor de sendbuffer en wacht tijd aanmaakt, en een variant waarin dit expliciet gedefinieerd wordt.
Daarnaast kan ook de wachttijd tussen twee Canbus berichten dynamisch gevarieerd worden, als daar behoefte aan zou zijn.

De klasse die binnen de schets het gebruik van de Canbus ondersteund.
//
//  The CanBus class that provides the sketch all the facilities to send and
//  receive CBus messages for the defined systems and message types.
//
class CanBus {
private:
    byte systemId;
    CBusInterface *sender;
    CBusInterface *receiver;

public:
    CanBus(byte aSystemId, CBusInterface *aSender, CBusInterface *aReceiver);
    void begin();
    void setMsgReceiver(messageId aMsgId, msgReceiver_t aMsgReceiver);
    cbError sendMsg(messageId anId, unsigned int aMsgLen, void *msgData);
    void heartBeat();
};
Dit zijn alle methods die beschikbaar zijn voor de gebruikers schets. De constructor. De method begin() waarmee je het CanBus object verteld dat hij moet starten.
De method setMsgReceiver() geeft het CanBus object een functie die hij zal aanroepen als er een bericht van het gegeven type is ontvangen, sendMsg() geeft het CanBus object een bericht om te versturen en heartBeat() moet continue aangeroepen worden om het CanBus object te laten werken.

Groet Meino

A clean desk is a sign of an empty mind

Kranenberg

Timo

  • Team encyclopedie
  • Offline Offline
  • Berichten: 4539
Re: De CanBus komt naar Kranenberg, Arduino's en de CanBus
« Reactie #59 Gepost op: 19 november 2019, 21:44:00 »
Nu we volgens mij allemaal op dezelfde pagina zitten ("we gaan elkaar niet overtuigen dus pak er een biertje bij" ;D) dus ik nog wel even losjes in te gaan.

In tegendeel. De identatie laat precies zien waar wat bijhoort.
Gemist dat ik de opmaak vernagelt heb? ;) (om helloWorld() te draaien moet x < 5 && y > 6, indentatie suggereert dat alleen x nodig is). Ofwel, precies mijn punt :angel:

Ik gebruik hiervoor: de bracket highlighting [...]

 ;D

Maar goed, zolang je het zelf consequent doet en dus als tool kunt gebruiken (y) Maar ook ik zou me achter de oren krabbel voor ik echt edits aan die code zou maken en dus gegarandeerd de consequentie zou slopen :police:

En absoluut, in C zijn macro's meestal de enige oplossing wat het onmisbaar maakt. Maar in C++ kennen we function overloading of inline functions :)

Ennuh, had startAfter() niet 4 parameters :angel: ;D

Als Arduino IDE alternatief kun je inderdaad sloeber gebruiken. Maar ook de Arduino CLI werkt wel aardig waarvoor mensen ook bijvoorbeeld Notepad++ integratie voor maken.

OpenLCB en LCC, ik heb weer genoeg te lezen ::)

@meino, en top dat je nog lekker bezig bent! (y)


Timo die de LP gaat omkeren en nog even een hoofdstukje analoog gaat lezen...
Verzonden vanaf mijn desktop met Firefox