本人近期使用 nanopc-T4 开发板发现不支持 GPIO 库(已询问官方,明确回复不支持),无法通过 GPIO 简单便携的控制pwm输出,从而控制舵机的旋转,于是只能通过 wiringpi 库来简易控制,相关代码如下,如有不对,欢迎提出讨论。

本人近期使用 nanopc-T4 开发板发现不支持 GPIO 库(已询问官方,明确回复不支持),无法通过 GPIO 简单便携的控制pwm输出,从而控制舵机的旋转,于是只能通过 wiringpi 库来简易控制,相关代码如下,如有不对,欢迎提出讨论。

nanopc-T4 开发板,驱动舵机程序 (300->2400 逆时针转180度)

#include <wiringPi.h>
# include <stdio.h>
int main(void)
{
  wiringPiSetup() ;
  // 设置舵机的控制信号线 : 7
  pinMode (7, OUTPUT) ;
  int ZUOzuo=2400;
    for(;;){
    digitalWrite(7,HIGH);
    delayMicroseconds(ZUOzuo);
    digitalWrite(7,LOW);
    delayMicroseconds(ZUOzuo);

    if(ZUOzuo==300)
    {
        break;
    }
    ZUOzuo-=1;
    printf("%d\n", ZUOzuo);
    } 
}

ubuntu C语言 命令行输入参数 demo

#include <stdio.h>
int main(int argc, const char *argv[])
{
	int i = 0;
 
	printf("argc = %d\n",argc);
	
	for (i = 0; i < argc; i++ )
	{
	printf("argv[%d] = %s\n",i,argv[i]);
	}
	return 0;
}

C 语言编译命令:

gcc -Wall -o testInput testInput.cpp -lwiringPi -lwiringPiDev -lpthread -lrt -lm -lcrypt

命令行输入参数演示

nanopc笔记-1636982424058-20211115212024.png

命令行输入度数(10-170),舵机响应并旋转

// test.c
#include <wiringPi.h>
# include <stdio.h>
# include <stdlib.h>
// 接收一个输入度数
int main(int argc, const char *argv[])
{

int pat=200;
    int moveAngle=300;
    int num = atoi(argv[1]);
    // 判断度数的范围,并将度数转化为驱动值
    if(num<=180 && num>=0){
        // 驱动值为 300-2400,代表度数0-180
        moveAngle=300+11.7*num;
    }
    if(num<45){
        pat=500;
    }
    wiringPiSetup() ;
    //设置舵机控制引脚
    pinMode (7, OUTPUT) ;
    
    // 给舵机一段时间的反应,持续输出控制值
    for (int i = 0; i < pat; i++)
    {
    digitalWrite(7,HIGH);
    delayMicroseconds(moveAngle);
    digitalWrite(7,LOW);
    delayMicroseconds(2500-moveAngle);
    }
	printf("%d\n", moveAngle);
	printf("%d\n", num);
	printf("%d\n", pat);

	return 0;
}

// 执行命令,输入执行代码,并跟上需要旋转的度数(逆时针)
./test 90

python 调用 C 控制舵机旋转

c 程序

# 2py.c
#include <wiringPi.h>
# include <stdio.h>
# include <stdlib.h>
// 接收一个输入度数
int foo(int argc)
{

    int pat=200;
    int pinControl=7;
    int moveAngle=300;
    int num = argc;
    // 判断度数的范围,并将度数转化为驱动值
    if(num<=180 && num>=0){
        // 驱动值为 300-2400,代表度数0-180
        moveAngle=300+11.7*argc;

    }
    if(num<45){
        pat=500;
    }
    wiringPiSetup() ;
    //设置舵机控制引脚
    pinMode (pinControl, OUTPUT) ;
    
    // 给舵机一段时间的反应,持续输出控制值
    for (int i = 0; i < pat; i++)
    {
    digitalWrite(pinControl,HIGH);
    delayMicroseconds(moveAngle);
    digitalWrite(pinControl,LOW);
    delayMicroseconds(2500-moveAngle);
    }
	printf("%d\n", moveAngle);
	printf("%d\n", num);
	printf("%d\n", pat);
	printf("%d\n", pinControl);

	return 0;
}

c 程序编译时需要加上 -shared ,代表可以被分享
gcc -Wall -o 2py 2py.c -lwiringPi -lwiringPiDev -lpthread -lrt -lm -lcrypt -shared

python 程序 :

import ctypes  
ll = ctypes.cdll.LoadLibrary   
# 链接 C 
lib = ll("./2py") 
data = input("请输入1号舵机转动角度 ")
print(data)

lib.foo(int(data))  
print ('***finish***')