USB Host shield - create an Arduino based foot controller for a multi-effects guitar pedal (no midi just raw USB data)

Hi Everyone, I'm new to Arduino but have been a software developer for a long time. I have a project in mind that I know is going to be quite a challenge but am willing to learn. The project involves creating patch switching controller for a multi-effects guitar processor with no midi support, it does however have a USB interface that can be used to program patches from a PC.

What I want to achieve is similar to a midi foot controller but the difference is that I want to send USB data instead. I have written a Windows Forms application in C# that sends raw data to it and works like a charm, I would like to reproduce the same functionality with hardware using Arduino as a host and buttons to send the raw data to the device.

Am I correct in to assume that this would require a USB Host shield and is this feasible or am I just dreaming in technicolor?

I think we need more information about such communication. What is that pedal, and how do you "see"/open the USB connection (is it mapped as a serial port?) and how you send the data to the multi-effect pedal?
Maybe the C# code could somehow help us.

The pedal is a Mooer GE150, my PC reads it as a HID device not serial. In my C# code, I am using a library called HID USB DRIVER by Florian Leitner, the method that I am using to create the data to transmit is as follows:

public byte[] GetPatchCommand(int number)
        {
            byte[] start = { 0x08, 0xaa, 0x55, 0x02, 0x00, 0x96 };

            byte[] end = { 0x80, 0x98, 0x00, 0x00, 0x00, 0x00,
                    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                    0x00, 0x00, 0x00
                };
            List<byte> startList = start.ToList();
            List<byte> endList = end.ToList();
            List<byte> patchList = new List<byte>();
            patchList.AddRange(startList);
            if (number > 1 && number < 201)
            {
                byte[] numbers = {
                0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a
                ,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,0x14
                ,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e
                ,0x1f,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28
                ,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,0x30,0x31,0x32
                ,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x3b,0x3c
                ,0x3d,0x3e,0x3f,0x40,0x41,0x42,0x43,0x44,0x45,0x46
                ,0x47,0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,0x50
                ,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5a
                ,0x5b,0x5c,0x5d,0x5e,0x5f,0x60,0x61,0x62,0x63,0x64
                ,0x65,0x66,0x67,0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e
                ,0x6f,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78
                ,0x79,0x7a,0x7b,0x7c,0x7d,0x7e,0x7f,0x80,0x81,0x82
                ,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8a,0x8b,0x8c
                ,0x8d,0x8e,0x8f,0x90,0x91,0x92,0x93,0x94,0x95,0x96
                ,0x97,0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f,0xa0
                ,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa
                ,0xab,0xac,0xad,0xae,0xaf,0xb0,0xb1,0xb2,0xb3,0xb4
                ,0xb5,0xb6,0xb7,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,0xbe
                ,0xbf,0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8};
                patchList.Add(numbers[number]);
            }
            else
            {
                patchList.Add(0x01);
            }
            patchList.AddRange(endList);
            return patchList.ToArray<byte>();
        }

Then on my buttons I call a private the following method:

private void btn_patch_1_Click(object sender, EventArgs e)
        {
            currentPatch = currentBank[0];
            byte[] patch = Helper.GetPatchCommand(currentPatch);
            setPatchNumber(currentPatch);
        }

The actual method that "writes the data" is this:

private void setPatchNumber(int patchNumber)
        {
            byte[] patch = Helper.GetPatchCommand(patchNumber);
            usb.write(patch);
            setLabel(currentPatch);
        }

When drilling down into the actual library code, it has a pointer to this method at the report level:

[DllImport("kernel32.dll")]
        static public extern int WriteFile(int hFile, ref byte lpBuffer, int nNumberOfBytesToWrite, ref int lpNumberOfBytesWritten, int lpOverlapped);

I don't need to do a deep dive into this, all I really need to know is if a USB Host shield will be able to send out raw data to a HID device and if there's a library that will allow me to send this data through it.

Sorry, I have never had to do with HID devices, but it seems USB Host shields and Arduino HID library can talk with HID devices. Have a look HERE just to start, it's a "retired" USB host shield but I suppose the same applies to any other "compatible" USB host shield.
I'd give it a try but (the shield is not expensive...) I don't know it'll be somehow hard to handle if you have no experience with Arduino. Sorry can't help you more than this.

Thanks for your reply, I'll give it a read. I know it will be challenging to implement but that's sort of why I took on this project to begin with, it will push me to learn.

It is my understanding that:-
Continuing the discussion from Arduino (non-DUE) as a USB Host?:

Hey Grumpy_Mike, I hadn't seen that discussion.... thanks for pointing it out to me, I'll definitely look into it.

Cheers!

Similar projects on github for other guitar amps. One uses a USB host shield. The other uses a Teensy 3.6.

If you are after none Arduino boards consider this one. It is based on a PIC processor, and there are plenty of software examples of software that does other USB host stuff, not just MIDI.

and also

and also

Thanks again for the reply, will definitely look into these as well.

Interesting, however both of these use Midi... looking for USB communications between two devices. Thanks for the suggestion though, will have a peek at the code.

I do not understand your distinction between MIDI and USB. MIDI messages can be sent over Bluetooth, WiFi, Ethernet, and USB, as well as 5-pin DIN. HID messages can be sent over USB and Bluetooth.

If your amp/effects box uses HID over USB, then the USB host libraries (USB Host Shield Library and Teensy USBHost_t36) are capable of doing HID over USB. Take a look at the library examples.

The pedal on my PC is not recognized as a MIDI USB device but rather an HID device. This is the reason why I am looking to send RAW data. But by the looks of it, yeah, a USB Host Shield along with the Libraries should do the trick. Thanks for your reply.

Ok, finally got my hands on a USB host shield after about a month's wait but I think it's defective, at first, it wouldn't initialize so I followed the instructions on this video (ARDUINO USB HOST SHIELD NO POWER FIX - YouTube). I loaded a sample HID Device Descriptor sketch changing the baud rate to 9600 so I could monitor the events, now every time I plug something in or unplug, it stays in a state of waiting. I do not see any changes when I reset it either. Could this be an issue with the USB input jack?

So which one did you get?

Got this one:

Had bought a similar one from Wish and I fried it following my last post. I still need to apply the No Power Fix, once that's done, I'll look at getting the device descriptor for my pedal and see if I can access the interfaces.

This one doesn't work either... throwing in the towel, have better things to do with my time than to fight with this stuff and waste my money. Thanks for all the comments guys, guess this was just not in the cards.

I've put together the guts of one, which is knocking around somewhere, based on https://github.com/vegos/ZoomG3_ArduinoMIDI. Can't lay my hands on it at the moment. It was ages ago so I'm pretty sure it would have been a Uno with a USB host shield. A Due will act as a USB host if you want to spend, or you could do it cheaply with a Pro Micro - https://www.musiconerd.com/arduino-pro-micro-as-a-usb-midi-device-midiusb-library-and-change-its-name-to-whatever-you-wan/

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.