按照上图连线,按照如下代码烧程序。123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960#define Sin_1 A0 //设置变阻器1路电压采集端口为A0#define Sin_2 A1 //设置变阻器2路电压采集端口为A1#define Sin_3 A2 //设置变阻器3路电压采集端口为A2#define Sin_4 A3 //设置变阻器4路电压采集端口为A3#define Pout_1 2 //设置舵机PWM信号1路输出端口为D2#define Pout_2 3 //设置舵机PWM信号2路输出端口为D3#define Pout_3 4 //设置舵机PWM信号3路输出端口为D4#define Pout_4 5 //设置舵机PWM信号4路输出端口为D5int v1, v2, v3, v4; //定义采集模拟电压的存储变量int p1, p2, p3, p4; //定义PWM输出的脉宽变量unsigned long T_Start;void setup(){ pinMode(Pout_1, OUTPUT); //设置舵机接口为输出模式 pinMode(Pout_2, OUTPUT); //设置舵机接口为输出模式 pinMode(Pout_3, OUTPUT); //设置舵机接口为输出模式 pinMode(Pout_4, OUTPUT); //设置舵机接口为输出模式 p1 = 1500; p2 = 1500; p3 = 1500; p4 = 1500; //设置初始舵机输出的位置为中立位置}void loop(){ T_Start = micros(); //每次循环运行前,先采集当前的时间标志值 PWM_OUT(); //输出舵机的控制信号 Get_Input(); //采集模拟电压信号并转换为舵机角度对应的脉宽值 while((micros() - T_Start) <= 20000); //控制时间,保证每个循环占用20ms,满足驱动舵机的信号周期要求}void PWM_OUT(){ //由于绝大多数Arduino都不具备使用Servo库同时驱动4个舵机的功能 //所以,本函数采用高低电平延时方式,产生驱动4路舵机的功能 digitalWrite(Pout_1, HIGH); delayMicroseconds(p1); digitalWrite(Pout_1, LOW); digitalWrite(Pout_2, HIGH); delayMicroseconds(p2); digitalWrite(Pout_2, LOW); digitalWrite(Pout_3, HIGH); delayMicroseconds(p3); digitalWrite(Pout_3, LOW); digitalWrite(Pout_4, HIGH); delayMicroseconds(p4); digitalWrite(Pout_4, LOW);}void Get_Input(){ v1 = analogRead(Sin_1); //采集变阻器模拟电压 p1 = map(v1,0,1023,500,2500); //使用map函数,将采集的10位精度的电压的值域(0-1023),转换为舵机的脉宽数值(500-2500) v2 = analogRead(Sin_2); //采集变阻器模拟电压 p2 = map(v2,0,1023,500,2500); v3 = analogRead(Sin_3); //采集变阻器模拟电压 p3 = map(v3,0,1023,500,2500); v4 = analogRead(Sin_4); //采集变阻器模拟电压 p4 = map(v4,0,1023,500,2500); }
追问 : 为什么舵机 出来不是5V,而是6V
追答 : 因为舵机最好用6V供电,其实5V也可以。
但不建议把Arduino和舵机用一个电源供电,当舵机负载较大时,会拉低电压导致重启。