![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
work in progress
Dependencies: FastAnalogIn FastIO USBDevice mbed FastPWM SimpleDMA
Fork of Pinscape_Controller by
config.h@36:6b981a2afab7, 2015-12-03 (annotated)
- Committer:
- mjr
- Date:
- Thu Dec 03 07:34:57 2015 +0000
- Revision:
- 36:6b981a2afab7
- Parent:
- 35:d832bcab089e
- Child:
- 38:697e10d8fb80
74HC595 output port extensions (for "chime board")
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
mjr | 17:ab3cec0c8bf4 | 1 | // Pinscape Controller Configuration |
mjr | 17:ab3cec0c8bf4 | 2 | // |
mjr | 17:ab3cec0c8bf4 | 3 | // To customize your private configuration, simply open this file in the |
mjr | 17:ab3cec0c8bf4 | 4 | // mbed on-line IDE, make your changes, save the file, and click the Compile |
mjr | 17:ab3cec0c8bf4 | 5 | // button at the top of the window. That will generate a customized .bin |
mjr | 17:ab3cec0c8bf4 | 6 | // file that you can download onto your KL25Z board. |
mjr | 17:ab3cec0c8bf4 | 7 | |
mjr | 25:e22b88bd783a | 8 | #ifndef CONFIG_H |
mjr | 25:e22b88bd783a | 9 | #define CONFIG_H |
mjr | 17:ab3cec0c8bf4 | 10 | |
mjr | 35:d832bcab089e | 11 | // --------------------------------------------------------------------------- |
mjr | 35:d832bcab089e | 12 | // |
mjr | 35:d832bcab089e | 13 | // Expansion Board. If you're using the expansion board, un-comment the |
mjr | 35:d832bcab089e | 14 | // line below. This will select all of the correct defaults for the board. |
mjr | 35:d832bcab089e | 15 | // |
mjr | 35:d832bcab089e | 16 | // The expansion board settings are mostly automatic, so you shouldn't have |
mjr | 35:d832bcab089e | 17 | // to change much else. However, you should still look at and adjust the |
mjr | 35:d832bcab089e | 18 | // following as needed: |
mjr | 35:d832bcab089e | 19 | // - TV power on delay time |
mjr | 35:d832bcab089e | 20 | // - Plunger sensor settings, if you're using a plunger |
mjr | 35:d832bcab089e | 21 | // |
mjr | 35:d832bcab089e | 22 | //#define EXPANSION_BOARD |
mjr | 35:d832bcab089e | 23 | |
mjr | 35:d832bcab089e | 24 | |
mjr | 17:ab3cec0c8bf4 | 25 | // -------------------------------------------------------------------------- |
mjr | 21:5048e16cc9ef | 26 | // |
mjr | 21:5048e16cc9ef | 27 | // Enable/disable joystick functions. |
mjr | 21:5048e16cc9ef | 28 | // |
mjr | 21:5048e16cc9ef | 29 | // This controls whether or not we send joystick reports to the PC with the |
mjr | 21:5048e16cc9ef | 30 | // plunger and accelerometer readings. By default, this is enabled. If |
mjr | 21:5048e16cc9ef | 31 | // you want to use two or more physical KL25Z Pinscape controllers in your |
mjr | 21:5048e16cc9ef | 32 | // system (e.g., if you want to increase the number of output ports |
mjr | 21:5048e16cc9ef | 33 | // available by using two or more KL25Z's), you should disable the joystick |
mjr | 21:5048e16cc9ef | 34 | // features on the second (and third+) controller. It's not useful to have |
mjr | 21:5048e16cc9ef | 35 | // more than one board reporting the accelerometer readings to the host - |
mjr | 21:5048e16cc9ef | 36 | // doing so will just add USB overhead. This setting lets you turn off the |
mjr | 21:5048e16cc9ef | 37 | // reports for the secondary controllers, turning the secondary boards into |
mjr | 21:5048e16cc9ef | 38 | // output-only devices. |
mjr | 21:5048e16cc9ef | 39 | // |
mjr | 21:5048e16cc9ef | 40 | // Note that you can't use button inputs on a controller that has the |
mjr | 21:5048e16cc9ef | 41 | // joystick features disabled, because the buttons are handled via the |
mjr | 21:5048e16cc9ef | 42 | // joystick reports. Wire all of your buttons to the primary KL25Z that |
mjr | 21:5048e16cc9ef | 43 | // has the joystick features enabled. |
mjr | 21:5048e16cc9ef | 44 | // |
mjr | 21:5048e16cc9ef | 45 | // To disable the joystick features, just comment out the next line (add |
mjr | 21:5048e16cc9ef | 46 | // two slashes at the beginning of the line). |
mjr | 21:5048e16cc9ef | 47 | // |
mjr | 21:5048e16cc9ef | 48 | #define ENABLE_JOYSTICK |
mjr | 21:5048e16cc9ef | 49 | |
mjr | 21:5048e16cc9ef | 50 | |
mjr | 35:d832bcab089e | 51 | // --------------------------------------------------------------------------- |
mjr | 35:d832bcab089e | 52 | // |
mjr | 35:d832bcab089e | 53 | // USB device vendor ID and product ID. These values identify the device |
mjr | 35:d832bcab089e | 54 | // to the host software on the PC. By default, we use the same settings as |
mjr | 35:d832bcab089e | 55 | // a real LedWiz so that host software will recognize us as an LedWiz. |
mjr | 35:d832bcab089e | 56 | // |
mjr | 35:d832bcab089e | 57 | // The standard settings *should* work without conflicts, even if you have |
mjr | 35:d832bcab089e | 58 | // a real LedWiz. My reference system is 64-bit Windows 7 with a real LedWiz |
mjr | 35:d832bcab089e | 59 | // on unit #1 and a Pinscape controller on unit #8 (the default), and the |
mjr | 35:d832bcab089e | 60 | // two coexist happily in my system. The LedWiz is designed specifically |
mjr | 35:d832bcab089e | 61 | // to allow multiple units in one system, using the unit number value |
mjr | 35:d832bcab089e | 62 | // (see below) to distinguish multiple units, so there should be no conflict |
mjr | 35:d832bcab089e | 63 | // between Pinscape and any real LedWiz devices you have. |
mjr | 35:d832bcab089e | 64 | // |
mjr | 35:d832bcab089e | 65 | // However, even though conflicts *shouldn't* happen, I've had one report |
mjr | 35:d832bcab089e | 66 | // from a user who experienced a Windows USB driver conflict that they could |
mjr | 35:d832bcab089e | 67 | // only resolve by changing the vendor ID. The real underlying cause is |
mjr | 35:d832bcab089e | 68 | // still a mystery, but whatever was going on, changing the vendor ID fixed |
mjr | 35:d832bcab089e | 69 | // it. If you run into a similar problem, you can try the same fix as a |
mjr | 35:d832bcab089e | 70 | // last resort. Before doing that, though, you should try changing the |
mjr | 35:d832bcab089e | 71 | // Pinscape unit number first - it's possible that your real LedWiz is using |
mjr | 35:d832bcab089e | 72 | // unit #8, which is our default setting. |
mjr | 35:d832bcab089e | 73 | // |
mjr | 35:d832bcab089e | 74 | // If you must change the vendor ID for any reason, you'll sacrifice LedWiz |
mjr | 35:d832bcab089e | 75 | // compatibility, which means that old programs like Future Pinball that use |
mjr | 35:d832bcab089e | 76 | // the LedWiz interface directly won't be able to access the LedWiz output |
mjr | 35:d832bcab089e | 77 | // controller features. However, all is not lost. All of the other functions |
mjr | 35:d832bcab089e | 78 | // (plunger, nudge, and key input) use the joystick interface, which will |
mjr | 35:d832bcab089e | 79 | // work regardless of the ID values. In addition, DOF R3 recognizes the |
mjr | 35:d832bcab089e | 80 | // "emergency fallback" ID below, so if you use that, *all* functions |
mjr | 35:d832bcab089e | 81 | // including the output controller will work in any DOF R3-enabled software, |
mjr | 35:d832bcab089e | 82 | // including Visual Pinball and PinballX. So the only loss will be that |
mjr | 35:d832bcab089e | 83 | // old LedWiz-only software won't be able to control the outputs. |
mjr | 35:d832bcab089e | 84 | // |
mjr | 35:d832bcab089e | 85 | // The "emergency fallback" ID below is officially registerd with |
mjr | 35:d832bcab089e | 86 | // http://pid.codes, a registry for open-source USB projects, which should |
mjr | 35:d832bcab089e | 87 | // all but guarantee that this alternative ID shouldn't conflict with |
mjr | 35:d832bcab089e | 88 | // any other devices in your system. |
mjr | 25:e22b88bd783a | 89 | |
mjr | 25:e22b88bd783a | 90 | |
mjr | 35:d832bcab089e | 91 | // STANDARD ID SETTINGS. These provide full, transparent LedWiz compatibility. |
mjr | 35:d832bcab089e | 92 | const uint16_t USB_VENDOR_ID = 0xFAFA; // LedWiz vendor ID = FAFA |
mjr | 35:d832bcab089e | 93 | const uint16_t USB_PRODUCT_ID = 0x00F0; // LedWiz start of product ID range = 00F0 |
mjr | 35:d832bcab089e | 94 | |
mjr | 35:d832bcab089e | 95 | |
mjr | 35:d832bcab089e | 96 | // EMERGENCY FALLBACK ID SETTINGS. These settings are not LedWiz-compatible, |
mjr | 35:d832bcab089e | 97 | // so older LedWiz-only software won't be able to access the output controller |
mjr | 35:d832bcab089e | 98 | // features. However, DOF R3 recognizes these IDs, so DOF-aware software (Visual |
mjr | 35:d832bcab089e | 99 | // Pinball, PinballX) will have full access to all features. |
mjr | 35:d832bcab089e | 100 | // |
mjr | 35:d832bcab089e | 101 | //const uint16_t USB_VENDOR_ID = 0x1209; // DOF R3-compatible vendor ID = 1209 |
mjr | 35:d832bcab089e | 102 | //const uint16_t USB_PRODUCT_ID = 0xEAEA; // DOF R3-compatible product ID = EAEA |
mjr | 35:d832bcab089e | 103 | |
mjr | 35:d832bcab089e | 104 | |
mjr | 35:d832bcab089e | 105 | // --------------------------------------------------------------------------- |
mjr | 35:d832bcab089e | 106 | // |
mjr | 35:d832bcab089e | 107 | // LedWiz unit number. |
mjr | 17:ab3cec0c8bf4 | 108 | // |
mjr | 21:5048e16cc9ef | 109 | // Each LedWiz device has a unit number, from 1 to 16. This lets you install |
mjr | 17:ab3cec0c8bf4 | 110 | // more than one LedWiz in your system: as long as each one has a different |
mjr | 17:ab3cec0c8bf4 | 111 | // unit number, the software on the PC can tell them apart and route commands |
mjr | 17:ab3cec0c8bf4 | 112 | // to the right device. |
mjr | 17:ab3cec0c8bf4 | 113 | // |
mjr | 35:d832bcab089e | 114 | // A real LedWiz has its unit number set at the factory. If you don't tell |
mjr | 35:d832bcab089e | 115 | // them otherwise when placing your order, they will set it to unit #1. Most |
mjr | 35:d832bcab089e | 116 | // real LedWiz units therefore are set to unit #1. There's no provision on |
mjr | 35:d832bcab089e | 117 | // a real LedWiz for users to change the unit number after it leaves the |
mjr | 35:d832bcab089e | 118 | // factory. |
mjr | 21:5048e16cc9ef | 119 | // |
mjr | 35:d832bcab089e | 120 | // For our *emulated* LedWiz, we default to unit #8 if we're the primary |
mjr | 35:d832bcab089e | 121 | // Pinscape controller in the system, or unit #9 if we're set up as the |
mjr | 35:d832bcab089e | 122 | // secondary controller with the joystick functions turned off. |
mjr | 17:ab3cec0c8bf4 | 123 | // |
mjr | 21:5048e16cc9ef | 124 | // The reason we start at unit #8 is that we want to avoid conflicting with |
mjr | 35:d832bcab089e | 125 | // any real LedWiz devices in your system. Most real LedWiz devices are |
mjr | 35:d832bcab089e | 126 | // set up as unit #1, and in the rare cases where people have two of them, |
mjr | 35:d832bcab089e | 127 | // the second one is usually unit #2. |
mjr | 17:ab3cec0c8bf4 | 128 | // |
mjr | 21:5048e16cc9ef | 129 | // Note 1: the unit number here is the *user visible* unit number that |
mjr | 21:5048e16cc9ef | 130 | // you use on the PC side. It's the number you specify in your DOF |
mjr | 21:5048e16cc9ef | 131 | // configuration and so forth. Internally, the USB reports subtract |
mjr | 21:5048e16cc9ef | 132 | // one from this number - e.g., nominal unit #1 shows up as 0 in the USB |
mjr | 21:5048e16cc9ef | 133 | // reports. If you're trying to puzzle out why all of the USB reports |
mjr | 21:5048e16cc9ef | 134 | // are all off by one from the unit number you select here, that's why. |
mjr | 17:ab3cec0c8bf4 | 135 | // |
mjr | 17:ab3cec0c8bf4 | 136 | // Note 2: the DOF Configtool (google it) knows about the Pinscape |
mjr | 31:582472d0bc57 | 137 | // controller. There it's referred to as simply "KL25Z" rather than |
mjr | 31:582472d0bc57 | 138 | // Pinscape Controller, but that's what they're talking about. The DOF |
mjr | 31:582472d0bc57 | 139 | // tool knows that it uses #8 as its default unit number, so it names the |
mjr | 31:582472d0bc57 | 140 | // .ini file for this controller xxx8.ini. If you change the unit number |
mjr | 31:582472d0bc57 | 141 | // here, remember to rename the DOF-generated .ini file to match, by |
mjr | 31:582472d0bc57 | 142 | // changing the "8" at the end of the filename to the new number you set |
mjr | 31:582472d0bc57 | 143 | // here. |
mjr | 21:5048e16cc9ef | 144 | const uint8_t DEFAULT_LEDWIZ_UNIT_NUMBER = |
mjr | 21:5048e16cc9ef | 145 | #ifdef ENABLE_JOYSTICK |
mjr | 32:6e9902f06f48 | 146 | 0x08; // joystick enabled - assume we're the primary KL25Z, so use unit #8 |
mjr | 21:5048e16cc9ef | 147 | #else |
mjr | 21:5048e16cc9ef | 148 | 0x09; // joystick disabled - assume we're a secondary, output-only KL25Z, so use #9 |
mjr | 21:5048e16cc9ef | 149 | #endif |
mjr | 17:ab3cec0c8bf4 | 150 | |
mjr | 35:d832bcab089e | 151 | |
mjr | 35:d832bcab089e | 152 | // -------------------------------------------------------------------------- |
mjr | 35:d832bcab089e | 153 | // |
mjr | 35:d832bcab089e | 154 | // Accelerometer orientation. The accelerometer feature lets Visual Pinball |
mjr | 35:d832bcab089e | 155 | // (and other pinball software) sense nudges to the cabinet, and simulate |
mjr | 35:d832bcab089e | 156 | // the effect on the ball's trajectory during play. We report the direction |
mjr | 35:d832bcab089e | 157 | // of the accelerometer readings as well as the strength, so it's important |
mjr | 35:d832bcab089e | 158 | // for VP and the KL25Z to agree on the physical orientation of the |
mjr | 35:d832bcab089e | 159 | // accelerometer relative to the cabinet. The accelerometer on the KL25Z |
mjr | 35:d832bcab089e | 160 | // is always mounted the same way on the board, but we still have to know |
mjr | 35:d832bcab089e | 161 | // which way you mount the board in your cabinet. We assume as default |
mjr | 35:d832bcab089e | 162 | // orientation where the KL25Z is mounted flat on the bottom of your |
mjr | 35:d832bcab089e | 163 | // cabinet with the USB ports pointing forward, toward the coin door. If |
mjr | 35:d832bcab089e | 164 | // it's more convenient for you to mount the board in a different direction, |
mjr | 35:d832bcab089e | 165 | // you simply need to select the matching direction here. Comment out the |
mjr | 35:d832bcab089e | 166 | // ORIENTATION_PORTS_AT_FRONT line and un-comment the line that matches |
mjr | 35:d832bcab089e | 167 | // your board's orientation. |
mjr | 35:d832bcab089e | 168 | |
mjr | 35:d832bcab089e | 169 | #define ORIENTATION_PORTS_AT_FRONT // USB ports pointing toward front of cabinet |
mjr | 35:d832bcab089e | 170 | // #define ORIENTATION_PORTS_AT_LEFT // USB ports pointing toward left side of cab |
mjr | 35:d832bcab089e | 171 | // #define ORIENTATION_PORTS_AT_RIGHT // USB ports pointing toward right side of cab |
mjr | 35:d832bcab089e | 172 | // #define ORIENTATION_PORTS_AT_REAR // USB ports pointing toward back of cabinet |
mjr | 35:d832bcab089e | 173 | |
mjr | 35:d832bcab089e | 174 | |
mjr | 35:d832bcab089e | 175 | |
mjr | 17:ab3cec0c8bf4 | 176 | // -------------------------------------------------------------------------- |
mjr | 17:ab3cec0c8bf4 | 177 | // |
mjr | 17:ab3cec0c8bf4 | 178 | // Plunger CCD sensor. |
mjr | 17:ab3cec0c8bf4 | 179 | // |
mjr | 17:ab3cec0c8bf4 | 180 | // If you're NOT using the CCD sensor, comment out the next line (by adding |
mjr | 17:ab3cec0c8bf4 | 181 | // two slashes at the start of the line). |
mjr | 17:ab3cec0c8bf4 | 182 | |
mjr | 24:e902bc7cdc1e | 183 | #define ENABLE_CCD_SENSOR |
mjr | 17:ab3cec0c8bf4 | 184 | |
mjr | 25:e22b88bd783a | 185 | // Physical pixel count for your sensor. This software has been tested with |
mjr | 25:e22b88bd783a | 186 | // TAOS TSL1410R (1280 pixels) and TSL1412R (1536 pixels) sensors. It might |
mjr | 25:e22b88bd783a | 187 | // work with other similar sensors as well, but you'll probably have to make |
mjr | 25:e22b88bd783a | 188 | // some changes to the software interface to the sensor if you're using any |
mjr | 25:e22b88bd783a | 189 | // sensor outside of the TAOS TSL14xxR series. |
mjr | 25:e22b88bd783a | 190 | // |
mjr | 25:e22b88bd783a | 191 | // If you're not using a CCD sensor, you can ignore this. |
mjr | 25:e22b88bd783a | 192 | const int CCD_NPIXELS = 1280; |
mjr | 25:e22b88bd783a | 193 | |
mjr | 25:e22b88bd783a | 194 | // Number of pixels from the CCD to sample on each high-res scan. We don't |
mjr | 25:e22b88bd783a | 195 | // sample every pixel from the sensor on each scan, because (a) we don't |
mjr | 25:e22b88bd783a | 196 | // have to, and (b) we don't want to. We don't have to sample all of the |
mjr | 25:e22b88bd783a | 197 | // pixels because these sensors have much finer resolution than we need to |
mjr | 25:e22b88bd783a | 198 | // get good results. On a typical pinball cabinet setup with a 1920x1080 |
mjr | 25:e22b88bd783a | 199 | // HD TV display, the on-screen plunger travel distance is about 165 pixels, |
mjr | 25:e22b88bd783a | 200 | // so that's all the pixels we need to sample for pixel-accurate animation. |
mjr | 25:e22b88bd783a | 201 | // Even so, we still *could* sample at higher resolution, but we don't *want* |
mjr | 25:e22b88bd783a | 202 | // to sample more pixels than we have to, because reading each pixel takes |
mjr | 25:e22b88bd783a | 203 | // time. The limiting factor for read speed is the sampling time for the ADC |
mjr | 25:e22b88bd783a | 204 | // (analog to digital converter); it needs about 20us per sample to get an |
mjr | 25:e22b88bd783a | 205 | // accurate voltage reading. We want to animate the on-screen plunger in |
mjr | 25:e22b88bd783a | 206 | // real time, with minimal lag, so it's important that we complete each scan |
mjr | 25:e22b88bd783a | 207 | // as quickly as possible. The fewer pixels we sample, the faster we |
mjr | 25:e22b88bd783a | 208 | // complete each scan. |
mjr | 25:e22b88bd783a | 209 | // |
mjr | 25:e22b88bd783a | 210 | // Happily, the time needed to read the approximately 165 pixels required |
mjr | 25:e22b88bd783a | 211 | // for pixel-accurate positioning on the display is short enough that we can |
mjr | 35:d832bcab089e | 212 | // complete a scan within the cycle time for USB reports. Visual Pinball |
mjr | 35:d832bcab089e | 213 | // only polls for input at about 10ms intervals, so there's no benefit |
mjr | 35:d832bcab089e | 214 | // to going much faster than this. The sensor timing is such that we can |
mjr | 35:d832bcab089e | 215 | // read about 165 pixels in well under 10ms. So that's really the sweet |
mjr | 35:d832bcab089e | 216 | // spot for our scans. |
mjr | 25:e22b88bd783a | 217 | // |
mjr | 25:e22b88bd783a | 218 | // Note that we distribute the sampled pixels evenly across the full range |
mjr | 25:e22b88bd783a | 219 | // of the sensor's pixels. That is, we read every nth pixel, and skip the |
mjr | 25:e22b88bd783a | 220 | // ones in between. That means that the sample count here has to be an even |
mjr | 25:e22b88bd783a | 221 | // divisor of the physical pixel count. Empirically, reading every 8th |
mjr | 25:e22b88bd783a | 222 | // pixel gives us good results on both the TSL1410R and TSL1412R, so you |
mjr | 25:e22b88bd783a | 223 | // shouldn't need to change this if you're using one of those sensors. If |
mjr | 25:e22b88bd783a | 224 | // you're using a different sensor, you should be sure to adjust this so that |
mjr | 25:e22b88bd783a | 225 | // it works out to an integer result with no remainder. |
mjr | 25:e22b88bd783a | 226 | // |
mjr | 25:e22b88bd783a | 227 | const int CCD_NPIXELS_SAMPLED = CCD_NPIXELS / 8; |
mjr | 25:e22b88bd783a | 228 | |
mjr | 17:ab3cec0c8bf4 | 229 | // The KL25Z pins that the CCD sensor is physically attached to: |
mjr | 17:ab3cec0c8bf4 | 230 | // |
mjr | 17:ab3cec0c8bf4 | 231 | // CCD_SI_PIN = the SI (sensor data input) pin |
mjr | 17:ab3cec0c8bf4 | 232 | // CCD_CLOCK_PIN = the sensor clock pin |
mjr | 17:ab3cec0c8bf4 | 233 | // CCD_SO_PIN = the SO (sensor data output) pin |
mjr | 17:ab3cec0c8bf4 | 234 | // |
mjr | 17:ab3cec0c8bf4 | 235 | // The SI an Clock pins are DigitalOut pins, so these can be set to just |
mjr | 17:ab3cec0c8bf4 | 236 | // about any gpio pins that aren't used for something else. The SO pin must |
mjr | 17:ab3cec0c8bf4 | 237 | // be an AnalogIn capable pin - only a few of the KL25Z gpio pins qualify, |
mjr | 17:ab3cec0c8bf4 | 238 | // so check the pinout diagram to find suitable candidates if you need to |
mjr | 17:ab3cec0c8bf4 | 239 | // change this. Note that some of the gpio pins shown in the mbed pinout |
mjr | 17:ab3cec0c8bf4 | 240 | // diagrams are committed to other uses by the mbed software or by the KL25Z |
mjr | 17:ab3cec0c8bf4 | 241 | // wiring itself, so if you do change these, be sure that the new pins you |
mjr | 17:ab3cec0c8bf4 | 242 | // select are really available. |
mjr | 17:ab3cec0c8bf4 | 243 | |
mjr | 17:ab3cec0c8bf4 | 244 | const PinName CCD_SI_PIN = PTE20; |
mjr | 17:ab3cec0c8bf4 | 245 | const PinName CCD_CLOCK_PIN = PTE21; |
mjr | 17:ab3cec0c8bf4 | 246 | const PinName CCD_SO_PIN = PTB0; |
mjr | 17:ab3cec0c8bf4 | 247 | |
mjr | 17:ab3cec0c8bf4 | 248 | // -------------------------------------------------------------------------- |
mjr | 17:ab3cec0c8bf4 | 249 | // |
mjr | 17:ab3cec0c8bf4 | 250 | // Plunger potentiometer sensor. |
mjr | 17:ab3cec0c8bf4 | 251 | // |
mjr | 23:14f8c5004cd0 | 252 | // If you're using a potentiometer as the plunger sensor, un-comment the |
mjr | 23:14f8c5004cd0 | 253 | // next line (by removing the two slashes at the start of the line), and |
mjr | 23:14f8c5004cd0 | 254 | // also comment out the ENABLE_CCD_SENSOR line above. |
mjr | 17:ab3cec0c8bf4 | 255 | |
mjr | 24:e902bc7cdc1e | 256 | //#define ENABLE_POT_SENSOR |
mjr | 17:ab3cec0c8bf4 | 257 | |
mjr | 23:14f8c5004cd0 | 258 | // The KL25Z pin that your potentiometer is attached to. The potentiometer |
mjr | 23:14f8c5004cd0 | 259 | // requires wiring three connectins: |
mjr | 23:14f8c5004cd0 | 260 | // |
mjr | 23:14f8c5004cd0 | 261 | // - Wire the fixed resistance end of the potentiometer nearest the KNOB |
mjr | 23:14f8c5004cd0 | 262 | // end of the plunger to the 3.3V output from the KL25Z |
mjr | 23:14f8c5004cd0 | 263 | // |
mjr | 23:14f8c5004cd0 | 264 | // - Wire the other fixed resistance end to KL25Z Ground |
mjr | 23:14f8c5004cd0 | 265 | // |
mjr | 23:14f8c5004cd0 | 266 | // - Wire the potentiometer wiper (the variable output terminal) to the |
mjr | 23:14f8c5004cd0 | 267 | // KL25Z pin identified below. |
mjr | 23:14f8c5004cd0 | 268 | // |
mjr | 23:14f8c5004cd0 | 269 | // Note that you can change the pin selection below, but if you do, the new |
mjr | 23:14f8c5004cd0 | 270 | // pin must be AnalogIn capable. Only a few of the KL25Z pins qualify. Refer |
mjr | 23:14f8c5004cd0 | 271 | // to the KL25Z pinout diagram to find another AnalogIn pin if you need to |
mjr | 23:14f8c5004cd0 | 272 | // change this for any reason. Note that the default is to use the same analog |
mjr | 23:14f8c5004cd0 | 273 | // input that the CCD sensor would use if it were enabled, which is why you |
mjr | 23:14f8c5004cd0 | 274 | // have to be sure to disable the CCD support in the software if you're using |
mjr | 23:14f8c5004cd0 | 275 | // a potentiometer as the sensor. |
mjr | 17:ab3cec0c8bf4 | 276 | |
mjr | 17:ab3cec0c8bf4 | 277 | const PinName POT_PIN = PTB0; |
mjr | 17:ab3cec0c8bf4 | 278 | |
mjr | 17:ab3cec0c8bf4 | 279 | // -------------------------------------------------------------------------- |
mjr | 17:ab3cec0c8bf4 | 280 | // |
mjr | 17:ab3cec0c8bf4 | 281 | // Plunger calibration button and indicator light. |
mjr | 17:ab3cec0c8bf4 | 282 | // |
mjr | 17:ab3cec0c8bf4 | 283 | // These specify the pin names of the plunger calibration button connections. |
mjr | 17:ab3cec0c8bf4 | 284 | // If you're not using these, you can set these to NC. (You can even use the |
mjr | 17:ab3cec0c8bf4 | 285 | // button but not the LED; set the LED to NC if you're only using the button.) |
mjr | 17:ab3cec0c8bf4 | 286 | // |
mjr | 17:ab3cec0c8bf4 | 287 | // If you're using the button, wire one terminal of a momentary switch or |
mjr | 17:ab3cec0c8bf4 | 288 | // pushbutton to the input pin you select, and wire the other terminal to the |
mjr | 17:ab3cec0c8bf4 | 289 | // KL25Z ground. Push and hold the button for a few seconds to enter plunger |
mjr | 17:ab3cec0c8bf4 | 290 | // calibration mode. |
mjr | 17:ab3cec0c8bf4 | 291 | // |
mjr | 17:ab3cec0c8bf4 | 292 | // If you're using the LED, you'll need to build a little transistor power |
mjr | 17:ab3cec0c8bf4 | 293 | // booster circuit to power the LED, as described in the build guide. The |
mjr | 17:ab3cec0c8bf4 | 294 | // LED gives you visual confirmation that the you've triggered calibration |
mjr | 17:ab3cec0c8bf4 | 295 | // mode and lets you know when the mode times out. Note that the LED on |
mjr | 17:ab3cec0c8bf4 | 296 | // board the KL25Z also changes color to indicate the same information, so |
mjr | 17:ab3cec0c8bf4 | 297 | // if the KL25Z is positioned so that you can see it while you're doing the |
mjr | 17:ab3cec0c8bf4 | 298 | // calibration, you don't really need a separate button LED. But the |
mjr | 17:ab3cec0c8bf4 | 299 | // separate LED is spiffy, especially if it's embedded in the pushbutton. |
mjr | 17:ab3cec0c8bf4 | 300 | // |
mjr | 17:ab3cec0c8bf4 | 301 | // Note that you can skip the pushbutton altogether and trigger calibration |
mjr | 17:ab3cec0c8bf4 | 302 | // from the Windows control software. But again, the button is spiffier. |
mjr | 17:ab3cec0c8bf4 | 303 | |
mjr | 17:ab3cec0c8bf4 | 304 | // calibration button input |
mjr | 17:ab3cec0c8bf4 | 305 | const PinName CAL_BUTTON_PIN = PTE29; |
mjr | 17:ab3cec0c8bf4 | 306 | |
mjr | 17:ab3cec0c8bf4 | 307 | // calibration button indicator LED |
mjr | 17:ab3cec0c8bf4 | 308 | const PinName CAL_BUTTON_LED = PTE23; |
mjr | 17:ab3cec0c8bf4 | 309 | |
mjr | 17:ab3cec0c8bf4 | 310 | |
mjr | 35:d832bcab089e | 311 | // --------------------------------------------------------------------------- |
mjr | 35:d832bcab089e | 312 | // |
mjr | 35:d832bcab089e | 313 | // TV Power-On Timer. This section lets you set up a delayed relay timer |
mjr | 35:d832bcab089e | 314 | // for turning on your TV monitor(s) shortly after you turn on power to the |
mjr | 35:d832bcab089e | 315 | // system. This requires some external circuitry, which is built in to the |
mjr | 35:d832bcab089e | 316 | // expansion board, or which you can build yourself - refer to the Build |
mjr | 35:d832bcab089e | 317 | // Guide for the circuit plan. |
mjr | 35:d832bcab089e | 318 | // |
mjr | 35:d832bcab089e | 319 | // If you're using this feature, un-comment the next line, and make any |
mjr | 35:d832bcab089e | 320 | // changes to the port assignments below. The default port assignments are |
mjr | 35:d832bcab089e | 321 | // suitable for the expansion board. Note that the TV timer is enabled |
mjr | 35:d832bcab089e | 322 | // automatically if you're using the expansion board, since it's built in. |
mjr | 35:d832bcab089e | 323 | //#define ENABLE_TV_TIMER |
mjr | 35:d832bcab089e | 324 | |
mjr | 35:d832bcab089e | 325 | #if defined(ENABLE_TV_TIMER) || defined(EXPANSION_BOARD) |
mjr | 35:d832bcab089e | 326 | # define PSU2_STATUS_SENSE PTD2 // Digital In pin to read latch status |
mjr | 35:d832bcab089e | 327 | # define PSU2_STATUS_SET PTE0 // Digital Out pin to set latch |
mjr | 35:d832bcab089e | 328 | # define TV_RELAY_PIN PTD3 // Digital Out pin to control TV switch relay |
mjr | 35:d832bcab089e | 329 | |
mjr | 35:d832bcab089e | 330 | // Amount of time (in seconds) to wait after system power-up before |
mjr | 35:d832bcab089e | 331 | // pulsing the TV ON switch relay. Adjust as needed for your TV(s). |
mjr | 35:d832bcab089e | 332 | // Most monitors won't respond to any buttons for the first few seconds |
mjr | 35:d832bcab089e | 333 | // after they're plugged in, so we need to wait long enough to make sure |
mjr | 35:d832bcab089e | 334 | // the TVs are ready to receive input before pressing the button. |
mjr | 35:d832bcab089e | 335 | #define TV_DELAY_TIME 7.0 |
mjr | 35:d832bcab089e | 336 | |
mjr | 35:d832bcab089e | 337 | #endif |
mjr | 35:d832bcab089e | 338 | |
mjr | 35:d832bcab089e | 339 | |
mjr | 17:ab3cec0c8bf4 | 340 | // -------------------------------------------------------------------------- |
mjr | 17:ab3cec0c8bf4 | 341 | // |
mjr | 17:ab3cec0c8bf4 | 342 | // Pseudo "Launch Ball" button. |
mjr | 17:ab3cec0c8bf4 | 343 | // |
mjr | 17:ab3cec0c8bf4 | 344 | // Zeb of zebsboards.com came up with a clever scheme for his plunger kit |
mjr | 17:ab3cec0c8bf4 | 345 | // that lets the plunger simulate a Launch Ball button for tables where |
mjr | 17:ab3cec0c8bf4 | 346 | // the original used a Launch button instead of a plunger (e.g., Medieval |
mjr | 17:ab3cec0c8bf4 | 347 | // Madness, T2, or Star Trek: The Next Generation). The scheme uses an |
mjr | 17:ab3cec0c8bf4 | 348 | // LedWiz output to tell us when such a table is loaded. On the DOF |
mjr | 17:ab3cec0c8bf4 | 349 | // Configtool site, this is called "ZB Launch Ball". When this LedWiz |
mjr | 17:ab3cec0c8bf4 | 350 | // output is ON, it tells us that the table will ignore the analog plunger |
mjr | 17:ab3cec0c8bf4 | 351 | // because it doesn't have a plunger object, so the analog plunger should |
mjr | 17:ab3cec0c8bf4 | 352 | // send a Launch Ball button press signal when the user releases the plunger. |
mjr | 17:ab3cec0c8bf4 | 353 | // |
mjr | 17:ab3cec0c8bf4 | 354 | // If you wish to use this feature, you need to do two things: |
mjr | 17:ab3cec0c8bf4 | 355 | // |
mjr | 17:ab3cec0c8bf4 | 356 | // First, adjust the two lines below to set the LedWiz output and joystick |
mjr | 17:ab3cec0c8bf4 | 357 | // button you wish to use for this feature. The defaults below should be |
mjr | 17:ab3cec0c8bf4 | 358 | // fine for most people, but if you're using the Pinscape controller for |
mjr | 17:ab3cec0c8bf4 | 359 | // your physical button wiring, you should set the launch button to match |
mjr | 17:ab3cec0c8bf4 | 360 | // where you physically wired your actual Launch Ball button. Likewise, |
mjr | 17:ab3cec0c8bf4 | 361 | // change the LedWiz port if you're using the one below for some actual |
mjr | 17:ab3cec0c8bf4 | 362 | // hardware output. This is a virtual port that won't control any hardware; |
mjr | 17:ab3cec0c8bf4 | 363 | // it's just for signaling the plunger that we're in "button mode". Note |
mjr | 17:ab3cec0c8bf4 | 364 | // that the numbering for the both the LedWiz port and joystick button |
mjr | 17:ab3cec0c8bf4 | 365 | // start at 1 to match the DOF Configtool and VP dialog numbering. |
mjr | 17:ab3cec0c8bf4 | 366 | // |
mjr | 17:ab3cec0c8bf4 | 367 | // Second, in the DOF Configtool, make sure you have a Pinscape controller |
mjr | 17:ab3cec0c8bf4 | 368 | // in your cabinet configuration, then go to your Port Assignments and set |
mjr | 17:ab3cec0c8bf4 | 369 | // the port defined below to "ZB Launch Ball". |
mjr | 17:ab3cec0c8bf4 | 370 | // |
mjr | 17:ab3cec0c8bf4 | 371 | // Third, open the Visual Pinball editor, open the Preferences | Keys |
mjr | 17:ab3cec0c8bf4 | 372 | // dialog, and find the Plunger item. Open the drop-down list under that |
mjr | 17:ab3cec0c8bf4 | 373 | // item and select the button number defined below. |
mjr | 17:ab3cec0c8bf4 | 374 | // |
mjr | 21:5048e16cc9ef | 375 | // To disable this feature, just set ZBLaunchBallPort to 0 here. |
mjr | 17:ab3cec0c8bf4 | 376 | |
mjr | 17:ab3cec0c8bf4 | 377 | const int ZBLaunchBallPort = 32; |
mjr | 17:ab3cec0c8bf4 | 378 | const int LaunchBallButton = 24; |
mjr | 17:ab3cec0c8bf4 | 379 | |
mjr | 18:5e890ebd0023 | 380 | // Distance necessary to push the plunger to activate the simulated |
mjr | 18:5e890ebd0023 | 381 | // launch ball button, in inches. A standard pinball plunger can be |
mjr | 18:5e890ebd0023 | 382 | // pushed forward about 1/2". However, the barrel spring is very |
mjr | 18:5e890ebd0023 | 383 | // stiff, and anything more than about 1/8" requires quite a bit |
mjr | 18:5e890ebd0023 | 384 | // of force. Ideally the force required should be about the same as |
mjr | 18:5e890ebd0023 | 385 | // for any ordinary pushbutton. |
mjr | 18:5e890ebd0023 | 386 | // |
mjr | 18:5e890ebd0023 | 387 | // On my cabinet, empirically, a distance around 2mm (.08") seems |
mjr | 18:5e890ebd0023 | 388 | // to work pretty well. It's far enough that it doesn't trigger |
mjr | 18:5e890ebd0023 | 389 | // spuriously, but short enough that it responds to a reasonably |
mjr | 18:5e890ebd0023 | 390 | // light push. |
mjr | 18:5e890ebd0023 | 391 | // |
mjr | 18:5e890ebd0023 | 392 | // You might need to adjust this up or down to get the right feel. |
mjr | 18:5e890ebd0023 | 393 | // Alternatively, if you don't like the "push" gesture at all and |
mjr | 18:5e890ebd0023 | 394 | // would prefer to only make the plunger respond to a pull-and-release |
mjr | 18:5e890ebd0023 | 395 | // motion, simply set this to, say, 2.0 - it's impossible to push a |
mjr | 18:5e890ebd0023 | 396 | // plunger forward that far, so that will effectively turn off the |
mjr | 18:5e890ebd0023 | 397 | // push mode. |
mjr | 18:5e890ebd0023 | 398 | const float LaunchBallPushDistance = .08; |
mjr | 18:5e890ebd0023 | 399 | |
mjr | 31:582472d0bc57 | 400 | |
mjr | 31:582472d0bc57 | 401 | // -------------------------------------------------------------------------- |
mjr | 31:582472d0bc57 | 402 | // |
mjr | 31:582472d0bc57 | 403 | // TLC5940 PWM controller chip setup - Enhanced LedWiz emulation |
mjr | 31:582472d0bc57 | 404 | // |
mjr | 31:582472d0bc57 | 405 | // By default, the Pinscape Controller software can provide limited LedWiz |
mjr | 31:582472d0bc57 | 406 | // emulation through the KL25Z's on-board GPIO ports. This lets you hook |
mjr | 31:582472d0bc57 | 407 | // up external devices, such as LED flashers or solenoids, to the KL25Z |
mjr | 31:582472d0bc57 | 408 | // outputs (using external circuitry to boost power - KL25Z GPIO ports |
mjr | 31:582472d0bc57 | 409 | // are limited to a meager 4mA per port). This capability is limited by |
mjr | 31:582472d0bc57 | 410 | // the number of available GPIO ports on the KL25Z, and even smaller limit |
mjr | 31:582472d0bc57 | 411 | // of 10 PWM-capable GPIO ports. |
mjr | 31:582472d0bc57 | 412 | // |
mjr | 31:582472d0bc57 | 413 | // As an alternative, the controller software lets you use external PWM |
mjr | 31:582472d0bc57 | 414 | // controller chips to control essentially unlimited channels with full |
mjr | 31:582472d0bc57 | 415 | // PWM control on all channels. This requires building external circuitry |
mjr | 31:582472d0bc57 | 416 | // using TLC5940 chips. Each TLC5940 chip provides 16 full PWM channels, |
mjr | 31:582472d0bc57 | 417 | // and you can daisy-chain multiple TLC5940 chips together to set up 32, |
mjr | 31:582472d0bc57 | 418 | // 48, 64, or more channels. |
mjr | 31:582472d0bc57 | 419 | // |
mjr | 31:582472d0bc57 | 420 | // If you do add TLC5940 circuits to your controller hardware, use this |
mjr | 31:582472d0bc57 | 421 | // section to configure the connection to the KL25Z. |
mjr | 31:582472d0bc57 | 422 | // |
mjr | 35:d832bcab089e | 423 | // Note that when using the TLC5940, you can still also use some GPIO |
mjr | 35:d832bcab089e | 424 | // pins for outputs as normal. See ledWizPinMap[] for |
mjr | 31:582472d0bc57 | 425 | |
mjr | 31:582472d0bc57 | 426 | // Number of TLC5940 chips you're using. For a full LedWiz-compatible |
mjr | 35:d832bcab089e | 427 | // setup, you need two of these chips, for 32 outputs. The software |
mjr | 36:6b981a2afab7 | 428 | // will handle up to 8. |
mjr | 36:6b981a2afab7 | 429 | // If you're using the expansion board, the main KL25Z interface board |
mjr | 36:6b981a2afab7 | 430 | // has 2 chips and the MOSFET board has 2 more, for a total of 4. If |
mjr | 36:6b981a2afab7 | 431 | // you add extra daisy-chained MOSFET boards, add 2 more per board. |
mjr | 35:d832bcab089e | 432 | #ifdef EXPANSION_BOARD |
mjr | 35:d832bcab089e | 433 | # define TLC5940_NCHIPS 4 |
mjr | 35:d832bcab089e | 434 | #else |
mjr | 35:d832bcab089e | 435 | # define TLC5940_NCHIPS 0 // change this if you're using TLC5940's without the expansion board |
mjr | 35:d832bcab089e | 436 | #endif |
mjr | 31:582472d0bc57 | 437 | |
mjr | 31:582472d0bc57 | 438 | // If you're using TLC5940s, change any of these as needed to match the |
mjr | 31:582472d0bc57 | 439 | // GPIO pins that you connected to the TLC5940 control pins. Note that |
mjr | 31:582472d0bc57 | 440 | // SIN and SCLK *must* be connected to the KL25Z SPI0 MOSI and SCLK |
mjr | 31:582472d0bc57 | 441 | // outputs, respectively, which effectively limits them to the default |
mjr | 35:d832bcab089e | 442 | // selections, and that the GSCLK pin must be PWM-capable. These defaults |
mjr | 35:d832bcab089e | 443 | // all match the expansion board wiring. |
mjr | 36:6b981a2afab7 | 444 | #define TLC5940_SIN PTC6 // Serial data - Must connect to SPI0 MOSI -> PTC6 or PTD2 |
mjr | 36:6b981a2afab7 | 445 | #define TLC5940_SCLK PTC5 // Serial clock - Must connect to SPI0 SCLK -> PTC5 or PTD1, |
mjr | 36:6b981a2afab7 | 446 | // but don't use PTD1 because it's hard-wired to the on-board |
mjr | 36:6b981a2afab7 | 447 | // blue LED |
mjr | 36:6b981a2afab7 | 448 | #define TLC5940_XLAT PTC10 // XLAT (latch) signal - Any GPIO pin can be used |
mjr | 36:6b981a2afab7 | 449 | #define TLC5940_BLANK PTC7 // BLANK signal - Any GPIO pin can be used |
mjr | 36:6b981a2afab7 | 450 | #define TLC5940_GSCLK PTA1 // Grayscale clock - Must be a PWM-capable pin |
mjr | 36:6b981a2afab7 | 451 | |
mjr | 25:e22b88bd783a | 452 | |
mjr | 36:6b981a2afab7 | 453 | // -------------------------------------------------------------------------- |
mjr | 36:6b981a2afab7 | 454 | // |
mjr | 36:6b981a2afab7 | 455 | // 74HC595 digital output setup - "Chime Board" module |
mjr | 36:6b981a2afab7 | 456 | // |
mjr | 36:6b981a2afab7 | 457 | // The 74HC595 is an 8-output serial-to-parallel shift register IC. This lets |
mjr | 36:6b981a2afab7 | 458 | // us add extra digital outputs (on/off only, not PWM), 8 at a time, similar |
mjr | 36:6b981a2afab7 | 459 | // to the way the TLC5940 lets us add extra PWM outputs. The 74HC595 requires |
mjr | 36:6b981a2afab7 | 460 | // four control signals, so one chip gives us 8 outputs using only 4 GPIOs. |
mjr | 36:6b981a2afab7 | 461 | // The chips can be daisy-chained, so by adding multiple chips, we can add |
mjr | 36:6b981a2afab7 | 462 | // any number of new outputs, still using only 4 GPIO pins for the whole chain. |
mjr | 36:6b981a2afab7 | 463 | // |
mjr | 36:6b981a2afab7 | 464 | // The TLC5940 is more useful for general-purpose outputs because of its PWM |
mjr | 36:6b981a2afab7 | 465 | // capabilities, but digital-only outputs are better for some special cases. |
mjr | 36:6b981a2afab7 | 466 | // |
mjr | 36:6b981a2afab7 | 467 | // The Expansion Board "Chime" module uses these chips to add timer-protected |
mjr | 36:6b981a2afab7 | 468 | // outputs. The timer triggers are edge-sensitive, so we want simple on/off |
mjr | 36:6b981a2afab7 | 469 | // signals to control them; a PWM signal wouldn't work properly because it's |
mjr | 36:6b981a2afab7 | 470 | // constantly switching on and off even when nominally 100% on. |
mjr | 36:6b981a2afab7 | 471 | // |
mjr | 36:6b981a2afab7 | 472 | |
mjr | 36:6b981a2afab7 | 473 | #define HC595_NCHIPS 0 // Number of chips == number of Chime boards connected |
mjr | 36:6b981a2afab7 | 474 | #define HC595_SIN PTA5 // Serial data - use any GPIO pin |
mjr | 36:6b981a2afab7 | 475 | #define HC595_SCLK PTA4 // Serial clock - use any GPIO pin |
mjr | 36:6b981a2afab7 | 476 | #define HC595_LATCH PTA12 // Latch signal - use any GPIO pin |
mjr | 36:6b981a2afab7 | 477 | #define HC595_ENA PTD4 // Enable signal - use any GPIO pin |
mjr | 36:6b981a2afab7 | 478 | |
mjr | 17:ab3cec0c8bf4 | 479 | |
mjr | 31:582472d0bc57 | 480 | #endif // CONFIG_H - end of include-once section (code below this point can be multiply included) |
mjr | 31:582472d0bc57 | 481 | |
mjr | 31:582472d0bc57 | 482 | |
mjr | 31:582472d0bc57 | 483 | #ifdef DECL_EXTERNS // this section defines global variables, only if this macro is set |
mjr | 31:582472d0bc57 | 484 | |
mjr | 17:ab3cec0c8bf4 | 485 | // -------------------------------------------------------------------------- |
mjr | 17:ab3cec0c8bf4 | 486 | // |
mjr | 17:ab3cec0c8bf4 | 487 | |
mjr | 17:ab3cec0c8bf4 | 488 | // Joystick button input pin assignments. |
mjr | 17:ab3cec0c8bf4 | 489 | // |
mjr | 17:ab3cec0c8bf4 | 490 | // You can wire up to 32 GPIO ports to buttons (equipped with |
mjr | 17:ab3cec0c8bf4 | 491 | // momentary switches). Connect each switch between the desired |
mjr | 17:ab3cec0c8bf4 | 492 | // GPIO port and ground (J9 pin 12 or 14). When the button is pressed, |
mjr | 17:ab3cec0c8bf4 | 493 | // we'll tell the host PC that the corresponding joystick button is |
mjr | 17:ab3cec0c8bf4 | 494 | // pressed. We debounce the keystrokes in software, so you can simply |
mjr | 17:ab3cec0c8bf4 | 495 | // wire directly to pushbuttons with no additional external hardware. |
mjr | 17:ab3cec0c8bf4 | 496 | // |
mjr | 17:ab3cec0c8bf4 | 497 | // Note that we assign 24 buttons by default, even though the USB |
mjr | 17:ab3cec0c8bf4 | 498 | // joystick interface can handle up to 32 buttons. VP itself only |
mjr | 17:ab3cec0c8bf4 | 499 | // allows mapping of up to 24 buttons in the preferences dialog |
mjr | 17:ab3cec0c8bf4 | 500 | // (although it can recognize 32 buttons internally). If you want |
mjr | 17:ab3cec0c8bf4 | 501 | // more buttons, you can reassign pins that are assigned by default |
mjr | 17:ab3cec0c8bf4 | 502 | // as LedWiz outputs. To reassign a pin, find the pin you wish to |
mjr | 17:ab3cec0c8bf4 | 503 | // reassign in the LedWizPortMap array below, and change the pin name |
mjr | 17:ab3cec0c8bf4 | 504 | // there to NC (for Not Connected). You can then change one of the |
mjr | 17:ab3cec0c8bf4 | 505 | // "NC" entries below to the reallocated pin name. The limit is 32 |
mjr | 17:ab3cec0c8bf4 | 506 | // buttons total. |
mjr | 17:ab3cec0c8bf4 | 507 | // |
mjr | 36:6b981a2afab7 | 508 | // (If you're using TLC5940 chips to control outputs, many of the |
mjr | 36:6b981a2afab7 | 509 | // GPIO pins that are mapped to LedWiz outputs in the default |
mjr | 36:6b981a2afab7 | 510 | // mapping can be reassigned as keys, since the TLC5940 outputs |
mjr | 36:6b981a2afab7 | 511 | // take over for the GPIO pins. The exceptions are the pins that |
mjr | 36:6b981a2afab7 | 512 | // are reassigned to control the TLC5940 chips.) |
mjr | 28:cb71c4af2912 | 513 | // |
mjr | 17:ab3cec0c8bf4 | 514 | // Note: PTD1 (pin J2-12) should NOT be assigned as a button input, |
mjr | 17:ab3cec0c8bf4 | 515 | // as this pin is physically connected on the KL25Z to the on-board |
mjr | 36:6b981a2afab7 | 516 | // indicator LED's blue segment. |
mjr | 17:ab3cec0c8bf4 | 517 | PinName buttonMap[] = { |
mjr | 17:ab3cec0c8bf4 | 518 | PTC2, // J10 pin 10, joystick button 1 |
mjr | 17:ab3cec0c8bf4 | 519 | PTB3, // J10 pin 8, joystick button 2 |
mjr | 17:ab3cec0c8bf4 | 520 | PTB2, // J10 pin 6, joystick button 3 |
mjr | 17:ab3cec0c8bf4 | 521 | PTB1, // J10 pin 4, joystick button 4 |
mjr | 17:ab3cec0c8bf4 | 522 | |
mjr | 17:ab3cec0c8bf4 | 523 | PTE30, // J10 pin 11, joystick button 5 |
mjr | 36:6b981a2afab7 | 524 | #ifdef EXPANSION_BOARD |
mjr | 36:6b981a2afab7 | 525 | PTC11, // J1 pin 15, joystick button 6 |
mjr | 36:6b981a2afab7 | 526 | #else |
mjr | 17:ab3cec0c8bf4 | 527 | PTE22, // J10 pin 5, joystick button 6 |
mjr | 36:6b981a2afab7 | 528 | #endif |
mjr | 17:ab3cec0c8bf4 | 529 | |
mjr | 17:ab3cec0c8bf4 | 530 | PTE5, // J9 pin 15, joystick button 7 |
mjr | 17:ab3cec0c8bf4 | 531 | PTE4, // J9 pin 13, joystick button 8 |
mjr | 17:ab3cec0c8bf4 | 532 | PTE3, // J9 pin 11, joystick button 9 |
mjr | 17:ab3cec0c8bf4 | 533 | PTE2, // J9 pin 9, joystick button 10 |
mjr | 17:ab3cec0c8bf4 | 534 | PTB11, // J9 pin 7, joystick button 11 |
mjr | 17:ab3cec0c8bf4 | 535 | PTB10, // J9 pin 5, joystick button 12 |
mjr | 17:ab3cec0c8bf4 | 536 | PTB9, // J9 pin 3, joystick button 13 |
mjr | 17:ab3cec0c8bf4 | 537 | PTB8, // J9 pin 1, joystick button 14 |
mjr | 17:ab3cec0c8bf4 | 538 | |
mjr | 17:ab3cec0c8bf4 | 539 | PTC12, // J2 pin 1, joystick button 15 |
mjr | 17:ab3cec0c8bf4 | 540 | PTC13, // J2 pin 3, joystick button 16 |
mjr | 17:ab3cec0c8bf4 | 541 | PTC16, // J2 pin 5, joystick button 17 |
mjr | 17:ab3cec0c8bf4 | 542 | PTC17, // J2 pin 7, joystick button 18 |
mjr | 17:ab3cec0c8bf4 | 543 | PTA16, // J2 pin 9, joystick button 19 |
mjr | 17:ab3cec0c8bf4 | 544 | PTA17, // J2 pin 11, joystick button 20 |
mjr | 17:ab3cec0c8bf4 | 545 | PTE31, // J2 pin 13, joystick button 21 |
mjr | 17:ab3cec0c8bf4 | 546 | PTD6, // J2 pin 17, joystick button 22 |
mjr | 17:ab3cec0c8bf4 | 547 | PTD7, // J2 pin 19, joystick button 23 |
mjr | 17:ab3cec0c8bf4 | 548 | |
mjr | 17:ab3cec0c8bf4 | 549 | PTE1, // J2 pin 20, joystick button 24 |
mjr | 17:ab3cec0c8bf4 | 550 | |
mjr | 17:ab3cec0c8bf4 | 551 | NC, // not used, joystick button 25 |
mjr | 17:ab3cec0c8bf4 | 552 | NC, // not used, joystick button 26 |
mjr | 17:ab3cec0c8bf4 | 553 | NC, // not used, joystick button 27 |
mjr | 17:ab3cec0c8bf4 | 554 | NC, // not used, joystick button 28 |
mjr | 17:ab3cec0c8bf4 | 555 | NC, // not used, joystick button 29 |
mjr | 17:ab3cec0c8bf4 | 556 | NC, // not used, joystick button 30 |
mjr | 17:ab3cec0c8bf4 | 557 | NC, // not used, joystick button 31 |
mjr | 17:ab3cec0c8bf4 | 558 | NC // not used, joystick button 32 |
mjr | 17:ab3cec0c8bf4 | 559 | }; |
mjr | 17:ab3cec0c8bf4 | 560 | |
mjr | 17:ab3cec0c8bf4 | 561 | // -------------------------------------------------------------------------- |
mjr | 17:ab3cec0c8bf4 | 562 | // |
mjr | 35:d832bcab089e | 563 | // LED-Wiz emulation output pin assignments |
mjr | 17:ab3cec0c8bf4 | 564 | // |
mjr | 35:d832bcab089e | 565 | // This sets the mapping from logical LedWiz port numbers, as used |
mjr | 35:d832bcab089e | 566 | // in the software on the PC side, to physical hardware pins on the |
mjr | 35:d832bcab089e | 567 | // KL25Z and/or the TLC5940 controllers. |
mjr | 28:cb71c4af2912 | 568 | // |
mjr | 35:d832bcab089e | 569 | // The LedWiz protocol lets the PC software set a "brightness" level |
mjr | 35:d832bcab089e | 570 | // for each output. This is used to control the intensity of LEDs |
mjr | 35:d832bcab089e | 571 | // and other lights, and can also control motor speeds. To implement |
mjr | 35:d832bcab089e | 572 | // the intensity level in hardware, we use PWM, or pulse width |
mjr | 35:d832bcab089e | 573 | // modulation, which switches the output on and off very rapidly |
mjr | 35:d832bcab089e | 574 | // to give the effect of a reduced voltage. Unfortunately, the KL25Z |
mjr | 35:d832bcab089e | 575 | // hardware is limited to 10 channels of PWM control for its GPIO |
mjr | 35:d832bcab089e | 576 | // outputs, so it's impossible to implement the LedWiz's full set |
mjr | 35:d832bcab089e | 577 | // of 32 adjustable outputs using only GPIO ports. However, you can |
mjr | 35:d832bcab089e | 578 | // create 10 adjustable ports and fill out the rest with "digital" |
mjr | 35:d832bcab089e | 579 | // GPIO pins, which are simple on/off switches. The intensity level |
mjr | 35:d832bcab089e | 580 | // of a digital port can't be adjusted - it's either fully on or |
mjr | 35:d832bcab089e | 581 | // fully off - but this is fine for devices that don't have |
mjr | 35:d832bcab089e | 582 | // different intensity settings anyway, such as replay knockers |
mjr | 35:d832bcab089e | 583 | // and flipper solenoids. |
mjr | 17:ab3cec0c8bf4 | 584 | // |
mjr | 35:d832bcab089e | 585 | // In the mapping list below, you can decide how to dole out the |
mjr | 35:d832bcab089e | 586 | // PWM-capable and digital-only GPIO pins. To make it easier to |
mjr | 35:d832bcab089e | 587 | // remember which is which, the default mapping below groups all |
mjr | 35:d832bcab089e | 588 | // of the PWM-capable ports together in the first 10 logical LedWiz |
mjr | 35:d832bcab089e | 589 | // port numbers. Unfortunately, these ports aren't *physically* |
mjr | 35:d832bcab089e | 590 | // together on the KL25Z pin headers, so this layout may be simple |
mjr | 35:d832bcab089e | 591 | // in terms of the LedWiz numbering, but it's a little jumbled |
mjr | 35:d832bcab089e | 592 | // in the physical layout.t |
mjr | 35:d832bcab089e | 593 | // |
mjr | 35:d832bcab089e | 594 | // "NC" in the pin name slot means "not connected". This means |
mjr | 35:d832bcab089e | 595 | // that there's no physical output for this LedWiz port number. |
mjr | 35:d832bcab089e | 596 | // The device will still accept commands that control the port, |
mjr | 35:d832bcab089e | 597 | // but these will just be silently ignored, since there's no pin |
mjr | 35:d832bcab089e | 598 | // to turn on or off for these ports. The reason we leave some |
mjr | 35:d832bcab089e | 599 | // ports unconnected is that we don't have enough physical GPIO |
mjr | 35:d832bcab089e | 600 | // pins to fill out the full LedWiz complement of 32 ports. Many |
mjr | 35:d832bcab089e | 601 | // pins are already taken for other purposes, such as button |
mjr | 35:d832bcab089e | 602 | // inputs or the plunger CCD interface. |
mjr | 17:ab3cec0c8bf4 | 603 | // |
mjr | 17:ab3cec0c8bf4 | 604 | // The mapping between physical output pins on the KL25Z and the |
mjr | 35:d832bcab089e | 605 | // assigned LED-Wiz port numbers is essentially arbitrary. You can |
mjr | 17:ab3cec0c8bf4 | 606 | // customize this by changing the entries in the array below if you |
mjr | 17:ab3cec0c8bf4 | 607 | // wish to rearrange the pins for any reason. Be aware that some |
mjr | 17:ab3cec0c8bf4 | 608 | // of the physical outputs are already used for other purposes |
mjr | 17:ab3cec0c8bf4 | 609 | // (e.g., some of the GPIO pins on header J10 are used for the |
mjr | 17:ab3cec0c8bf4 | 610 | // CCD sensor - but you can of course reassign those as well by |
mjr | 35:d832bcab089e | 611 | // changing the corresponding declarations elsewhere in this file). |
mjr | 17:ab3cec0c8bf4 | 612 | // The assignments we make here have two main objectives: first, |
mjr | 17:ab3cec0c8bf4 | 613 | // to group the outputs on headers J1 and J2 (to facilitate neater |
mjr | 17:ab3cec0c8bf4 | 614 | // wiring by keeping the output pins together physically), and |
mjr | 17:ab3cec0c8bf4 | 615 | // second, to make the physical pin layout match the LED-Wiz port |
mjr | 17:ab3cec0c8bf4 | 616 | // numbering order to the extent possible. There's one big wrench |
mjr | 17:ab3cec0c8bf4 | 617 | // in the works, though, which is the limited number and discontiguous |
mjr | 17:ab3cec0c8bf4 | 618 | // placement of the KL25Z PWM-capable output pins. This prevents |
mjr | 17:ab3cec0c8bf4 | 619 | // us from doing the most obvious sequential ordering of the pins, |
mjr | 17:ab3cec0c8bf4 | 620 | // so we end up with the outputs arranged into several blocks. |
mjr | 17:ab3cec0c8bf4 | 621 | // Hopefully this isn't too confusing; for more detailed rationale, |
mjr | 17:ab3cec0c8bf4 | 622 | // read on... |
mjr | 17:ab3cec0c8bf4 | 623 | // |
mjr | 17:ab3cec0c8bf4 | 624 | // With the LED-Wiz, the host software configuration usually |
mjr | 17:ab3cec0c8bf4 | 625 | // assumes that each RGB LED is hooked up to three consecutive ports |
mjr | 17:ab3cec0c8bf4 | 626 | // (for the red, green, and blue components, which need to be |
mjr | 17:ab3cec0c8bf4 | 627 | // physically wired to separate outputs to allow each color to be |
mjr | 17:ab3cec0c8bf4 | 628 | // controlled independently). To facilitate this, we arrange the |
mjr | 17:ab3cec0c8bf4 | 629 | // PWM-enabled outputs so that they're grouped together in the |
mjr | 17:ab3cec0c8bf4 | 630 | // port numbering scheme. Unfortunately, these outputs aren't |
mjr | 17:ab3cec0c8bf4 | 631 | // together in a single group in the physical pin layout, so to |
mjr | 17:ab3cec0c8bf4 | 632 | // group them logically in the LED-Wiz port numbering scheme, we |
mjr | 17:ab3cec0c8bf4 | 633 | // have to break up the overall numbering scheme into several blocks. |
mjr | 17:ab3cec0c8bf4 | 634 | // So our port numbering goes sequentially down each column of |
mjr | 17:ab3cec0c8bf4 | 635 | // header pins, but there are several break points where we have |
mjr | 17:ab3cec0c8bf4 | 636 | // to interrupt the obvious sequence to keep the PWM pins grouped |
mjr | 17:ab3cec0c8bf4 | 637 | // logically. |
mjr | 17:ab3cec0c8bf4 | 638 | // |
mjr | 17:ab3cec0c8bf4 | 639 | // In the list below, "pin J1-2" refers to pin 2 on header J1 on |
mjr | 17:ab3cec0c8bf4 | 640 | // the KL25Z, using the standard pin numbering in the KL25Z |
mjr | 17:ab3cec0c8bf4 | 641 | // documentation - this is the physical pin that the port controls. |
mjr | 17:ab3cec0c8bf4 | 642 | // "LW port 1" means LED-Wiz port 1 - this is the LED-Wiz port |
mjr | 17:ab3cec0c8bf4 | 643 | // number that you use on the PC side (in the DirectOutput config |
mjr | 17:ab3cec0c8bf4 | 644 | // file, for example) to address the port. PWM-capable ports are |
mjr | 17:ab3cec0c8bf4 | 645 | // marked as such - we group the PWM-capable ports into the first |
mjr | 17:ab3cec0c8bf4 | 646 | // 10 LED-Wiz port numbers. |
mjr | 17:ab3cec0c8bf4 | 647 | // |
mjr | 17:ab3cec0c8bf4 | 648 | // If you wish to reallocate a pin in the array below to some other |
mjr | 17:ab3cec0c8bf4 | 649 | // use, such as a button input port, simply change the pin name in |
mjr | 17:ab3cec0c8bf4 | 650 | // the entry to NC (for Not Connected). This will disable the given |
mjr | 17:ab3cec0c8bf4 | 651 | // logical LedWiz port number and free up the physical pin. |
mjr | 17:ab3cec0c8bf4 | 652 | // |
mjr | 17:ab3cec0c8bf4 | 653 | // If you wish to reallocate a pin currently assigned to the button |
mjr | 17:ab3cec0c8bf4 | 654 | // input array, simply change the entry for the pin in the buttonMap[] |
mjr | 17:ab3cec0c8bf4 | 655 | // array above to NC (for "not connected"), and plug the pin name into |
mjr | 17:ab3cec0c8bf4 | 656 | // a slot of your choice in the array below. |
mjr | 17:ab3cec0c8bf4 | 657 | // |
mjr | 35:d832bcab089e | 658 | // Note: Don't assign PTD1 (pin J2-12) as an LedWiz output. That pin |
mjr | 35:d832bcab089e | 659 | // is hard-wired on the KL25Z to the on-board indicator LED's blue segment, |
mjr | 36:6b981a2afab7 | 660 | // which pretty precludes other uses of the pin. |
mjr | 35:d832bcab089e | 661 | // |
mjr | 35:d832bcab089e | 662 | // ACTIVE-LOW PORTS: By default, when a logical port is turned on in |
mjr | 35:d832bcab089e | 663 | // the software, we set the physical GPIO voltage to "high" (3.3V), and |
mjr | 35:d832bcab089e | 664 | // set it "low" (0V) when the logical port is off. This is the right |
mjr | 35:d832bcab089e | 665 | // scheme for the booster circuit described in the build guide. Some |
mjr | 35:d832bcab089e | 666 | // third-party booster circuits want the opposite voltage scheme, where |
mjr | 35:d832bcab089e | 667 | // logical "on" is represented by 0V on the port and logical "off" is |
mjr | 35:d832bcab089e | 668 | // represented by 3.3V. If you're using an "active low" booster like |
mjr | 35:d832bcab089e | 669 | // that, set the PORT_ACTIVE_LOW flag in the array below for each |
mjr | 35:d832bcab089e | 670 | // affected port. |
mjr | 35:d832bcab089e | 671 | // |
mjr | 35:d832bcab089e | 672 | // TLC5940 PORTS: To assign an LedWiz output port number to a particular |
mjr | 36:6b981a2afab7 | 673 | // output on a TLC5940, set the port type to TLC_PORT and set the 'pin' |
mjr | 36:6b981a2afab7 | 674 | // value to the index of the output port in the daisy chain. The first |
mjr | 36:6b981a2afab7 | 675 | // chip in the daisy chain has ports 1-16, the second has ports 17-32, |
mjr | 36:6b981a2afab7 | 676 | // and so on. |
mjr | 36:6b981a2afab7 | 677 | // |
mjr | 36:6b981a2afab7 | 678 | // 74HC595 PORTS: To assign an LedWiz output port to a 74HC595 port, |
mjr | 36:6b981a2afab7 | 679 | // set the port type to HC595_PORT and set 'pin' to the index of the port |
mjr | 36:6b981a2afab7 | 680 | // in the daisy chain. The first chip has ports 1-8, the second has |
mjr | 36:6b981a2afab7 | 681 | // 9-16, etc. |
mjr | 35:d832bcab089e | 682 | // |
mjr | 35:d832bcab089e | 683 | |
mjr | 36:6b981a2afab7 | 684 | // ledWizPortMap 'typ' values |
mjr | 36:6b981a2afab7 | 685 | enum LWPortType { |
mjr | 36:6b981a2afab7 | 686 | NO_PORT = -1, // Not connected |
mjr | 36:6b981a2afab7 | 687 | DIG_GPIO = 0, // DigitalOut I/O pin (not PWM capable) |
mjr | 36:6b981a2afab7 | 688 | PWM_GPIO = 1, // AnalogOut I/O pin (PWM capable) |
mjr | 36:6b981a2afab7 | 689 | TLC_PORT = 2, // TLC5940 output port |
mjr | 36:6b981a2afab7 | 690 | HC595_PORT = 3 // 74HC595 output port |
mjr | 36:6b981a2afab7 | 691 | }; |
mjr | 36:6b981a2afab7 | 692 | |
mjr | 36:6b981a2afab7 | 693 | // flags - combine with '|' |
mjr | 36:6b981a2afab7 | 694 | const int PORT_ACTIVE_LOW = 0x0001; // use LOW voltage (0V) when port is ON |
mjr | 35:d832bcab089e | 695 | |
mjr | 17:ab3cec0c8bf4 | 696 | struct { |
mjr | 36:6b981a2afab7 | 697 | int pin; // Pin name/index - PinName for GPIO, pin index for TLC5940 or 74HC595 |
mjr | 36:6b981a2afab7 | 698 | LWPortType typ; // type of pin |
mjr | 35:d832bcab089e | 699 | int flags; // flags - a combination of PORT_xxx flag bits (see above) |
mjr | 35:d832bcab089e | 700 | } ledWizPortMap[] = { |
mjr | 35:d832bcab089e | 701 | |
mjr | 35:d832bcab089e | 702 | #if TLC5940_NCHIPS == 0 |
mjr | 35:d832bcab089e | 703 | |
mjr | 35:d832bcab089e | 704 | // *** BASIC MODE - GPIO OUTPUTS ONLY *** |
mjr | 35:d832bcab089e | 705 | // This is the basic mapping, using entirely GPIO pins, for when you're |
mjr | 35:d832bcab089e | 706 | // not using external TLC5940 chips. We provide 22 physical outputs, 10 |
mjr | 35:d832bcab089e | 707 | // of which are PWM capable. |
mjr | 35:d832bcab089e | 708 | // |
mjr | 35:d832bcab089e | 709 | // Important! Note that the "isPWM" setting isn't just something we get to |
mjr | 35:d832bcab089e | 710 | // choose. It's a feature of the KL25Z hardware. Some pins are PWM capable |
mjr | 35:d832bcab089e | 711 | // and some aren't, and there's nothing we can do about that in the software. |
mjr | 35:d832bcab089e | 712 | // Refer to the KL25Z manual or schematics for the possible connections. Note |
mjr | 35:d832bcab089e | 713 | // that there are other PWM-capable pins besides the 10 shown below, BUT they |
mjr | 35:d832bcab089e | 714 | // all share TPM channels with the pins below. For example, TPM 2.0 can be |
mjr | 35:d832bcab089e | 715 | // connected to PTA1, PTB2, PTB18, PTE22 - but only one at a time. So if you |
mjr | 35:d832bcab089e | 716 | // want to use PTB2 as a PWM out, it means you CAN'T use PTA1 as a PWM out. |
mjr | 35:d832bcab089e | 717 | // We commented each PWM pin with its hardware channel number to help you keep |
mjr | 35:d832bcab089e | 718 | // track of available channels if you do need to rearrange any of these pins. |
mjr | 35:d832bcab089e | 719 | |
mjr | 36:6b981a2afab7 | 720 | { PTA1, PWM_GPIO }, // pin J1-2, LW port 1 (PWM capable - TPM 2.0 = channel 9) |
mjr | 36:6b981a2afab7 | 721 | { PTA2, PWM_GPIO }, // pin J1-4, LW port 2 (PWM capable - TPM 2.1 = channel 10) |
mjr | 36:6b981a2afab7 | 722 | { PTD4, PWM_GPIO }, // pin J1-6, LW port 3 (PWM capable - TPM 0.4 = channel 5) |
mjr | 36:6b981a2afab7 | 723 | { PTA12, PWM_GPIO }, // pin J1-8, LW port 4 (PWM capable - TPM 1.0 = channel 7) |
mjr | 36:6b981a2afab7 | 724 | { PTA4, PWM_GPIO }, // pin J1-10, LW port 5 (PWM capable - TPM 0.1 = channel 2) |
mjr | 36:6b981a2afab7 | 725 | { PTA5, PWM_GPIO }, // pin J1-12, LW port 6 (PWM capable - TPM 0.2 = channel 3) |
mjr | 36:6b981a2afab7 | 726 | { PTA13, PWM_GPIO }, // pin J2-2, LW port 7 (PWM capable - TPM 1.1 = channel 13) |
mjr | 36:6b981a2afab7 | 727 | { PTD5, PWM_GPIO }, // pin J2-4, LW port 8 (PWM capable - TPM 0.5 = channel 6) |
mjr | 36:6b981a2afab7 | 728 | { PTD0, PWM_GPIO }, // pin J2-6, LW port 9 (PWM capable - TPM 0.0 = channel 1) |
mjr | 36:6b981a2afab7 | 729 | { PTD3, PWM_GPIO }, // pin J2-10, LW port 10 (PWM capable - TPM 0.3 = channel 4) |
mjr | 36:6b981a2afab7 | 730 | { PTD2, DIG_GPIO }, // pin J2-8, LW port 11 |
mjr | 36:6b981a2afab7 | 731 | { PTC8, DIG_GPIO }, // pin J1-14, LW port 12 |
mjr | 36:6b981a2afab7 | 732 | { PTC9, DIG_GPIO }, // pin J1-16, LW port 13 |
mjr | 36:6b981a2afab7 | 733 | { PTC7, DIG_GPIO }, // pin J1-1, LW port 14 |
mjr | 36:6b981a2afab7 | 734 | { PTC0, DIG_GPIO }, // pin J1-3, LW port 15 |
mjr | 36:6b981a2afab7 | 735 | { PTC3, DIG_GPIO }, // pin J1-5, LW port 16 |
mjr | 36:6b981a2afab7 | 736 | { PTC4, DIG_GPIO }, // pin J1-7, LW port 17 |
mjr | 36:6b981a2afab7 | 737 | { PTC5, DIG_GPIO }, // pin J1-9, LW port 18 |
mjr | 36:6b981a2afab7 | 738 | { PTC6, DIG_GPIO }, // pin J1-11, LW port 19 |
mjr | 36:6b981a2afab7 | 739 | { PTC10, DIG_GPIO }, // pin J1-13, LW port 20 |
mjr | 36:6b981a2afab7 | 740 | { PTC11, DIG_GPIO }, // pin J1-15, LW port 21 |
mjr | 36:6b981a2afab7 | 741 | { PTE0, DIG_GPIO }, // pin J2-18, LW port 22 |
mjr | 36:6b981a2afab7 | 742 | { NC, NO_PORT }, // Not connected, LW port 23 |
mjr | 36:6b981a2afab7 | 743 | { NC, NO_PORT }, // Not connected, LW port 24 |
mjr | 36:6b981a2afab7 | 744 | { NC, NO_PORT }, // Not connected, LW port 25 |
mjr | 36:6b981a2afab7 | 745 | { NC, NO_PORT }, // Not connected, LW port 26 |
mjr | 36:6b981a2afab7 | 746 | { NC, NO_PORT }, // Not connected, LW port 27 |
mjr | 36:6b981a2afab7 | 747 | { NC, NO_PORT }, // Not connected, LW port 28 |
mjr | 36:6b981a2afab7 | 748 | { NC, NO_PORT }, // Not connected, LW port 29 |
mjr | 36:6b981a2afab7 | 749 | { NC, NO_PORT }, // Not connected, LW port 30 |
mjr | 36:6b981a2afab7 | 750 | { NC, NO_PORT }, // Not connected, LW port 31 |
mjr | 36:6b981a2afab7 | 751 | { NC, NO_PORT } // Not connected, LW port 32 |
mjr | 36:6b981a2afab7 | 752 | |
mjr | 35:d832bcab089e | 753 | #elif defined(EXPANSION_BOARD) |
mjr | 35:d832bcab089e | 754 | |
mjr | 35:d832bcab089e | 755 | // *** EXPANSION BOARD MODE *** |
mjr | 35:d832bcab089e | 756 | // |
mjr | 35:d832bcab089e | 757 | // This mapping is for the expansion board, which uses four TLC5940 |
mjr | 35:d832bcab089e | 758 | // chips to provide 64 outputs. The expansion board also uses |
mjr | 35:d832bcab089e | 759 | // one GPIO pin to provide a digital (non-PWM) output dedicated to |
mjr | 35:d832bcab089e | 760 | // the knocker circuit. That's on a digital pin because it's used |
mjr | 35:d832bcab089e | 761 | // to trigger an external timer circuit that limits the amount of |
mjr | 35:d832bcab089e | 762 | // time that the knocker coil can be continuously energized, to protect |
mjr | 35:d832bcab089e | 763 | // it against software faults on the PC that leave the port stuck on. |
mjr | 35:d832bcab089e | 764 | // (The knocker coil is unique among standard virtual cabinet output |
mjr | 35:d832bcab089e | 765 | // devices in this respect - it's the only device in common use that |
mjr | 35:d832bcab089e | 766 | // can be damaged if left on for too long. Other devices won't be |
mjr | 35:d832bcab089e | 767 | // damaged, so they don't require such elaborate precautions.) |
mjr | 35:d832bcab089e | 768 | // |
mjr | 35:d832bcab089e | 769 | // The specific device assignments in the last column are just |
mjr | 36:6b981a2afab7 | 770 | // recommendations. You can assign any port to any device with |
mjr | 35:d832bcab089e | 771 | // compatible power needs. The "General Purpose" ports are good to |
mjr | 36:6b981a2afab7 | 772 | // at least 5A, so you can use these for virtually anything; put |
mjr | 36:6b981a2afab7 | 773 | // your heavy-duty devices, such as solenoids and motors, on these |
mjr | 36:6b981a2afab7 | 774 | // outputs. You can also put lighter loads like lamps and LEDs |
mjr | 36:6b981a2afab7 | 775 | // on these if you have ports left over after connecting all of |
mjr | 36:6b981a2afab7 | 776 | // your high-power devices. The "Flasher" and "Button light" ports |
mjr | 36:6b981a2afab7 | 777 | // are good to about 1.5A, so they work for medium loads like lamps, |
mjr | 36:6b981a2afab7 | 778 | // flashers, high-power LEDs, etc. The flipper and magnasave ports |
mjr | 36:6b981a2afab7 | 779 | // only provide 20mA; use these only for small LEDs. |
mjr | 36:6b981a2afab7 | 780 | // |
mjr | 36:6b981a2afab7 | 781 | // The TLC5940 outputs on the expansion board are hard-wired to |
mjr | 36:6b981a2afab7 | 782 | // specific output drivers - that's what determines the power |
mjr | 36:6b981a2afab7 | 783 | // limits described above. You can rearrange the ports in the |
mjr | 36:6b981a2afab7 | 784 | // list below to change the LedWiz port numbering to any order |
mjr | 36:6b981a2afab7 | 785 | // you prefer, but the association between a TLC5940 port number |
mjr | 36:6b981a2afab7 | 786 | // and the output circuit type can't be changed in the software. |
mjr | 36:6b981a2afab7 | 787 | // That's a function of how the TLC5940 port is physically wired |
mjr | 36:6b981a2afab7 | 788 | // on the board. Likewise, the PTC8 output is hard-wired to the |
mjr | 36:6b981a2afab7 | 789 | // knocker time limiter. |
mjr | 36:6b981a2afab7 | 790 | // TLC ports 1-20 and 44-47 = Darlington outputs, 1.5A max |
mjr | 36:6b981a2afab7 | 791 | // TLC ports 21-44 = MOSFET outputs (limit depends on MOSFET chosen) |
mjr | 36:6b981a2afab7 | 792 | // TLC ports 49-64 = direct outputs, limited to 20mA |
mjr | 35:d832bcab089e | 793 | |
mjr | 35:d832bcab089e | 794 | // The first 32 ports are LedWiz-compatible, so they're universally |
mjr | 35:d832bcab089e | 795 | // accessible, even to older non-DOF software. Attach the most common |
mjr | 35:d832bcab089e | 796 | // devices to these ports. |
mjr | 36:6b981a2afab7 | 797 | { 1, TLC_PORT }, // TLC port 1, LW output 1 - Flasher 1 R |
mjr | 36:6b981a2afab7 | 798 | { 2, TLC_PORT }, // TLC port 2, LW output 2 - Flasher 1 G |
mjr | 36:6b981a2afab7 | 799 | { 3, TLC_PORT }, // TLC port 3, LW output 3 - Flasher 1 B |
mjr | 36:6b981a2afab7 | 800 | { 4, TLC_PORT }, // TLC port 4, LW output 4 - Flasher 2 R |
mjr | 36:6b981a2afab7 | 801 | { 5, TLC_PORT }, // TLC port 5, LW output 5 - Flasher 2 G |
mjr | 36:6b981a2afab7 | 802 | { 6, TLC_PORT }, // TLC port 6, LW output 6 - Flasher 2 B |
mjr | 36:6b981a2afab7 | 803 | { 7, TLC_PORT }, // TLC port 7, LW output 7 - Flasher 3 R |
mjr | 36:6b981a2afab7 | 804 | { 8, TLC_PORT }, // TLC port 8, LW output 8 - Flasher 3 G |
mjr | 36:6b981a2afab7 | 805 | { 9, TLC_PORT }, // TLC port 9, LW output 9 - Flasher 3 B |
mjr | 36:6b981a2afab7 | 806 | { 10, TLC_PORT }, // TLC port 10, LW output 10 - Flasher 4 R |
mjr | 36:6b981a2afab7 | 807 | { 11, TLC_PORT }, // TLC port 11, LW output 11 - Flasher 4 G |
mjr | 36:6b981a2afab7 | 808 | { 12, TLC_PORT }, // TLC port 12, LW output 12 - Flasher 4 B |
mjr | 36:6b981a2afab7 | 809 | { 13, TLC_PORT }, // TLC port 13, LW output 13 - Flasher 5 R |
mjr | 36:6b981a2afab7 | 810 | { 14, TLC_PORT }, // TLC port 14, LW output 14 - Flasher 5 G |
mjr | 36:6b981a2afab7 | 811 | { 15, TLC_PORT }, // TLC port 15, LW output 15 - Flasher 5 B |
mjr | 36:6b981a2afab7 | 812 | { 16, TLC_PORT }, // TLC port 16, LW output 16 - Strobe/Button light |
mjr | 36:6b981a2afab7 | 813 | { 17, TLC_PORT }, // TLC port 17, LW output 17 - Button light 1 |
mjr | 36:6b981a2afab7 | 814 | { 18, TLC_PORT }, // TLC port 18, LW output 18 - Button light 2 |
mjr | 36:6b981a2afab7 | 815 | { 19, TLC_PORT }, // TLC port 19, LW output 19 - Button light 3 |
mjr | 36:6b981a2afab7 | 816 | { 20, TLC_PORT }, // TLC port 20, LW output 20 - Button light 4 |
mjr | 36:6b981a2afab7 | 817 | { PTC8, DIG_GPIO }, // PTC8, LW output 21 - Replay Knocker |
mjr | 36:6b981a2afab7 | 818 | { 21, TLC_PORT }, // TLC port 21, LW output 22 - Contactor 1/General purpose |
mjr | 36:6b981a2afab7 | 819 | { 22, TLC_PORT }, // TLC port 22, LW output 23 - Contactor 2/General purpose |
mjr | 36:6b981a2afab7 | 820 | { 23, TLC_PORT }, // TLC port 23, LW output 24 - Contactor 3/General purpose |
mjr | 36:6b981a2afab7 | 821 | { 24, TLC_PORT }, // TLC port 24, LW output 25 - Contactor 4/General purpose |
mjr | 36:6b981a2afab7 | 822 | { 25, TLC_PORT }, // TLC port 25, LW output 26 - Contactor 5/General purpose |
mjr | 36:6b981a2afab7 | 823 | { 26, TLC_PORT }, // TLC port 26, LW output 27 - Contactor 6/General purpose |
mjr | 36:6b981a2afab7 | 824 | { 27, TLC_PORT }, // TLC port 27, LW output 28 - Contactor 7/General purpose |
mjr | 36:6b981a2afab7 | 825 | { 28, TLC_PORT }, // TLC port 28, LW output 29 - Contactor 8/General purpose |
mjr | 36:6b981a2afab7 | 826 | { 29, TLC_PORT }, // TLC port 29, LW output 30 - Contactor 9/General purpose |
mjr | 36:6b981a2afab7 | 827 | { 30, TLC_PORT }, // TLC port 30, LW output 31 - Contactor 10/General purpose |
mjr | 36:6b981a2afab7 | 828 | { 31, TLC_PORT }, // TLC port 31, LW output 32 - Shaker Motor/General purpose |
mjr | 35:d832bcab089e | 829 | |
mjr | 35:d832bcab089e | 830 | // Ports 33+ are accessible only to DOF-based software. Older LedWiz-only |
mjr | 35:d832bcab089e | 831 | // software on the can't access these. Attach less common devices to these ports. |
mjr | 36:6b981a2afab7 | 832 | { 32, TLC_PORT }, // TLC port 32, LW output 33 - Gear Motor/General purpose |
mjr | 36:6b981a2afab7 | 833 | { 33, TLC_PORT }, // TLC port 33, LW output 34 - Fan/General purpose |
mjr | 36:6b981a2afab7 | 834 | { 34, TLC_PORT }, // TLC port 34, LW output 35 - Beacon/General purpose |
mjr | 36:6b981a2afab7 | 835 | { 35, TLC_PORT }, // TLC port 35, LW output 36 - Undercab RGB R/General purpose |
mjr | 36:6b981a2afab7 | 836 | { 36, TLC_PORT }, // TLC port 36, LW output 37 - Undercab RGB G/General purpose |
mjr | 36:6b981a2afab7 | 837 | { 37, TLC_PORT }, // TLC port 37, LW output 38 - Undercab RGB B/General purpose |
mjr | 36:6b981a2afab7 | 838 | { 38, TLC_PORT }, // TLC port 38, LW output 39 - Bell/General purpose |
mjr | 36:6b981a2afab7 | 839 | { 39, TLC_PORT }, // TLC port 39, LW output 40 - Chime 1/General purpose |
mjr | 36:6b981a2afab7 | 840 | { 40, TLC_PORT }, // TLC port 40, LW output 41 - Chime 2/General purpose |
mjr | 36:6b981a2afab7 | 841 | { 41, TLC_PORT }, // TLC port 41, LW output 42 - Chime 3/General purpose |
mjr | 36:6b981a2afab7 | 842 | { 42, TLC_PORT }, // TLC port 42, LW output 43 - General purpose |
mjr | 36:6b981a2afab7 | 843 | { 43, TLC_PORT }, // TLC port 43, LW output 44 - General purpose |
mjr | 36:6b981a2afab7 | 844 | { 44, TLC_PORT }, // TLC port 44, LW output 45 - Button light 5 |
mjr | 36:6b981a2afab7 | 845 | { 45, TLC_PORT }, // TLC port 45, LW output 46 - Button light 6 |
mjr | 36:6b981a2afab7 | 846 | { 46, TLC_PORT }, // TLC port 46, LW output 47 - Button light 7 |
mjr | 36:6b981a2afab7 | 847 | { 47, TLC_PORT }, // TLC port 47, LW output 48 - Button light 8 |
mjr | 36:6b981a2afab7 | 848 | { 49, TLC_PORT }, // TLC port 49, LW output 49 - Flipper button RGB left R |
mjr | 36:6b981a2afab7 | 849 | { 50, TLC_PORT }, // TLC port 50, LW output 50 - Flipper button RGB left G |
mjr | 36:6b981a2afab7 | 850 | { 51, TLC_PORT }, // TLC port 51, LW output 51 - Flipper button RGB left B |
mjr | 36:6b981a2afab7 | 851 | { 52, TLC_PORT }, // TLC port 52, LW output 52 - Flipper button RGB right R |
mjr | 36:6b981a2afab7 | 852 | { 53, TLC_PORT }, // TLC port 53, LW output 53 - Flipper button RGB right G |
mjr | 36:6b981a2afab7 | 853 | { 54, TLC_PORT }, // TLC port 54, LW output 54 - Flipper button RGB right B |
mjr | 36:6b981a2afab7 | 854 | { 55, TLC_PORT }, // TLC port 55, LW output 55 - MagnaSave button RGB left R |
mjr | 36:6b981a2afab7 | 855 | { 56, TLC_PORT }, // TLC port 56, LW output 56 - MagnaSave button RGB left G |
mjr | 36:6b981a2afab7 | 856 | { 57, TLC_PORT }, // TLC port 57, LW output 57 - MagnaSave button RGB left B |
mjr | 36:6b981a2afab7 | 857 | { 58, TLC_PORT }, // TLC port 58, LW output 58 - MagnaSave button RGB right R |
mjr | 36:6b981a2afab7 | 858 | { 59, TLC_PORT }, // TLC port 59, LW output 59 - MagnaSave button RGB right G |
mjr | 36:6b981a2afab7 | 859 | { 60, TLC_PORT }, // TLC port 60, LW output 60 - MagnaSave button RGB right B |
mjr | 36:6b981a2afab7 | 860 | { 61, TLC_PORT }, // TLC port 61, LW output 61 - Extra RGB LED R |
mjr | 36:6b981a2afab7 | 861 | { 62, TLC_PORT }, // TLC port 62, LW output 62 - Extra RGB LED G |
mjr | 36:6b981a2afab7 | 862 | { 63, TLC_PORT }, // TLC port 63, LW output 63 - Extra RGB LED B |
mjr | 36:6b981a2afab7 | 863 | { 64, TLC_PORT } // TLC port 64, LW output 64 - Extra single LED |
mjr | 35:d832bcab089e | 864 | |
mjr | 35:d832bcab089e | 865 | #else |
mjr | 35:d832bcab089e | 866 | |
mjr | 35:d832bcab089e | 867 | // *** TLC5940 + GPIO OUTPUTS, Without the expansion board *** |
mjr | 35:d832bcab089e | 868 | // |
mjr | 35:d832bcab089e | 869 | // This is the mapping for the ehnanced mode, with one or more TLC5940 |
mjr | 35:d832bcab089e | 870 | // chips connected. Each TLC5940 chip provides 16 PWM channels. We |
mjr | 35:d832bcab089e | 871 | // can supplement the TLC5940 outputs with GPIO pins to get even more |
mjr | 35:d832bcab089e | 872 | // physical outputs. |
mjr | 35:d832bcab089e | 873 | // |
mjr | 35:d832bcab089e | 874 | // Because we've already declared the number of TLC5940 chips earlier |
mjr | 35:d832bcab089e | 875 | // in this file, we don't actually have to map out all of the TLC5940 |
mjr | 35:d832bcab089e | 876 | // ports here. The software will automatically assign all of the |
mjr | 35:d832bcab089e | 877 | // TLC5940 ports that aren't explicitly mentioned here to the next |
mjr | 35:d832bcab089e | 878 | // available LedWiz port numbers after the end of this array, assigning |
mjr | 35:d832bcab089e | 879 | // them sequentially in TLC5940 port order. |
mjr | 35:d832bcab089e | 880 | // |
mjr | 35:d832bcab089e | 881 | // In contrast to the basic mode arrangement, we're putting all of the |
mjr | 35:d832bcab089e | 882 | // NON PWM ports first in this mapping. The logic is that all of the |
mjr | 35:d832bcab089e | 883 | // TLC5940 ports are PWM-capable, and they'll all at the end of the list |
mjr | 35:d832bcab089e | 884 | // here, so by putting the PWM GPIO pins last here, we'll keep all of the |
mjr | 35:d832bcab089e | 885 | // PWM ports grouped in the final mapping. |
mjr | 35:d832bcab089e | 886 | // |
mjr | 35:d832bcab089e | 887 | // Note that the TLC5940 control wiring takes away several GPIO pins |
mjr | 35:d832bcab089e | 888 | // that we used as output ports in the basic mode. Further, because the |
mjr | 35:d832bcab089e | 889 | // TLC5940 makes ports so plentiful, we're intentionally omitting several |
mjr | 35:d832bcab089e | 890 | // more of the pins from the basic set, to make them available for other |
mjr | 35:d832bcab089e | 891 | // uses. To keep things more neatly grouped, we're only assigning J1 pins |
mjr | 35:d832bcab089e | 892 | // in this set. This leaves the following ports from the basic mode output |
mjr | 35:d832bcab089e | 893 | // set available for other users: PTA13, PTD0, PTD2, PTD3, PTD5, PTE0. |
mjr | 35:d832bcab089e | 894 | |
mjr | 36:6b981a2afab7 | 895 | { PTC8, DIG_GPIO }, // pin J1-14, LW port 1 |
mjr | 36:6b981a2afab7 | 896 | { PTC9, DIG_GPIO }, // pin J1-16, LW port 2 |
mjr | 36:6b981a2afab7 | 897 | { PTC0, DIG_GPIO }, // pin J1-3, LW port 3 |
mjr | 36:6b981a2afab7 | 898 | { PTC3, DIG_GPIO }, // pin J1-5, LW port 4 |
mjr | 36:6b981a2afab7 | 899 | { PTC4, DIG_GPIO }, // pin J1-7, LW port 5 |
mjr | 36:6b981a2afab7 | 900 | { PTC11, DIG_GPIO }, // pin J1-15, LW port 6 |
mjr | 36:6b981a2afab7 | 901 | { PTA2, PWM_GPIO }, // pin J1-4, LW port 7 (PWM capable - TPM 2.1 = channel 10) |
mjr | 36:6b981a2afab7 | 902 | { PTD4, PWM_GPIO }, // pin J1-6, LW port 8 (PWM capable - TPM 0.4 = channel 5) |
mjr | 36:6b981a2afab7 | 903 | { PTA12, PWM_GPIO }, // pin J1-8, LW port 9 (PWM capable - TPM 1.0 = channel 7) |
mjr | 36:6b981a2afab7 | 904 | { PTA4, PWM_GPIO }, // pin J1-10, LW port 10 (PWM capable - TPM 0.1 = channel 2) |
mjr | 36:6b981a2afab7 | 905 | { PTA5, PWM_GPIO } // pin J1-12, LW port 11 (PWM capable - TPM 0.2 = channel 3) |
mjr | 35:d832bcab089e | 906 | |
mjr | 35:d832bcab089e | 907 | // TLC5940 ports start here! |
mjr | 35:d832bcab089e | 908 | // First chip port 0 -> LW port 12 |
mjr | 35:d832bcab089e | 909 | // First chip port 1 -> LW port 13 |
mjr | 35:d832bcab089e | 910 | // ... etc, filling out all chip ports sequentially ... |
mjr | 35:d832bcab089e | 911 | |
mjr | 35:d832bcab089e | 912 | #endif // TLC5940_NCHIPS |
mjr | 17:ab3cec0c8bf4 | 913 | }; |
mjr | 17:ab3cec0c8bf4 | 914 | |
mjr | 21:5048e16cc9ef | 915 | |
mjr | 25:e22b88bd783a | 916 | #endif // DECL_EXTERNS |