Team:  Maximilian Schrapel, Michael Rohs
Jahr:  2019
Weitere Informationen


MultiWave is a fully configurable open-source function generator that can control an almost unlimited number of independent outputs. Its simple communication via USB, Bluetooth, or WiFi makes it suitable for many HCI applications. The high-precision 10-bit channel control even allows the use of bone conductors. Furthermore, any signal parameter, such as frequency, amplitude, signal shape, and even the phase between the outputs can be separately controlled. The ultra fast FPGA implementation allows latency times of 23 microseconds to update an output via UART at 2MBaud. Our expansion board provides 80 outputs which are powered by three LR18650 batteries for more than one hour with a total weight of 330g.


MultiWave can be controlled in many different ways. A UART interface can be emulated via USB. All configurations can then be transmitted via a simple terminal apllication using a few commands. The same protocol is used to transmit commands via WiFi or Bluetooth. For an easy start, we offer an API and GUI in Python 3 that not only controls all outputs, but can also group them. CSV files can be used to define own functions and loaded into the FPGA via our software. Advanced users can also adjust the number of outputs and all other parameters in the top level entity of the FPGA project. Experts can even use the left FPGA resources for other purposes and modify the implementation.  


Our hardware implementation in VHDL has been optimized for Intel FPGAs. It is therefore recommended to use a Intel Cyclone device. For an easy start we recommend the Cyclone V DE0-Nano-SoC kit from terasIC. Besides the possibility to use the Arduino header for communication via the serial interface, we offer our own PCB and the schematics to control 80 actuators. A battery power PCB mounted on the back of the device allows all outputs to be operated at full intensity with 120 mA for a period of more than one hour. A maximum current of 700 mA can be provided per output. For mobile use, we use a housing that is printed with a 3D printer and can be attached to a belt.


    •  Programming the DE0-Nano

    First the Quartus Prime 18 software has to be installed from here. The selection of the Cyclone V device support is sufficient. Depending on which Cyclone FPGA is used, older versions of the software must be installed. We have tested our implementation down to version 13.1 and the DE-2 Cyclone II development board. After pluggin in the DE0 device into the computer the next step is to open the installed programmer from the Quartus software directory and the DE0 user manual. In section 8 a detailed tutorial is described how to program the device. When adding a file navigate to the MultiWave project folder and select in the sub directory output_files MultiWave.sof. With the button hardware setup the device has to be selected and then programmed in the main window. Your DE0-Nano will now be ready to be used as function generator.

    • Set up hardware

    Due to the limitation that each output of the DE0-Nano provides only 20mA, the outputs must be amplified by transistors. For this purpose our driver board can provide up to 700mA per output. Simply dismount the plexiglas on the top of the DE0-Nano and plug in our driver board. On The bottom mount our mobile power board and then use a 10 pin flex cable to power the driver board. Both must be fastened with M3x10mm screws. Next set the power switch to off and plug in the LR 18650 batteries. When the power switch is on, a green LED should indicate that the batteries are charged. If a red LED is on, the batteries are discharged and the driver board is not powered. For the first use the Arduino software of the ESP32 must be programmed on the driver board. To do this, the ESP32 must be installed in the Arduino IDE. A tutorial can be found here.

    • Install MultiWave Software

    Now plug in a micro USB cable into the driver board and connect it to a PC. After driver installation Python 3 together with numpy and matplotlib must be installed. Then open a console and type python Plug in the USB cable to the driver board and PC then connect it via UART in the interface. Next the size of the grid must be specified. Then actuators can be grouped as desired and each group as well as actuator can be assigned an arbitrary function. A pattern designer at the bottom of the interface can be used to sequentially play arbitrary settings of all signal parameters.

    • Advanced: Define custom functions

    Open your favourite spreadsheet program (MS Excel or Libre Office Calc or others) and fill in 1024 Cells your desired values from 0 to 1023. Save the file in .csv or .txt format and open the MultiWave software. Click on the formula editor and load your file. The function is now transferred to MultiWave and can be used like all predefined functions.

    • Advanced: use Python 3 API

    For the easy use of MultiWave for own projects a class is provided for each connection. After calling the connect function the set methods can be used to set all parameters and the get methods to query them.

    • Expert: Configure FPGA parameters

    By default 80 outputs are used which corresponds almost to the maximum available GPIOs of the DE0-Nano. For custom designs this number can be extended by the top level parameter NUM_PORTS. The number of available functions is limited to 255 due to the communication protocol.

    • Expert: Soldering the MultiWave driver board

    It is recommended to use a heat gun to assemble all ICs. Especially the power drivers should be tested before the first use. All parts are available at mouser.

    • Expert: Communication protocol

    The communication with MultiWave has been optimized so that a few bytes are sufficient to make all configurations. A start byte indicates whether internal memories are to be written or function parameters are to be set. This is followed by the selection of the actuator and the function parameter to be changed. The parameter is confirmed by a final CLR+LF. For easy access via UART, programs such as hTerm are recommended.


Internal resources

Will be published upon acceptance


  • Bundle
  • All files included in one zip folder



  • VHDL implementation
  • The Quartus Prime project



  • Pre-compiled FPGA-files
  • Ready to use for the DE0-Nano SoC kit



  • Python 3 Software and API
  • Used to communicate with the FPGA



  • ESP32 Arduino communication software
  • Used to receive and transmit data from FPGA



  • Schematics
  • The Eagle schematics and board files



  • Casing
  • Laser cut files for 3mm acrylic glass


External resources



MultiGrid is an 80 channel vibrotactile display specially designed for MultiWave. It allows you to explore effects directly on the palm of your hand with our software. Like MultiWave, MultiGrid is also portable (220mm x 260mm) and can be controlled over MultiWave via Bluetooth, Wifi or UART. All actuators can be controlled individually and completely independently in all signal parameters (amplitude, frequency, signal shape and phase). No multiplexers or other components are used. Each actuator is driven directly via MultiWave with our expansion board. Over UART at 2MBaud all 80 actuators can be updated together with a total latency of less than 2ms. Additonal delays via Buetooth and Wifi differ depending on the signal quality. The 3mm x 10mm pancake actuators are embedded in 10mm thick neoprene in order to concentrate the vibration on one point. Due to the flexibility of neoprene, the grid can also be attached directly to the body or objects such as chairs for immersive multimedia applications. Velcro fastener on the back of MultiGrid also allows easy attachment to various surfaces.