// Sample myHal.cpp file. // // To use this file, copy it to myHal.cpp and uncomment the directives and/or // edit them to satisfy your requirements. If you only want to use up to // two MCP23017 GPIO Expander modules and/or up to two PCA9685 Servo modules, // then you don't need this file as DCC++EX configures these for free! // Note that if the file has a .cpp extension it WILL be compiled into the build // and the halSetup() function WILL be invoked. // // To prevent this, temporarily rename the file to myHal.txt or similar. // // The #if directive prevent compile errors for Uno and Nano by excluding the // HAL directives from the build. #if !defined(IO_NO_HAL) // Include devices you need. #include "IODevice.h" #include "IO_HCSR04.h" // Ultrasonic range sensor #include "IO_VL53L0X.h" // Laser time-of-flight sensor #include "IO_DFPlayer.h" // MP3 sound player //#include "IO_EXTurntable.h" // Turntable-EX turntable controller //#include "IO_EXFastClock.h" // FastClock driver //========================================================================== // The function halSetup() is invoked from CS if it exists within the build. // The setup calls are included between the open and close braces "{ ... }". // Comments (lines preceded by "//") are optional. //========================================================================== void halSetup() { //======================================================================= // The following directive defines a PCA9685 PWM Servo driver module. //======================================================================= // The parameters are: // First Vpin=100 // Number of VPINs=16 (numbered 100-115) // I2C address of module=0x40 //PCA9685::create(100, 16, 0x40); //======================================================================= // The following directive defines an MCP23017 16-port I2C GPIO Extender module. //======================================================================= // The parameters are: // First Vpin=196 // Number of VPINs=16 (numbered 196-211) // I2C address of module=0x22 //MCP23017::create(196, 16, 0x22); // Alternative form, which allows the INT pin of the module to request a scan // by pulling Arduino pin 40 to ground. Means that the I2C isn't being polled // all the time, only when a change takes place. Multiple modules' INT pins // may be connected to the same Arduino pin. //MCP23017::create(196, 16, 0x22, 40); //======================================================================= // The following directive defines an MCP23008 8-port I2C GPIO Extender module. //======================================================================= // The parameters are: // First Vpin=300 // Number of VPINs=8 (numbered 300-307) // I2C address of module=0x22 //MCP23008::create(300, 8, 0x22); //======================================================================= // The following directive defines a PCF8574 8-port I2C GPIO Extender module. //======================================================================= // The parameters are: // First Vpin=200 // Number of VPINs=8 (numbered 200-207) // I2C address of module=0x23 //PCF8574::create(200, 8, 0x23); // Alternative form using INT pin (see above) //PCF8574::create(200, 8, 0x23, 40); //======================================================================= // The following directive defines an HCSR04 ultrasonic ranging module. //======================================================================= // The parameters are: // Vpin=2000 (only one VPIN per directive) // Number of VPINs=1 // Arduino pin connected to TRIG=30 // Arduino pin connected to ECHO=31 // Minimum trigger range=20cm (VPIN goes to 1 when <20cm) // Maximum trigger range=25cm (VPIN goes to 0 when >25cm) // Note: Multiple devices can be configured by using a different ECHO pin // for each one. The TRIG pin can be shared between multiple devices. // Be aware that the 'ping' of one device may be received by another // device and position them accordingly! //HCSR04::create(2000, 30, 31, 20, 25); //HCSR04::create(2001, 30, 32, 20, 25); //======================================================================= // The following directive defines a single VL53L0X Time-of-Flight range sensor. //======================================================================= // The parameters are: // VPIN=5000 // Number of VPINs=1 // I2C address=0x29 (default for this chip) // Minimum trigger range=200mm (VPIN goes to 1 when <20cm) // Maximum trigger range=250mm (VPIN goes to 0 when >25cm) //VL53L0X::create(5000, 1, 0x29, 200, 250); // For multiple VL53L0X modules, add another parameter which is a VPIN connected to the // module's XSHUT pin. This allows the modules to be configured, at start, // with distinct I2C addresses. In this case, the address 0x29 is only used during // initialisation to configure each device in turn with the desired unique I2C address. // The examples below have the modules' XSHUT pins connected to the first two pins of // the first MCP23017 module (164 and 165), but Arduino pins may be used instead. // The first module here is given I2C address 0x30 and the second is 0x31. //VL53L0X::create(5000, 1, 0x30, 200, 250, 164); //VL53L0X::create(5001, 1, 0x31, 200, 250, 165); //======================================================================= // Play mp3 files from a Micro-SD card, using a DFPlayer MP3 Module. //======================================================================= // Parameters: // 10000 = first VPIN allocated. // 10 = number of VPINs allocated. // Serial1 = name of serial port (usually Serial1 or Serial2). // With these parameters, up to 10 files may be played on pins 10000-10009. // Play is started from EX-RAIL with SET(10000) for first mp3 file, SET(10001) // for second file, etc. Play may also be initiated by writing an analogue // value to the first pin, e.g. SERVO(10000,23,0) will play the 23rd mp3 file. // SERVO(10000,23,30) will do the same thing, as well as setting the volume to // 30 (maximum value). // Play is stopped by RESET(10000) (or any other allocated VPIN). // Volume may also be set by writing an analogue value to the second pin for the player, // e.g. SERVO(10001,30,0) sets volume to maximum (30). // The EX-RAIL script may check for completion of play by calling WAITFOR(pin), which will only proceed to the // following line when the player is no longer busy. // E.g. // SEQUENCE(1) // AT(164) // Wait for sensor attached to pin 164 to activate // SET(10003) // Play fourth MP3 file // LCD(4, "Playing") // Display message on LCD/OLED // WAITFOR(10003) // Wait for playing to finish // LCD(4, " ") // Clear LCD/OLED line // FOLLOW(1) // Go back to start // DFPlayer::create(10000, 10, Serial1); //======================================================================= // The following directive defines an EX-Turntable turntable instance. //======================================================================= // EXTurntable::create(VPIN, Number of VPINs, I2C Address) // // The parameters are: // VPIN=600 // Number of VPINs=1 (Note there is no reason to change this) // I2C address=0x60 // // Note that the I2C address is defined in the EX-Turntable code, and 0x60 is the default. //EXTurntable::create(600, 1, 0x60); //======================================================================= // The following directive defines an EX-IOExpander instance. //======================================================================= // EXIOExpander::create(VPIN, Number of VPINs, I2C Address) // // The parameters are: // VPIN=an available Vpin // Number of VPINs=pin count (must match device in use as per documentation) // I2C address=an available I2C address (default 0x65) // // Note that the I2C address is defined in the EX-IOExpander code, and 0x65 is the default. // The example is for an Arduino Nano. //EXIOExpander::create(800, 18, 0x65); //======================================================================= // The following directive defines a rotary encoder instance. //======================================================================= // The parameters are: // firstVpin = First available Vpin to allocate // numPins= Number of Vpins to allocate, can be either 1 or 2 // i2cAddress = Available I2C address (default 0x70) //RotaryEncoder::create(firstVpin, numPins, i2cAddress); //RotaryEncoder::create(700, 1, 0x70); //RotaryEncoder::create(701, 2, 0x71); //======================================================================= // The following directive defines an EX-FastClock instance. //======================================================================= // EXFastCLock::create(I2C Address) // // The parameters are: // // I2C address=0x55 (decimal 85) // // Note that the I2C address is defined in the EX-FastClock code, and 0x55 is the default. // EXFastClock::create(0x55); } #endif