本人新入门人一枚,想用点灯科技控制esp8266控制两个舵机,但是3.3v带不动舵机,又添加了pca9685舵机控制板,找了资料没发现有先前的案例,但找了两个相似的代码,本人对代码不太了解,求兄弟帮我把两串代码整合一下
这是esp8266控制pca9685的代码
借鉴网址:https://blog.csdn.net/freewebsys/article/details/104139532
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>
// 这样调用时,它使用默认地址0x40
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
// 你也可以用你想要的其他地址呼叫它
//Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(0x41);
#define SERVOMIN 150 // 这是“最小”脉冲长度计数 (out of 4096)
#define SERVOMAX 600 // 这是“最大”脉冲长度计数 (out of 4096)
// our servo # counter
//uint8_t servonum = 0;
void setup() {
Serial.begin(9600);
Serial.println("16 channel Servo test!");
pwm.begin();
pwm.setPWMFreq(60); // 模拟伺服在~60 Hz更新时运行
}
// 如果您想设置脉冲长度(以秒为单位),可以使用此函数
// e.g. setServoPulse(0, 0.001) is a ~1 millisecond pulse width. its not precise!
void setServoPulse(uint8_t n, double pulse) {
double pulselength;//
pulselength = 1000000; // 1,000,000 us per second
pulselength /= 60; // 60 Hz
Serial.print(pulselength); Serial.println(" us per period");
pulselength /= 4096; // 12 bits of resolution 12
Serial.print(pulselength); Serial.println(" us per bit");
pulse *= 1000;
pulse /= pulselength;
Serial.println(pulse);
pwm.setPWM(n, 0, pulse);
}
void loop() {
// Drive each servo one at a time
//Serial.println(servonum);
for (uint16_t pulselen = SERVOMIN; pulselen < SERVOMAX; pulselen++) {
pwm.setPWM(0, 0, pulselen);
pwm.setPWM(1, 0, pulselen);
pwm.setPWM(2, 0, pulselen);
pwm.setPWM(3, 0, pulselen);
pwm.setPWM(4, 0, pulselen);
pwm.setPWM(5, 0, pulselen);
pwm.setPWM(6, 0, pulselen);
pwm.setPWM(7, 0, pulselen);
pwm.setPWM(8, 0, pulselen);
pwm.setPWM(9, 0, pulselen);
pwm.setPWM(10, 0, pulselen);
pwm.setPWM(11, 0, pulselen);
pwm.setPWM(12, 0, pulselen);
pwm.setPWM(13, 0, pulselen);
pwm.setPWM(14, 0, pulselen);
pwm.setPWM(15, 0, pulselen);
}
delay(500);
for (uint16_t pulselen = SERVOMAX; pulselen > SERVOMIN; pulselen--) {
pwm.setPWM(0, 0, pulselen);
pwm.setPWM(1, 0, pulselen);
pwm.setPWM(2, 0, pulselen);
pwm.setPWM(3, 0, pulselen);
pwm.setPWM(4, 0, pulselen);
pwm.setPWM(5, 0, pulselen);
pwm.setPWM(6, 0, pulselen);
pwm.setPWM(7, 0, pulselen);
pwm.setPWM(8, 0, pulselen);
pwm.setPWM(9, 0, pulselen);
pwm.setPWM(10, 0, pulselen);
pwm.setPWM(11, 0, pulselen);
pwm.setPWM(12, 0, pulselen);
pwm.setPWM(13, 0, pulselen);
pwm.setPWM(14, 0, pulselen);
pwm.setPWM(15, 0, pulselen);
}
delay(5000);
}
这是点灯科技通过esp8266控制舵机的代码
借鉴网址:https://blog.csdn.net/weixin_44695217/article/details/121429305?spm=1001.2014.3001.5502
//整体效果是:滑块控制舵机的位置(0~180),按下按键舵机到达指定位置。
//如果只是由滑块控制舵机详细操作见代码!
#include <Servo.h>
#define BLINKER_WIFI
#include <Blinker.h>
char auth[] = "d670f6a1ee59"; //点灯Key
char ssid[] = "Mi_5G"; //wifi名称
char pswd[] = "999999999"; //wifi密码
// 新建组件对象(按键+滑块)
BlinkerButton Button1("btn-max"); //位置1 按钮 数据键名
BlinkerButton Button2("btn-close");
BlinkerSlider Slider1("max-num"); //位置1 滑块 数据键名 范围0-180
Servo myservo;
int servo_max=180;
int servo_close=0;
void button1_callback(const String & state) { //位置1 按钮
BLINKER_LOG("get button state: ", servo_max);
myservo.write(servo_max);
digitalWrite(D3, HIGH);
Blinker.vibrate();
}
void button2_callback(const String & state) { //位置1 按钮
BLINKER_LOG("get button state: ", servo_close);
myservo.write(servo_close);
digitalWrite(D3, LOW);
Blinker.vibrate();
}
void slider1_callback(int32_t value)
{
BLINKER_LOG("get slider value: ", value);
servo_max = value;
Slider1.color("#1E90FF");
Slider1.print();
//digitalWrite(D3, value);
myservo.write(value);//如果包含这句,APP中的按键是不起作用的,只有滑块管用。
}
void setup() {
Serial.begin(115200);
BLINKER_DEBUG.stream(Serial);
Blinker.begin(auth, ssid, pswd);
Button1.attach(button1_callback);
Button2.attach(button2_callback);
Slider1.attach(slider1_callback);
myservo.attach(D2);
myservo.write(10);
pinMode(D3, OUTPUT);
}
void loop() {
Blinker.run();
}
其实可以在舵机控制引脚给个上拉电阻,提高驱动能力试试