This shows you the differences between two versions of the page.
| Next revision | Previous revision | ||
| en:iot-open:practical:hardware:sut:stm32:emb10_1 [2024/04/10 20:22] – created ktokarz | en:iot-open:practical:hardware:sut:stm32:emb10_1 [2024/04/10 22:09] (current) – [EMB10: Controlling standard servo] ktokarz | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | ====== STM_10: Controlling standard servo ====== | ||
| + | You will learn how to control a standard miniature servo with the STM32 System on Chip. Standard miniature analogue servo is controlled with a PWM signal of frequency 50Hz with a duty cycle period between 1 ms (rotate to 0) and 2 ms (rotate to 180 degrees), where 1.5 ms corresponds to 90 degrees. Some servos have other duty cycle minimum and maximum values, always refer to the documentation. | ||
| + | <note warning> | ||
| + | A servo has a red arrow presenting the gauge' | ||
| + | The servo is an example of a physical actuator. It requires some time to operate and change the position. Please give it time to set a new position between consecutive changes of the control PWM signal. Moreover, because of the observation via camera, too quick rotation may not be observable at all depending on the video stream fps. A gap of 2s between consecutive rotations is usually a reasonable choice. | ||
| + | ===== Prerequisites ===== | ||
| + | A good understanding of the PWM signal and duty cycle is necessary. In this scenario, we use built-in timers to control the PWM hardware channels of the STM32WB55 chip. In this case, we do not use any external library; instead, we use the hardware timer library built in the Arduino Core STM32 framework for STM32WB55 (stm32duino)((" | ||
| + | \\ | ||
| + | Some servos tend to go below 1 ms and above 2 ms to achieve a full 180-degree rotation range. For example, the servo in our laboratory (MG90/SG90) accepts values starting from 500 ms, and ending at 2500 ms. If there is a need for a high accuracy of rotation, it is possible to fine-tune the minimum and maximum duty cycle values. | ||
| + | |||
| + | ===== Suggested Readings and Knowledge Resources ===== | ||
| + | * [[en: | ||
| + | * [[en: | ||
| + | * [[en: | ||
| + | * [[en: | ||
| + | * [[en: | ||
| + | ===== Hands-on Lab Scenario ===== | ||
| + | |||
| + | ==== Task to be implemented ==== | ||
| + | Rotate the servo to the following angles: 0, 90, 180, 135, 45 and back to 0 degrees. | ||
| + | <note warning> | ||
| + | |||
| + | ==== Start ==== | ||
| + | In the laboratory equipment, the servo and the fan are connected to the same hardware timer instance. It means that both elements use the same base frequency of the PWM signal. If you use a fan and servo in the same project the frequency of the PMW signal needs to match the servo requirements. | ||
| + | \\ | ||
| + | The hardware timer library implements functions which allow us to control the duty cycle of the PWM signal and express it in different formats, including percentages. In the case of setting the PWM duty cycle expressed in percentages, | ||
| + | |||
| + | ==== Steps ==== | ||
| + | **Write your application all in the '' | ||
| + | <note warning> | ||
| + | === Step 1 === | ||
| + | Include Arduino and timer libraries, specific to STM32. The servo is controlled with GPIO PA_10 (the PA_10 name is the STM Nucleo naming convention). Define the pin name constant. | ||
| + | <code c> | ||
| + | #include " | ||
| + | #include < | ||
| + | #define SERVO_PWM_PIN PA0 | ||
| + | </ | ||
| + | |||
| + | We will also need some variables: | ||
| + | <code c> | ||
| + | // PWM variables definitions | ||
| + | TIM_TypeDef *SRVInstance; | ||
| + | uint32_t channelSRV; | ||
| + | HardwareTimer *MyTimServo; | ||
| + | </ | ||
| + | |||
| + | === Step 2 === | ||
| + | The hardware timer library uses internal timer modules and allows us to define channels attached to the timer. Channels represent the output pins connected to the hardware elements. Our laboratory board uses the same timer to control the servo and fan. In this example, we will use one channel for the servo only setting the proper PWM frequency of the timer. The channel connected to the servo controls the PWM duty cycle. | ||
| + | |||
| + | Create the timer instance type based on the servo pin: | ||
| + | |||
| + | <code c> | ||
| + | TIM_TypeDef *SRVInstance = (TIM_TypeDef *)pinmap_peripheral(digitalPinToPinName(SERVO_PWM_PIN), | ||
| + | </ | ||
| + | < | ||
| + | The same timer is used for the fan in the scenario STM_1A. | ||
| + | </ | ||
| + | |||
| + | Define the channel for servo: | ||
| + | <code c> | ||
| + | channelSRV = STM_PIN_CHANNEL(pinmap_function(digitalPinToPinName(SERVO_PWM_PIN), | ||
| + | </ | ||
| + | |||
| + | Instantiate HardwareTimer object. Thanks to ' | ||
| + | <code c> | ||
| + | MyTimServo = new HardwareTimer(SRVInstance); | ||
| + | </ | ||
| + | |||
| + | Configure and start PWM | ||
| + | <code c> | ||
| + | MyTimServo-> | ||
| + | </ | ||
| + | |||
| + | === Step 3 === | ||
| + | MG 90 servos that we use in our lab are specific. As mentioned above, to achieve a full 180-degree rotation range, their minimum and maximum duty cycle timings go far beyond standards. We will create a function for calculating the duty cycle for the servo with the angle as the input parameter. | ||
| + | |||
| + | <code c> | ||
| + | void fSrvSet(int pAngle) | ||
| + | { | ||
| + | if (pAngle< | ||
| + | if (pAngle> | ||
| + | int i_srv=500+(200*pAngle)/ | ||
| + | MyTimServo-> | ||
| + | }; | ||
| + | </ | ||
| + | === Step 4 === | ||
| + | Rotating a servo is as easy as calling our function with the desired angle as the parameter, e.g.: | ||
| + | <code c> | ||
| + | fSrvSet(90); | ||
| + | delay(2000); | ||
| + | </ | ||
| + | |||
| + | |||
| + | ===== FAQ ===== | ||
| + | |||
| + | **How do I know minimum and maximum values for the timings for servo operation? | ||
| + | **Would it be possible to control the servo and fan with the same program?**: Yes, but you have to remember that servo has very strict timing requirements. Because both elements share the same timer, they also share the same frequency which must be set according to the servo requirements. | ||
| + | |||
| + | ==== Result validation ==== | ||
| + | Observe the red arrow to rotate accordingly. Remember to give the servo some time to operate. | ||
| + | |||
| + | <WRAP noprint> | ||
| + | ===== Project information ===== | ||
| + | {{: | ||
| + | This Intellectual Output was implemented under the Erasmus+ KA2.\\ | ||
| + | Project IOT-OPEN.EU Reloaded – Education-based strengthening of the European universities, | ||
| + | Project number: 2022-1-PL01-KA220-HED-000085090. | ||
| + | |||
| + | **__Erasmus+ Disclaimer__**\\ | ||
| + | This project has been funded with support from the European Commission. \\ | ||
| + | This publication reflects the views of only the author, and the Commission cannot be held responsible for any use that may be made of the information contained therein. | ||
| + | |||
| + | **__Copyright Notice__**\\ | ||
| + | This content was created by the IOT-OPEN.EU Reloaded consortium, 2022, | ||
| + | The content is Copyrighted and distributed under CC BY-NC [[https:// | ||
| + | <figure label> | ||
| + | {{: | ||
| + | </ | ||
| + | </ | ||