How to configure Maestro channel input via serial commands

On page 43 of the Maestro manual, it says the serial interface implements a “Get Position” command that can be used to read the value of a channel when it’s configured as an input. However, there’s no corresponding serial command to actually set a channel to an input, or even enable a channel. Am I missing something?

How do you enable a channel and configure it as an input via the serial commands?

Hello.

The mode of the Maestro channels cannot be configured through serial commands. The easiest way to configure them is through the Maestro Control Center. Alternatively, the UscCmd utility can take a Maestro settings file as an input and apply the settings to the Maestro, but it is not particularly easy to write or edit a Maestro settings file manually. UscCmd uses the Maestro’s native USB interface rather than the virtual COM ports. The source code for it is in C# and can be found in the Pololu USB SDK.

A channel configured as an input is always enabled. For channels configured as “Servo”, you can enable the channel by sending it a “Set Target” command and disable it by sending a “Set Target” command with a target position of 0.

-Brandon

Hello Brandon,

Is there a way to configure a channel to input mode in C#? Like for example :

maestro.SetInputMode(2, InputMode.Digital)

I am using a trigger system which sends a digital signal to maestro, I connected one of the wires of ‘trigger out’ of this trigger system to the channel 2 signal port and another black wire to the minus port of the same channel. I would like it to recieve the trigger on this channel and perform certain actions,

public event EventHandler TriggerReceived; // Define the TriggerReceived event

public MaestroController(MainWindow mainWindow)
        {
            this.mainWindow = mainWindow; // Store a reference to the MainWindow instance
             // Initialize the event handler for trigger reception
            TriggerReceived += Maestro_TriggerReceived;

        }

public virtual void OnTriggerReceived()
        {
            if (servoController.IsConnected)
            {
                // Check if the event has subscribers (is not null)
                if (TriggerReceived != null)
                {
                    TriggerReceived?.Invoke(this, EventArgs.Empty);
                    MessageBox.Show("Trigger received ontriggerrecieve()!");
                }
            }
        }

private void Maestro_TriggerReceived(object sender, EventArgs e)
        {
            mainWindow.allowTrigger = true;
            OnTriggerReceived();

          //rest of my code

how should i program so that channel 2 receives the external signal and it triggers to perform an action each time?

Ps : I want the program similar to ‘attach interupts’ like in arduino

Best regards,
Vedha

Hello.

I am not entirely following what you are trying to do, but it sounds like you just want channel 2 to be an input the whole time. If that’s the case, is there a reason you cannot just configure channel 2 as an input from the “Channel Settings” tab of the Maestro Control Center beforehand?

Brandon

Hello Brandon,

Yes I already configured channel 2 as the input in the Maestro Control Centre. I want to know if there’s a possibility to program interupts in C# to perform certain actions every time its triggered.

Previously I connected my trigger system that sends a voltage signal to arduino, arduino program interupts each time there’s a signal and keeps sending bytes to maestro, whenever maestro recieves the byte, it performs an action. This program works perfectly.

However to improve the speed, I want to connect the trigger signal directly to maestro without using arduino. I connected it to one of the channel, and configured that channel as input. Can you give me an idea on how to program in c# that each time this channel recieves a signal, it has to detect and perform an action?

Kind regards,
Vedha

The Maestro does not support interrupts on its inputs like that; you would have to have your code actively monitor the input pin status. Alternatively, you can write a Maestro script that continuously monitors that input and performs some action when it goes high, which might work for you depending on what you’re trying to have it do.

Brandon

1 Like

Thank you for the suggestion.

In Maestro control centre app, I configured channel 2 as the input and I could observe how the position kept fluctuating (0 to 255 in the position column) due to the trigger signal.

I added this code to the script in that app,

> # Monitor channel 2 for rising edge
> begin
>   2 get_position  # Read the value from channel 2
>   500 less_than   # Modify the threshold as needed
>   if
>     0xFF          # Send a serial command (change this to your desired command)
>     serial_send_byte
>   endif
> repeat

I applied the settings, ran the code and when I clicked on the compiled code in maestro app:

> 0000:                      -- # Monitor channel 2 for rising edge
> 0000:                      -- begin
> 0000: 02022E               --   2 get_position  # Read the value from channel 2
> 0003: 01F40128             --   500 less_than   # Modify the threshold as needed
> 0007: 070D00               --   if
> 000A: 02FF                 --     0xFF          # Send a serial command (change this to your desired command)
> 000C: 35                   --     serial_send_byte
> 000D:                      --   endif
> 000D: 060000               -- repeat
> 0010:                      -- 
> 
> Subroutines:
> Hex Decimal Address Name

So i guess it successfully compiled.

However in the C# code:

> public void InitializeSerialPort()
>         {
>             mySerialPort = new SerialPort("COM10");
> 
>             mySerialPort.BaudRate = 9600;
>             mySerialPort.Parity = Parity.None;
>             mySerialPort.StopBits = StopBits.One;
>             mySerialPort.DataBits = 8;
>             mySerialPort.Handshake = Handshake.None;
>             mySerialPort.RtsEnable = true;
> 
>             try
>             {
>                 mySerialPort.Open();
>                 MessageBox.Show("Serial port opened successfully.");
> 
>                 while (true)
>                 {
>                     // Read data from the Maestro.
>                     string data = mySerialPort.ReadLine();
>                     mainWindow.Log("Received data: " + data);
> 
>                     // Check if the received data matches the trigger command.
>                     if (data.Trim() == "0xFF")
>                     {
>                         // Rising edge detected, perform your action here.
>                         mainWindow.Log("Rising edge detected on channel 2. Perform your action.");
> 
>                         // You can add your action code here.
>                     }
>                 }
> 
>             }
>             catch (UnauthorizedAccessException ex)
>             {
>                 MessageBox.Show("Unauthorized access to the serial port. Check if the port is already in use by another application.");
>             }
>             catch (IOException ex)
>             {
>                 MessageBox.Show("An I/O error occurred while opening the serial port.");
>             }
>             catch (ArgumentException ex)
>             {
>                 MessageBox.Show("Invalid serial port settings or name.");
>             }
>         }

The BytestoRead in data seems to be zero in

> string data = mySerialPort.ReadLine();

I checked the com port, baud rate, serial settings etc. But not able to figure out

The Serial Send Byte command transmits the specified byte from the TTL serial output (i.e. the TX pin), so you will not receive it on the virtual COM port.

If you want to read the byte through USB, you could short the Maestro’s TX and RX pins together. Then, with your Maestro’s serial mode set to “USB Dual Port” you could read the byte through the TTL port. Alternatively, with your Maestro’s serial mode set to “USB Chained”, the commands you send the Maestro will be echoed back to the command port, along with the response from the Maestro.

You can find more information about the differences in the serial modes under the “Serial Settings” section of the Maestro user’s guide.

Brandon

Thank you, I will try your solution.

But you had suggested before that we can actively monitor the input pin status directly in C#, can you please tell me how the structure of that code could be?

If you’re using serial commands with the virtual COM port, you can use the “Get position” command to read the status of your input channel.

Brandon

1 Like