# gpio

Configure a `gpio` servo to integrate a hobby servo controlled by general-purpose input/output (GPIO) pins into your machine.

- [Attributes example](https://docs.viam.com/reference/components/servo/micro-rdk/gpio/#configure-a-gpio-servo-0)
- [JSON Template](https://docs.viam.com/reference/components/servo/micro-rdk/gpio/#configure-a-gpio-servo-1)
- [JSON Example](https://docs.viam.com/reference/components/servo/micro-rdk/gpio/#configure-a-gpio-servo-2)

The following attributes are available for `gpio` servos:

| Name                | Type   | Required? | Description                                                                                                                                             |
|---------------------|--------|------------|---------------------------------------------------------------------------------------------------------------------------------------------------------|
| `pin`               | string | **Required** | The GPIO number of the pin the servo’s control wire is wired to on the board.                                                                         |
| `board`             | string | **Required** | `name` of the [board](https://docs.viam.com/reference/components/board/) the servo is wired to.                                                        |
| `frequency_hz`     | int    | Optional   | The frequency of [PWM](https://docs.arduino.cc/learn/microcontrollers/analog-output) pulses sent to the servo, in Hertz ( _Hz_).<br>Default = 
[`300`] <br>Range = 
[`0`, `450`]  |
| `min_angle_deg`    | int    | Optional   | The minimum angle in degrees that the servo can reach.<br>Default = `0`<br>Range = 
[`0`, `180`]  |
| `max_angle_deg`    | int    | Optional   | The maximum angle in degrees that the servo can reach.<br>Default = `180`<br>Range = 
[`0`, `180`]  |
| `min_period_us`    | int    | Optional   | Override the safe minimum [PWM](https://docs.arduino.cc/learn/microcontrollers/analog-output) pulse width in microseconds.<br>Default: `500`         |
| `max_period_us`    | int    | Optional   | Override the safe maximum [PWM](https://docs.arduino.cc/learn/microcontrollers/analog-output) pulse width in microseconds.<br>Default: `2500`        |
| `pwm_resolution`    | int    | Optional   | The resolution of the [PWM](https://docs.arduino.cc/learn/microcontrollers/analog-output) driver (for example, the number of ticks for a full period).<br>Default: `0`    |

## PWM frequency and `esp32` boards

A `gpio` servo using a PWM pin leaves you with three remaining PWM frequencies for use on an `esp32`.
If the frequency of another PWM signal is unimportant, it can also be set to the same frequency as your servo.
See [PWM signals on `esp32` pins](https://docs.viam.com/reference/components/board/micro-rdk/esp32/#pwm-signals-on-esp32-pins) for more information.

#### Tip

Refer to your servo’s data sheet for [pulse-width modulation (PWM)](https://docs.arduino.cc/learn/microcontrollers/analog-output), rotation, and wiring specifications.

## Test the servo

After you establish the connection to your servo motor, open the servo’s **TEST** panel on the **CONFIGURE** or [**CONTROL**](https://docs.viam.com/monitor/default-interface/#web-ui) tabs. Use the buttons to move the servo motor to the desired angle.
