1. Do not share user accounts! Any account that is shared by another person will be blocked and closed. This means: we will close not only the account that is shared, but also the main account of the user who uses another person's account. We have the ability to detect account sharing, so please do not try to cheat the system. This action will take place on 04/18/2023. Read all forum rules.
    Dismiss Notice
  2. For downloading SimTools plugins you need a Download Package. Get it with virtual coins that you receive for forum activity or Buy Download Package - We have a zero Spam tolerance so read our forum rules first.

    Buy Now a Download Plan!
  3. Do not try to cheat our system and do not post an unnecessary amount of useless posts only to earn credits here. We have a zero spam tolerance policy and this will cause a ban of your user account. Otherwise we wish you a pleasant stay here! Read the forum rules
  4. We have a few rules which you need to read and accept before posting anything here! Following these rules will keep the forum clean and your stay pleasant. Do not follow these rules can lead to permanent exclusion from this website: Read the forum rules.
    Are you a company? Read our company rules

Using RPM to drive Bass Shakers?

Discussion in 'SimTools compatible interfaces' started by Alexey, Jul 14, 2015.

  1. Alexey

    Alexey Well-Known Member

    Joined:
    Sep 23, 2014
    Messages:
    452
    Occupation:
    Electronics Technician
    Location:
    Adelaide, Australia
    Balance:
    8,060Coins
    Ratings:
    +620 / 2 / -0
    My Motion Simulator:
    3DOF, DC motor, Arduino
    Hey guys,

    This could either be a brainwave or a brainfart.

    I have been experimenting with my home built bass shaker http://www.xsimulator.net/community/threads/diy-high-power-bass-shaker.7070/ and have found that it responds best when using single frequency as an input in the range of 10Hz to 150Hz. I have some code written for an arduino due that is essentially a digital VCO that has a range of 1Hz to 170Hz that is controlled by a 0 - 5v input from a potentiometer. It also has the options for different waveforms (selected by setting pins high or low) so it's more of a function generator than anything.

    My question is for the software gurus.
    Is it possible to use the RPM data from the simtools gamedash interface or even some other dedicated interface to control the frequency as opposed to using the potentiometer as the control? Say 10,000 rpm is 100Hz scaling all the way down to 10Hz? (1Hz would blow a fuse or overheat the coil). My knowledge of code is extremely limited so I would have no idea what is actually possible and what is not, hence the brainfart.

    I ask this because using this code could simplify the overall construction of a bass shaker system. Instead of using costly audio amplifiers to drive a sine wave and having to also buy a separate sound card, a square wave could be utilized so that a transistor could be used as a switch to turn a DC supply on and off (same effect as audio but only using half the wave).

    This type of control could then be used to control other sources of vibration such as ripple strip curbing and rough terrain.

    This is the code (This code is not mine):

    Code:
    /*
    Simple Waveform generator with Arduino Due
    
    * connect two push buttons to the digital pins 2 and 3
       with a 10 kilohm pulldown resistor to choose the waveform
       to send to the DAC0 and DAC1 channels
    * connect a 10 kilohm potentiometer to A0 to control the
       signal frequency
    
    */
    
    #include "Waveforms.h"
    
    #define oneHzSample 1000000/maxSamplesNum  // sample for the 1Hz signal expressed in microseconds
    
    const int button0 = 2, button1 = 3;
    volatile int wave0 = 0, wave1 = 0;
    
    int i = 0;
    int sample;
    
    void setup() {
    analogWriteResolution(12);  // set the analog output resolution to 12 bit (4096 levels)
    analogReadResolution(12);   // set the analog input resolution to 12 bit
    
    attachInterrupt(button0, wave0Select, RISING);  // Interrupt attached to the button connected to pin 2
    attachInterrupt(button1, wave1Select, RISING);  // Interrupt attached to the button connected to pin 3
    }
    
    void loop() {
    // Read the the potentiometer and map the value  between the maximum and the minimum sample available
    // 1 Hz is the minimum freq for the complete wave
    // 170 Hz is the maximum freq for the complete wave. Measured considering the loop and the analogRead() time
    sample = map(analogRead(A0), 0, 4095, 0, oneHzSample);
    sample = constrain(t_sample, 0, oneHzSample);
    
    analogWrite(DAC0, waveformsTable[wave0]);  // write the selected waveform on DAC0
    analogWrite(DAC1, waveformsTable[wave1]);  // write the selected waveform on DAC1
    
    i++;
    if(i == maxSamplesNum)  // Reset the counter to repeat the wave
       i = 0;
    
    delayMicroseconds(sample);  // Hold the sample value for the sample time
    }
    
    // function hooked to the interrupt on digital pin 2
    void wave0Select() {
    wave0++;
    if(wave0 == 4)
       wave0 = 0;
    }
    
    // function hooked to the interrupt on digital pin 3
    void wave1Select() {
    wave1++;
    if(wave1 == 4)
       wave1 = 0;
    }
    [Get Code]
    Waveforms.h
    
    #ifndef _Waveforms_h_
    #define _Waveforms_h_
    
    #define maxWaveform 4
    #define maxSamplesNum 120
    
    static int waveformsTable[maxWaveform][maxSamplesNum] = {
    // Sin wave
    {
       0x7ff, 0x86a, 0x8d5, 0x93f, 0x9a9, 0xa11, 0xa78, 0xadd, 0xb40, 0xba1,
       0xbff, 0xc5a, 0xcb2, 0xd08, 0xd59, 0xda7, 0xdf1, 0xe36, 0xe77, 0xeb4,
       0xeec, 0xf1f, 0xf4d, 0xf77, 0xf9a, 0xfb9, 0xfd2, 0xfe5, 0xff3, 0xffc,
       0xfff, 0xffc, 0xff3, 0xfe5, 0xfd2, 0xfb9, 0xf9a, 0xf77, 0xf4d, 0xf1f,
       0xeec, 0xeb4, 0xe77, 0xe36, 0xdf1, 0xda7, 0xd59, 0xd08, 0xcb2, 0xc5a,
       0xbff, 0xba1, 0xb40, 0xadd, 0xa78, 0xa11, 0x9a9, 0x93f, 0x8d5, 0x86a,
       0x7ff, 0x794, 0x729, 0x6bf, 0x655, 0x5ed, 0x586, 0x521, 0x4be, 0x45d,
       0x3ff, 0x3a4, 0x34c, 0x2f6, 0x2a5, 0x257, 0x20d, 0x1c8, 0x187, 0x14a,
       0x112, 0xdf, 0xb1, 0x87, 0x64, 0x45, 0x2c, 0x19, 0xb, 0x2,
       0x0, 0x2, 0xb, 0x19, 0x2c, 0x45, 0x64, 0x87, 0xb1, 0xdf,
       0x112, 0x14a, 0x187, 0x1c8, 0x20d, 0x257, 0x2a5, 0x2f6, 0x34c, 0x3a4,
       0x3ff, 0x45d, 0x4be, 0x521, 0x586, 0x5ed, 0x655, 0x6bf, 0x729, 0x794
    }
    ,
    
    // Triangular wave
    {
       0x44, 0x88, 0xcc, 0x110, 0x154, 0x198, 0x1dc, 0x220, 0x264, 0x2a8,
       0x2ec, 0x330, 0x374, 0x3b8, 0x3fc, 0x440, 0x484, 0x4c8, 0x50c, 0x550,
       0x594, 0x5d8, 0x61c, 0x660, 0x6a4, 0x6e8, 0x72c, 0x770, 0x7b4, 0x7f8,
       0x83c, 0x880, 0x8c4, 0x908, 0x94c, 0x990, 0x9d4, 0xa18, 0xa5c, 0xaa0,
       0xae4, 0xb28, 0xb6c, 0xbb0, 0xbf4, 0xc38, 0xc7c, 0xcc0, 0xd04, 0xd48,
       0xd8c, 0xdd0, 0xe14, 0xe58, 0xe9c, 0xee0, 0xf24, 0xf68, 0xfac, 0xff0,
       0xfac, 0xf68, 0xf24, 0xee0, 0xe9c, 0xe58, 0xe14, 0xdd0, 0xd8c, 0xd48,
       0xd04, 0xcc0, 0xc7c, 0xc38, 0xbf4, 0xbb0, 0xb6c, 0xb28, 0xae4, 0xaa0,
       0xa5c, 0xa18, 0x9d4, 0x990, 0x94c, 0x908, 0x8c4, 0x880, 0x83c, 0x7f8,
       0x7b4, 0x770, 0x72c, 0x6e8, 0x6a4, 0x660, 0x61c, 0x5d8, 0x594, 0x550,
       0x50c, 0x4c8, 0x484, 0x440, 0x3fc, 0x3b8, 0x374, 0x330, 0x2ec, 0x2a8,
       0x264, 0x220, 0x1dc, 0x198, 0x154, 0x110, 0xcc, 0x88, 0x44, 0x0
    }
    ,
    
    // Sawtooth wave
    {
       0x22, 0x44, 0x66, 0x88, 0xaa, 0xcc, 0xee, 0x110, 0x132, 0x154,
       0x176, 0x198, 0x1ba, 0x1dc, 0x1fe, 0x220, 0x242, 0x264, 0x286, 0x2a8,
       0x2ca, 0x2ec, 0x30e, 0x330, 0x352, 0x374, 0x396, 0x3b8, 0x3da, 0x3fc,
       0x41e, 0x440, 0x462, 0x484, 0x4a6, 0x4c8, 0x4ea, 0x50c, 0x52e, 0x550,
       0x572, 0x594, 0x5b6, 0x5d8, 0x5fa, 0x61c, 0x63e, 0x660, 0x682, 0x6a4,
       0x6c6, 0x6e8, 0x70a, 0x72c, 0x74e, 0x770, 0x792, 0x7b4, 0x7d6, 0x7f8,
       0x81a, 0x83c, 0x85e, 0x880, 0x8a2, 0x8c4, 0x8e6, 0x908, 0x92a, 0x94c,
       0x96e, 0x990, 0x9b2, 0x9d4, 0x9f6, 0xa18, 0xa3a, 0xa5c, 0xa7e, 0xaa0,
       0xac2, 0xae4, 0xb06, 0xb28, 0xb4a, 0xb6c, 0xb8e, 0xbb0, 0xbd2, 0xbf4,
       0xc16, 0xc38, 0xc5a, 0xc7c, 0xc9e, 0xcc0, 0xce2, 0xd04, 0xd26, 0xd48,
       0xd6a, 0xd8c, 0xdae, 0xdd0, 0xdf2, 0xe14, 0xe36, 0xe58, 0xe7a, 0xe9c,
       0xebe, 0xee0, 0xf02, 0xf24, 0xf46, 0xf68, 0xf8a, 0xfac, 0xfce, 0xff0
    }
    ,
    
    // Square wave
    {
       0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff,
       0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff,
       0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff,
       0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff,
       0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff,
       0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff,
       0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
       0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
       0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
       0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
       0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
       0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
    }
    
    };
    
    #endif
    • Creative Creative x 2
    • Like Like x 1
  2. tombo

    tombo Active Member

    Joined:
    Oct 5, 2013
    Messages:
    269
    Location:
    Germany
    Balance:
    2,436Coins
    Ratings:
    +246 / 2 / -0
    My Motion Simulator:
    DC motor, Arduino
    Hello,
    I'm not a software proffessional, but i like your project and willt ry to help.
    I modyfied the code a little bit:

    Code:
    /*
    Simple Waveform generator with Arduino Due
    
    * connect two push buttons to the digital pins 2 and 3
       with a 10 kilohm pulldown resistor to choose the waveform
       to send to the DAC0 and DAC1 channels
    * connect a 10 kilohm potentiometer to A0 to control the
       signal frequency
    
    */
    
    #include "Waveforms.h"
    
    #define oneHzSample 1000000/maxSamplesNum  // sample for the 1Hz signal expressed in microseconds
    
    const int button0 = 2, button1 = 3;
    volatile int wave0 = 0, wave1 = 0;
    
    int Rpm=0;
    
    int i = 0;
    int sample;
    
    void setup() {
    Serial.begin(115200);
    
    analogWriteResolution(12);  // set the analog output resolution to 12 bit (4096 levels)
    analogReadResolution(12);   // set the analog input resolution to 12 bit
    
    attachInterrupt(button0, wave0Select, RISING);  // Interrupt attached to the button connected to pin 2
    attachInterrupt(button1, wave1Select, RISING);  // Interrupt attached to the button connected to pin 3
    }
    
    void loop() {
    
    while (Serial.available() > 2)  {
      kind_of_data = Serial.read();
      if (kind_of_data == 'R' ) Rpm = Serial.read();
      }
    
    
    // Read the the potentiometer and map the value  between the maximum and the minimum sample available
    // 1 Hz is the minimum freq for the complete wave
    // 170 Hz is the maximum freq for the complete wave. Measured considering the loop and the analogRead() time
    sample = map(Rpm, 0, 4095, 0, oneHzSample);
    sample = constrain(t_sample, 0, oneHzSample);
    
    analogWrite(DAC0, waveformsTable[wave0]);  // write the selected waveform on DAC0
    analogWrite(DAC1, waveformsTable[wave1]);  // write the selected waveform on DAC1
    
    i++;
    if(i == maxSamplesNum)  // Reset the counter to repeat the wave
       i = 0;
    
    delayMicroseconds(sample);  // Hold the sample value for the sample time
    }
    
    // function hooked to the interrupt on digital pin 2
    void wave0Select() {
    wave0++;
    if(wave0 == 4)
       wave0 = 0;
    }
    
    // function hooked to the interrupt on digital pin 3
    void wave1Select() {
    wave1++;
    if(wave1 == 4)
       wave1 = 0;
    }
    [Get Code]
    Waveforms.h
    
    #ifndef _Waveforms_h_
    #define _Waveforms_h_
    
    #define maxWaveform 4
    #define maxSamplesNum 120
    
    static int waveformsTable[maxWaveform][maxSamplesNum] = {
    // Sin wave
    {
       0x7ff, 0x86a, 0x8d5, 0x93f, 0x9a9, 0xa11, 0xa78, 0xadd, 0xb40, 0xba1,
       0xbff, 0xc5a, 0xcb2, 0xd08, 0xd59, 0xda7, 0xdf1, 0xe36, 0xe77, 0xeb4,
       0xeec, 0xf1f, 0xf4d, 0xf77, 0xf9a, 0xfb9, 0xfd2, 0xfe5, 0xff3, 0xffc,
       0xfff, 0xffc, 0xff3, 0xfe5, 0xfd2, 0xfb9, 0xf9a, 0xf77, 0xf4d, 0xf1f,
       0xeec, 0xeb4, 0xe77, 0xe36, 0xdf1, 0xda7, 0xd59, 0xd08, 0xcb2, 0xc5a,
       0xbff, 0xba1, 0xb40, 0xadd, 0xa78, 0xa11, 0x9a9, 0x93f, 0x8d5, 0x86a,
       0x7ff, 0x794, 0x729, 0x6bf, 0x655, 0x5ed, 0x586, 0x521, 0x4be, 0x45d,
       0x3ff, 0x3a4, 0x34c, 0x2f6, 0x2a5, 0x257, 0x20d, 0x1c8, 0x187, 0x14a,
       0x112, 0xdf, 0xb1, 0x87, 0x64, 0x45, 0x2c, 0x19, 0xb, 0x2,
       0x0, 0x2, 0xb, 0x19, 0x2c, 0x45, 0x64, 0x87, 0xb1, 0xdf,
       0x112, 0x14a, 0x187, 0x1c8, 0x20d, 0x257, 0x2a5, 0x2f6, 0x34c, 0x3a4,
       0x3ff, 0x45d, 0x4be, 0x521, 0x586, 0x5ed, 0x655, 0x6bf, 0x729, 0x794
    }
    ,
    
    // Triangular wave
    {
       0x44, 0x88, 0xcc, 0x110, 0x154, 0x198, 0x1dc, 0x220, 0x264, 0x2a8,
       0x2ec, 0x330, 0x374, 0x3b8, 0x3fc, 0x440, 0x484, 0x4c8, 0x50c, 0x550,
       0x594, 0x5d8, 0x61c, 0x660, 0x6a4, 0x6e8, 0x72c, 0x770, 0x7b4, 0x7f8,
       0x83c, 0x880, 0x8c4, 0x908, 0x94c, 0x990, 0x9d4, 0xa18, 0xa5c, 0xaa0,
       0xae4, 0xb28, 0xb6c, 0xbb0, 0xbf4, 0xc38, 0xc7c, 0xcc0, 0xd04, 0xd48,
       0xd8c, 0xdd0, 0xe14, 0xe58, 0xe9c, 0xee0, 0xf24, 0xf68, 0xfac, 0xff0,
       0xfac, 0xf68, 0xf24, 0xee0, 0xe9c, 0xe58, 0xe14, 0xdd0, 0xd8c, 0xd48,
       0xd04, 0xcc0, 0xc7c, 0xc38, 0xbf4, 0xbb0, 0xb6c, 0xb28, 0xae4, 0xaa0,
       0xa5c, 0xa18, 0x9d4, 0x990, 0x94c, 0x908, 0x8c4, 0x880, 0x83c, 0x7f8,
       0x7b4, 0x770, 0x72c, 0x6e8, 0x6a4, 0x660, 0x61c, 0x5d8, 0x594, 0x550,
       0x50c, 0x4c8, 0x484, 0x440, 0x3fc, 0x3b8, 0x374, 0x330, 0x2ec, 0x2a8,
       0x264, 0x220, 0x1dc, 0x198, 0x154, 0x110, 0xcc, 0x88, 0x44, 0x0
    }
    ,
    
    // Sawtooth wave
    {
       0x22, 0x44, 0x66, 0x88, 0xaa, 0xcc, 0xee, 0x110, 0x132, 0x154,
       0x176, 0x198, 0x1ba, 0x1dc, 0x1fe, 0x220, 0x242, 0x264, 0x286, 0x2a8,
       0x2ca, 0x2ec, 0x30e, 0x330, 0x352, 0x374, 0x396, 0x3b8, 0x3da, 0x3fc,
       0x41e, 0x440, 0x462, 0x484, 0x4a6, 0x4c8, 0x4ea, 0x50c, 0x52e, 0x550,
       0x572, 0x594, 0x5b6, 0x5d8, 0x5fa, 0x61c, 0x63e, 0x660, 0x682, 0x6a4,
       0x6c6, 0x6e8, 0x70a, 0x72c, 0x74e, 0x770, 0x792, 0x7b4, 0x7d6, 0x7f8,
       0x81a, 0x83c, 0x85e, 0x880, 0x8a2, 0x8c4, 0x8e6, 0x908, 0x92a, 0x94c,
       0x96e, 0x990, 0x9b2, 0x9d4, 0x9f6, 0xa18, 0xa3a, 0xa5c, 0xa7e, 0xaa0,
       0xac2, 0xae4, 0xb06, 0xb28, 0xb4a, 0xb6c, 0xb8e, 0xbb0, 0xbd2, 0xbf4,
       0xc16, 0xc38, 0xc5a, 0xc7c, 0xc9e, 0xcc0, 0xce2, 0xd04, 0xd26, 0xd48,
       0xd6a, 0xd8c, 0xdae, 0xdd0, 0xdf2, 0xe14, 0xe36, 0xe58, 0xe7a, 0xe9c,
       0xebe, 0xee0, 0xf02, 0xf24, 0xf46, 0xf68, 0xf8a, 0xfac, 0xfce, 0xff0
    }
    ,
    
    // Square wave
    {
       0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff,
       0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff,
       0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff,
       0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff,
       0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff,
       0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff,
       0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
       0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
       0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
       0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
       0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
       0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
    }
    
    };
    
    #endif

    There are only small changes.

    while (Serial.available() > 2) {
    kind_of_data = Serial.read();
    if (kind_of_data == 'R' ) Rpm = Serial.read();
    }

    sample = map(Rpm, 0, 4095, 0, oneHzSample);

    This small code pieces i added read the rpm from gamedash and replace the pot value by the rpm. Note that with this code it an reach 1HZ. so maybe you start it first when you get some data of a running car which is always around 1000rpm.

    I hope you are fammilar with gamedash.

    I can't guarantee 100% that it's working and hope my post is not total garbage, but this should work for a first test.
    • Like Like x 4
    • Useful Useful x 1
  3. Alexey

    Alexey Well-Known Member

    Joined:
    Sep 23, 2014
    Messages:
    452
    Occupation:
    Electronics Technician
    Location:
    Adelaide, Australia
    Balance:
    8,060Coins
    Ratings:
    +620 / 2 / -0
    My Motion Simulator:
    3DOF, DC motor, Arduino
    Hey,

    Cheers man! I have an Arduino Due on the way so as soon as it arrives I will try out the code.
    I'll post a video later on that shows the bass shaker reacting to single frequencies.
    • Like Like x 2
  4. tombo

    tombo Active Member

    Joined:
    Oct 5, 2013
    Messages:
    269
    Location:
    Germany
    Balance:
    2,436Coins
    Ratings:
    +246 / 2 / -0
    My Motion Simulator:
    DC motor, Arduino
    Hello,
    looking forward to see your progress and hope it works as you would like :)

    I forgott one thing in upper code. The Serial prefix Variable isn't set. after int Rpm at the beginning of the code, you have to add "char kind_of_data;" or you'll get a compiling error.
  5. alejandroads

    alejandroads New Member

    Joined:
    Sep 3, 2017
    Messages:
    10
    Location:
    Unated States
    Balance:
    106Coins
    Ratings:
    +2 / 0 / -0
    My Motion Simulator:
    DC motor, Arduino
    Hello guys! I wondering if you have any code for using RPM to drive a motor using Arduino, for example in gamedash, obtain RPM and Arduino output PWM. Similar to Speed for have wind effect, on gamedash capture speed data and obtain in Arduino PWM to drive a motor. Anybody knows some code for that? (RPM to PWM )
    Cheers!
  6. noorbeast

    noorbeast VR Tassie Devil Staff Member Moderator Race Director

    Joined:
    Jul 13, 2014
    Messages:
    20,557
    Occupation:
    Innovative tech specialist for NGOs
    Location:
    St Helens, Tasmania, Australia
    Balance:
    145,160Coins
    Ratings:
    +10,780 / 52 / -2
    My Motion Simulator:
    3DOF, DC motor, JRK
    Game Vibe is currently being developed for SimTools and is in closed testing, here is the latest progress update from the dev @yobuddy: https://www.xsimulator.net/community/threads/simtools-2-2.10705/page-2#post-143955