.. note:: Hello, welcome to the SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasts Community on Facebook! Dive deeper into Raspberry Pi, Arduino, and ESP32 with fellow enthusiasts. **Why Join?** - **Expert Support**: Solve post-sale issues and technical challenges with help from our community and team. - **Learn & Share**: Exchange tips and tutorials to enhance your skills. - **Exclusive Previews**: Get early access to new product announcements and sneak peeks. - **Special Discounts**: Enjoy exclusive discounts on our newest products. - **Festive Promotions and Giveaways**: Take part in giveaways and holiday promotions. 👉 Ready to explore and create with us? Click [|link_sf_facebook|] and join today! .. _1.3.2_js: 1.3.2 Servo ============ Introduction -------------- In this project, we will learn how to make the servo rotate. Required Components ------------------------------ In this project, we need the following components. .. image:: ../img/list_1.3.2.png It's definitely convenient to buy a whole kit, here's the link: .. list-table:: :widths: 20 20 20 :header-rows: 1 * - Name - ITEMS IN THIS KIT - LINK * - Raphael Kit - 337 - |link_Raphael_kit| You can also buy them separately from the links below. .. list-table:: :widths: 30 20 :header-rows: 1 * - COMPONENT INTRODUCTION - PURCHASE LINK * - :ref:`cpn_gpio_board` - |link_gpio_board_buy| * - :ref:`cpn_breadboard` - |link_breadboard_buy| * - :ref:`cpn_wires` - |link_wires_buy| * - :ref:`cpn_servo` - |link_servo_buy| Schematic Diagram ----------------- .. image:: ../img/image337.png Experimental Procedures ----------------------- **Step 1:** Build the circuit. .. image:: ../img/image125.png **Step 2**: Go to the folder of the code. .. raw:: html .. code-block:: cd ~/raphael-kit/nodejs/ **Step 3**: Run the code. .. raw:: html .. code-block:: sudo node servo.js After the program is executed, the servo will rotate from 0 degrees to 180 degrees, and then from 180 degrees to 0 degrees, circularly. **Code** .. code-block:: js const Gpio = require('pigpio').Gpio; SERVO_MIN_ANGLE = 0 SERVO_MAX_ANGLE = 180 SERVO_MIN_PULSE = 500 SERVO_MAX_PULSE = 2500 ServoPin = new Gpio(18,{mode: Gpio.OUTPUT}) function map(value, inMin, inMax, outMin, outMax){ return (outMax - outMin) * (value - inMin) / (inMax - inMin) + outMin } function angle2pulse(angle){ return Math.floor(map(angle,SERVO_MIN_ANGLE,SERVO_MAX_ANGLE,SERVO_MIN_PULSE ,SERVO_MAX_PULSE)) } let angle=90; let step=5; setInterval(() => { if(angle>=180||angle<=0){ step=-step } angle+=step; ServoPin.servoWrite(angle2pulse(angle)); }, 20); **Code Explanation** .. code-block:: js const Gpio = require('pigpio').Gpio; ServoPin = new Gpio(18,{mode: Gpio.OUTPUT}) Import the pigpio module and create an object of class Gpio, ServoPin, to control the output of Gpio18. .. code-block:: js SERVO_MIN_ANGLE = 0 SERVO_MAX_ANGLE = 180 SERVO_MIN_PULSE = 500 SERVO_MAX_PULSE = 2500 function map(value, inMin, inMax, outMin, outMax){ return (outMax - outMin) * (value - inMin) / (inMax - inMin) + outMin } function angle2pulse(angle){ return Math.floor(map(angle,SERVO_MIN_ANGLE,SERVO_MAX_ANGLE,SERVO_MIN_PULSE ,SERVO_MAX_PULSE)) } The function that maps the angle to the pulse width is defined here. This is because the servo control function ``servoWrite(pulseWidth)`` encapsulated in the Gpio class needs to write pulse width instead of angle. The angle range of the servo we use is 0~180, which needs to be mapped to the range of pulseWidth, 500~2500. .. code-block:: js let angle=90; let step=5; setInterval(() => { if(angle>=180||angle<=0){ step=-step } angle+=step; ServoPin.servoWrite(angle2pulse(angle)); }, 20); Let the servo angle deflect back and forth from 0 to 180. Phenomenon Picture ------------------ .. image:: ../img/image126.jpeg