• 香橙派硬件PWM控制sg90舵机


    本人机械电子专业的大一学生一枚,这是我在博客园的第一篇随笔

      2024年4月份我在二手平台花费300大洋入手了香橙派zero3和3B,买回来后一开始是装上ubuntu跑QQ机器人和minecraft服务器的,所以虽然看到了板子上的40pin引脚,但当时并未立即探索其硬件扩展功能。几天后,好奇心驱使我深入了解这些引脚的用途,我开始研究香橙派的GPIO编程。故发表随笔来记录我的折腾之旅。

      180度舵机作为一种常见的执行机构,广泛应用于机器人关节控制、摄像头云台调整等场景。要驱动舵机,关键在于理解PWM(脉冲宽度调制)信号的生成与控制。不过在香橙派上使用wiringPi来输出PWM不需要像stm32一样去配置各种寄存器,还算是方便一些。

      我们需要以下函数来输出硬件PWM波(以香橙派3B为例)

    1 pinMode(int pin, int Mode); // 设置引脚为pwm输出,参数Mode为PWM_OUTPUT
    2 pwmSetClock(int pin,int divisor); // 参数divisor为div
    3 pwmSetRange(int pin,unsigned int range); // 参数range为arr
    4 pwmWrite(int pin, int value); // 参数value为ccr

       硬件PWM的频率是可调的,有适用于香橙派的计算公式

    频率 = 24000000 / (arr * div);
    占空比 = ccr / arr;

      下面写一个控制sg90舵机旋转到45度处的代码

    复制代码
    1 #include "wiringPi.h"
    2 #include 
    3 #define PWM_pin 21 
    4 //香橙派3B的硬件PWM输出引脚为wpi编号下的2和21号引脚,这里使用21号引脚
    5 int main()
    6 {
    7     int div = 8;
    8     int arr = 60000;
    9     int ccr = 3000;
    10    //频率= 24000000 / (60000 * 8) = 50Hz   sg90舵机要50Hz才能正常驱动
    11    if (wiringPiSetup() == -1) {printf("初始化失败惹>︿<");}
    12    pinMode(PWM_pin, PWM_OUTPUT);
    13    while (1)
    14    {
    15        pwmSetClock(PWM_pin, div);
    16        pwmSetRange(PWM_pin, arr);
    17        pwmWrite(PWM_pin, ccr);
    18        //占空比duty = ccr / arr = 5.0% 对应45度位置   
    19    }
    20 }
    复制代码

      保存,命名为main.c

      我是用vscode远程连接到香橙派3B的,在控制台输入gpio readall就可以看到香橙派3B的引脚定义图。使用cd命令进入代码所在文件夹,输入

    
    
    orangepi@orangepi3b:my-project/ $ gcc main.c -o test1 -lwiringPi

      然后再输入

    
    
    orangepi@orangepi3b:my-project/ $ sudo ./test1

      按照提示输入密码后就可以看到舵机转到了45度处

      python的代码和c语言版本大同小异,如下

    复制代码
     1 import wiringpi as pi
     2 from wiringpi import GPIO
     3 
     4 PWM_PIN = 21
     5 div = 8
     6 arr = 60000
     7 ccr = 4500
     8 if pi.wiringPiSetup() == -1:
     9     print("初始化失败惹>︿<")
    10 pi.pinMode(PWM_PIN,GPIO.PWM_OUTPUT)
    11 while True:
    12     pi.pwmSetClock(PWM_PIN, div)
    13     pi.pwmSetRange(PWM_PIN, arr)
    14     pi.pwmWrite(PWM_PIN, ccr) # duty = 7.5% 对应 90度
    复制代码

      保存为main.py 然后以管理员身份执行

       python3 main.py

       是可以看到舵机转到了90度位置处

  • 相关阅读:
    vpn概述总结
    极大似然估计,最大后验概率等比较不错的文章
    力扣-234-回文链表
    Arch Linux 2208设置静态IP地址
    6-1 CCat类的静态数据【武汉理工大学】
    无重复字符的最长子串
    [开发|鸿蒙] 鸿蒙OS开发环境搭建(笔记,持续更新)
    Windows PHP 将 WORD转PDF,执行完成后 释放进程
    Qt报错: error: C2001: 常量中有换行符,解决QT运行时有中文乱码
    ccf序列查询新解python满分_纯数学规律(学霸怎么想到的啊......)
  • 原文地址:https://www.cnblogs.com/ouyanglingle/p/18203836