Baize_Servo8266-(arduino32路舵机驱动板)(开源可自制,附程序和固件以及烧录方法)

导航在这里:白泽六足机器人_arduino_v1

介绍

先放资料

github:GitHub - Allen953/Baize_ServoDriver_esp8266

立创开源地址:https://oshwhub.com/allen-liu/esp8266-pca9685-di-32-lu-duo-ji-kuo-zhan-ban

B站演示地址:https://www.bilibili.com/video/BV1u34y1Y7PG?spm_id_from=333.999.0.0

QQ:953598974.如果你想要自己做这块板子的话,可以找我免费送空板,付个快递费就可以,自己焊接完就可以用了。 

效果

arduino 32路舵机驱动板(开源)

这是一块32路舵机驱动板,做舵机机器人非常方便。主控用的esp8266.

电源用的5V的电池,电池直接给舵机供电,经过压降之后产生3.3V电压给esp8266模组供电。

这块板儿主要是用于控制sg90舵机,就是那种蓝色舵机,或者mg90s舵机。

后续会升级,升级后可以控制5-12V的pwm舵机。

这样就可以控制高压的舵机,比如型号为mg996r或mg995的舵机。

3D图片如下图所示:

实物图如下:

测试代码:

例程1:控制32路舵机匀速旋转从0-180度

/*******************************************************
   主板:Baize_ServoDriver_esp8266         开源链接:https://github.com/Allen953/Baize_ServoDriver_esp8266
   功能:控制32路舵机匀速旋转从0-180度
   引脚:SDA:21   SCL:22
   Designer: Allen
   E-mail:953598974@qq.com
   Date:2022-08-24
 *******************************************************/
  
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>
 
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
Adafruit_PWMServoDriver pwm1 = Adafruit_PWMServoDriver(0x41);
 
#define SERVOMIN  102               //0.5/20 * 4096 = 102
#define SERVOMAX  512               //2.5/20 * 4096 = 512
 
void setup() {
  Serial.begin(115200);
  Serial.println();
  Serial.println("16 channel Servo test!");
  
  pwm.begin();
  pwm1.begin();
  pwm.setPWMFreq(50);  // Analog servos run at ~50 Hz updates
  pwm1.setPWMFreq(50);  // Analog servos run at ~50 Hz updates

  delay(200);
  for(int i=0;i<16;i++)
  {
    pwm.setPWM(i, 0, SERVOMIN); // 驱动32路舵机转到0度
    pwm1.setPWM(i, 0, SERVOMIN);// 驱动32路舵机转到0度
  }
  delay(2000);
  for (uint16_t pulselen = SERVOMIN; pulselen < SERVOMAX; pulselen++) {
        for(int i=0;i<16;i++)
        {
          pwm.setPWM(i, 0, pulselen);
          pwm1.setPWM(i, 0, pulselen);
        }
        delayMicroseconds(200);
        ESP.wdtFeed();                    //喂狗防止复位
  }
}
 
void loop() {

}

 例程2:控制32路舵机匀速旋转从0-180度,再从180-0度

/*******************************************************
   主板:Baize_ServoDriver_esp8266         开源链接:https://github.com/Allen953/Baize_ServoDriver_esp8266
   功能:控制32路舵机匀速旋转从0-180度,再从180-0度
   引脚:SDA:21   SCL:22
   Designer: Allen
   E-mail:953598974@qq.com
   Date:2022-08-24
 *******************************************************/
  
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>
 
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
Adafruit_PWMServoDriver pwm1 = Adafruit_PWMServoDriver(0x41);
 
#define SERVOMIN  102               //0.5/20 * 4096 = 102
#define SERVOMAX  512               //2.5/20 * 4096 = 512
 
void setup() {
  Serial.begin(115200);
  Serial.println("16 channel Servo test!");
  
  pwm.begin();
  pwm1.begin();
  pwm.setPWMFreq(50);  // Analog servos run at ~50 Hz updates
  pwm1.setPWMFreq(50);  // Analog servos run at ~50 Hz updates
}
 
void loop() {
   for (uint16_t pulselen = SERVOMIN; pulselen < SERVOMAX; pulselen++) {
        for(int i=0;i<16;i++)
        {
          pwm.setPWM(i, 0, pulselen);
          pwm1.setPWM(i, 0, pulselen);
        }
        delayMicroseconds(200);
        ESP.wdtFeed();                    //喂狗防止复位
   }
   for (uint16_t pulselen = SERVOMAX; pulselen > SERVOMIN; pulselen--) {
        for(int i=0;i<16;i++)
        {
          pwm.setPWM(i, 0, pulselen);
          pwm1.setPWM(i, 0, pulselen);
        }
        delayMicroseconds(200);
        ESP.wdtFeed();                    //喂狗防止复位
   }
}

例程3:控制32路舵机从0,90,180,90,0度之间循环。

/*******************************************************
   主板:Baize_ServoDriver_esp8266         开源链接:https://github.com/Allen953/Baize_ServoDriver_esp8266
   功能:控制32路舵机从0,90,180,90,0度之间循环
   引脚:SDA:21   SCL:22
   Designer: Allen
   E-mail:953598974@qq.com
   Date:2022-08-24
 *******************************************************/
  
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>
 
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
Adafruit_PWMServoDriver pwm1 = Adafruit_PWMServoDriver(0x41);
 
#define SERVOMIN  102               //0.5/20 * 4096 = 102
#define SERVOMID  307              //(102+512)/2=307
#define SERVOMAX  512               //2.5/20 * 4096 = 512

//pwm.setPWM(i, 0, pulse);i=0~15对应第0-15个舵机;pwm1.setPWM(j, 0, pulse);j=0~15对应第16-31个舵机,
 
void setup() {
  Serial.begin(115200);
  Serial.println("16 channel Servo test!");
  
  pwm.begin();
  pwm1.begin();
  pwm.setPWMFreq(50);  // Analog servos run at ~50 Hz updates
  pwm1.setPWMFreq(50);  // Analog servos run at ~50 Hz updates
}
 
void loop() {
   //全部舵机转到0度
        for(int i=0;i<16;i++)
        {
          pwm.setPWM(i, 0, SERVOMIN);
          pwm1.setPWM(i, 0, SERVOMIN);
        }
        delayMicroseconds(200);
        ESP.wdtFeed();                    //喂狗防止复位
        delay(1000);
  //全部舵机转到90度
        for(int i=0;i<16;i++)
        {
          pwm.setPWM(i, 0, SERVOMID);
          pwm1.setPWM(i, 0, SERVOMID);
        }
        delayMicroseconds(200);
        ESP.wdtFeed();                    //喂狗防止复位
        delay(1000);
  //全部舵机转到180度
        for(int i=0;i<16;i++)
        {
          pwm.setPWM(i, 0, SERVOMAX);
          pwm1.setPWM(i, 0, SERVOMAX);
        }
        delayMicroseconds(200);
        ESP.wdtFeed();                    //喂狗防止复位
        delay(1000);
  //全部舵机转到90度
        for(int i=0;i<16;i++)
        {
          pwm.setPWM(i, 0, SERVOMID);
          pwm1.setPWM(i, 0, SERVOMID);
        }
        delayMicroseconds(200);
        ESP.wdtFeed();                    //喂狗防止复位
        delay(1000);
}

 例程4:板子连到手机热点

手机需要开一个热点,名字:"Baize",密码:"baizerobot"。

然后上传这个程序到板子上,在手机上就能看到板子连到手机热点了。

//修改自:https://blog.csdn.net/wangke0809/article/details/70146378?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163566195516780261935125%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=163566195516780261935125&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-2-70146378.first_rank_v2_pc_rank_v29&utm_term=esp8266%E4%B8%B2%E5%8F%A3%E9%80%8F%E4%BC%A0%E7%A8%8B%E5%BA%8F&spm=1018.2226.3001.4187
//原作者:wangke0809
#include <ESP8266WiFi.h>
#define MAX_SRV_CLIENTS 3   //最大同时联接数,即你想要接入的设备数量,8266tcpserver只能接入五个,哎
 
const char *ssid = "Baize"; 
const char *password = "baizerobot"; 
 
WiFiServer server(8266);//你要的端口号,随意修改,范围0-65535
WiFiClient serverClients[MAX_SRV_CLIENTS];
 
void setup()
{
    Serial.begin(9600);
    delay(10);
    pinMode(16, OUTPUT);
    digitalWrite(16, 0);
    WiFi.begin(ssid, password);
 
    while (WiFi.status() != WL_CONNECTED)
    {
        delay(500);
    }
    server.begin();
    server.setNoDelay(true);  //加上后才正常些
}
 
void loop()
{
    blink();
 
    uint8_t i;
    if (server.hasClient())
    {
        for (i = 0; i < MAX_SRV_CLIENTS; i++)
        {
            if (!serverClients[i] || !serverClients[i].connected())
            {
                if (serverClients[i]) serverClients[i].stop();//未联接,就释放
                serverClients[i] = server.available();//分配新的
                continue;
            }
 
        }
        WiFiClient serverClient = server.available();
        serverClient.stop();
    }
    for (i = 0; i < MAX_SRV_CLIENTS; i++)
    {
        if (serverClients[i] && serverClients[i].connected())
        {
            digitalWrite(16, 0);//有链接存在,就一直长亮
 
            if (serverClients[i].available())
            {
                while (serverClients[i].available()) 
                    Serial.write(serverClients[i].read());
            }
        }
    }
    if (Serial.available())
    {
        size_t len = Serial.available();
        uint8_t sbuf[len];
        Serial.readBytes(sbuf, len);
        //push UART data to all connected telnet clients
        for (i = 0; i < MAX_SRV_CLIENTS; i++)
        {
            if (serverClients[i] && serverClients[i].connected())
            {
                serverClients[i].write(sbuf, len);  //向所有客户端发送数据
                delay(1);
            }
        }
    }
}
 
 
void blink()
{
    static long previousMillis = 0;
    static int currstate = 0;
 
    if (millis() - previousMillis > 200)  //200ms
    {
        previousMillis = millis();
        currstate = 1 - currstate;
        digitalWrite(16, currstate);
    }
}

 例程5:发现(校验)板子上的iic设备

/*******************************************************
   主板:Baize_ServoDriver_esp8266         开源链接:https://github.com/Allen953/Baize_ServoDriver_esp8266
   功能:扫描IIC总线上挂载的设备
   引脚:SDA:21   SCL:22
   Designer: Allen
   E-mail:953598974@qq.com
   Date:2022-08-24
 *******************************************************/

#include <Wire.h>
 
void setup()
{
  Wire.begin();
  Serial.begin(115200);
}
 
void loop()
{
  byte error, address;
  int nDevices;
  Serial.println();
  Serial.println("Scanning...");
 
  nDevices = 0;
  for(address = 1; address < 127; address++ ) 
  {
    Wire.beginTransmission(address);
    error = Wire.endTransmission();
 
    if (error == 0)
    {
      Serial.print("I2C device found at address 0x");
      if (address<16) 
        Serial.print("0");
      Serial.print(address,HEX);
      Serial.println("  !");
 
      nDevices++;
    }
    else if (error==4) 
    {
      Serial.print("Unknown error at address 0x");
      if (address<16) 
        Serial.print("0");
      Serial.println(address,HEX);
    }    
  }
  if (nDevices == 0)
    Serial.println("No I2C devices found\n");
  else
    Serial.println("done\n");
  delay(5000);
}

 例程6:带电压监测的板子测试程序

升级版,主控esp32。供电范围5-12V。当我用7.4V的2S锂电池给舵机供电时,用这个程序来进行板子测试,由于测试时间较长,担心电池过放,所以通过电压监测,当电压过低时,将不再驱动舵机工作。

/*************************************************** 
 对于ARDUINO UNO,这时SCL->A5,SDA - >A4
 对于ESP8266,这时SCL->GPIO5,SDA - >GPIO4
  ****************************************************/
  
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>
 
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
Adafruit_PWMServoDriver pwm1 = Adafruit_PWMServoDriver(0x41);
 
#define SERVOMIN  102               //0.5/20 * 4096 = 102
#define SERVOMAX  512               //2.5/20 * 4096 = 512
//pcb板测试时,如果是2S的锂电池供电,则以此电压为阈值,低于此电压时,不再驱动舵机运动,保护电池。
float voltage_threshold = 6.5;
int voltage_testpin = 26;
float voltage_b = 0.0;

bool servo_f = 1;





void setup() {
  Serial.begin(115200);
  Serial.println();
  Serial.println("16 channel Servo test!");
  
  pwm.begin();
  pwm1.begin();
  pwm.setPWMFreq(50);  // Analog servos run at ~50 Hz updates
  pwm1.setPWMFreq(50);  // Analog servos run at ~50 Hz updates
 
  delay(200);
  for(int i=0;i<16;i++)
  {
    pwm.setPWM(i, 0, SERVOMIN); // 驱动32路舵机转到0度
    pwm1.setPWM(i, 0, SERVOMIN);// 驱动32路舵机转到0度
  }
  delay(2000);
  for (uint16_t pulselen = SERVOMIN; pulselen < SERVOMAX; pulselen++) {
        for(int i=0;i<16;i++)
        {
          pwm.setPWM(i, 0, pulselen);
          pwm1.setPWM(i, 0, pulselen);
        }
        delayMicroseconds(200);
  }
}
 
void loop() {
  if(servo_f==1)
  {
        for (uint16_t pulselen = SERVOMIN; pulselen < SERVOMAX; pulselen++) {
              for(int i=0;i<16;i++)
              {
                pwm.setPWM(i, 0, pulselen);
                pwm1.setPWM(i, 0, pulselen);
              }
              delayMicroseconds(200);
        }
        //电压检测
        int voltage_sum = 0.0;
        for(int i=0;i<10;i++)
        {
          voltage_sum += float(analogRead(voltage_testpin))/4095.0*3.3*4.0;
          Serial.println(analogRead(voltage_testpin));
          delay(100);
        }
        voltage_b = voltage_sum / 10.0;
        Serial.println(voltage_b);
        if(voltage_b<voltage_threshold)
        servo_f = 0;
        
        for(int i=0;i<16;i++)
        {
          pwm.setPWM(i, 0, SERVOMIN); // 驱动32路舵机转到0度
          pwm1.setPWM(i, 0, SERVOMIN);// 驱动32路舵机转到0度
        }
        delay(2000);
  }

 
}

例程7:串口控制舵机角度

/*******************************************************
   主板:Baize_ServoDriver_esp8266         开源链接:https://github.com/Allen953/Baize_ServoDriver_esp8266
   功能:串口输入角度,板子驱动舵机转到该角度
   引脚:SDA:21   SCL:22
   Designer: Allen
   E-mail:953598974@qq.com
   Date:2022-08-24
 *******************************************************/
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>
 
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();               //驱动1~16或(0~15)号舵机
Adafruit_PWMServoDriver pwm1 = Adafruit_PWMServoDriver(0x41);          //驱动17~32或(16~31)号舵机

//#define SERVOMIN  102               //0.5/20 * 4096 = 102
//#define SERVOMID  307               //1.5/20 * 4096 = 307
//#define SERVOMAX  512               //2.5/20 * 4096 = 512
//实际测试
#define SERVOMIN  102               
#define SERVOMID  327               
#define SERVOMAX  552               

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);

  pwm.begin();
  pwm1.begin();
  pwm.setPWMFreq(50);  // Analog servos run at ~50 Hz updates
  pwm1.setPWMFreq(50);  // Analog servos run at ~50 Hz updates
  
}

void loop() {
  // put your main code here, to run repeatedly:
  while(!(Serial.available()>0))ESP.wdtFeed();//喂狗防止复位
  int pwmsum=Serial.parseInt();

  for(int i=0;i<16;i++)
  {
    pwm.setPWM(i, 0, pwmsum);
  }
  pwm1.setPWM(0, 0, pwmsum);
  pwm1.setPWM(1, 0, pwmsum);
  delay(100);
}

固件烧录

有些小伙伴没有安装好arduino ide或者没有安装好esp8266的硬件支持包,这个时候呢,就没法编译程序进行烧录了。

所以我在资料文件夹里面放上了编译好的固件,咱们就无需编译直接使用烧录工具就可以把固件给烧录到板子上了。

找到烧录工具并打开

 打开烧录程序

选中com口

 点击齿轮选中要烧录的固件(.bin格式),填写烧录地址,并在要烧录的固件前面打勾。

 选择上传的波特率,flash大小,flash速度等。

 然后点击flash进行烧录,烧录完成后,进度条会跑满,左下角会出现绿色打勾符号。

 按一下板子上的rst按键,重启板子,程序就开始执行了。

我遇到的问题

1.插电脑不出com口,怎么操作都没用

ch340芯片焊错了,焊成了ch340g芯片,导致usb-ttl芯片无法正常工作。

2.插电脑不出com口,按住rst按键会出com口,松开又消失

原因是台式机电脑前面的usb口能供应的电流太小了,带不起来板子。

当按住rst的时候,esp8266模组这个时候相当于是关机了,esp8266模组不工作的时候,整个板子自然功耗下降下来,然后ch340c芯片工作正常,这样一来电脑就出com口了。

而一旦松开rst,这个时候esp8266模组要开始工作,板子功耗又起来了,usb口带不动过载了,所以ch340c芯片无法正常工作,com口就消失了。

  • 6
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
我们提供的程序和上位机每个动作组里规定只能储存255个动作,超过这个限制的动作不会运行。 如果想要增加动作请按照以下步骤执行。 1、将要编写的动作分成多个动作组编写,如当一个动作组编了255个动作时,保存文件,然后在新的动作组里开始继续编写,如此类推。 2、打开程序源码,在App.C源码里找到如下代码处 这里的意思是当我们把编写好的动作下到100号动作组里,然后按控制上的按键1就会执行这个动作,这个100参数我们可以进行修改,如果修改了记得下载的时候需要把动作下载到修改后的动作组里,这样按按键时才会执行。 3、当我们完成了上一步的修改后,我们还需要在另外一个地方进行修改,如下图 我们在此处增加了一个判断当100号(如果我们上一步修改了100这个数值,此处也要修改)动作组执行完后,继续执行101号动作组,这个101也可以进行修改,同样的我们需要把动作组下到101号里,如果进行修改了就下到修改后的动作组里。到这里大家应该明白了增加动作的方法,按照这个方法我们可以再往下添加动作,如 规律大家应该看明白了就是前面执行的动作组是下一个将要执行动作组的判断条件,客户修改的时候一定要注意。 4、到此我们就完成了对动作的增加操作,最后我们还需要对程序进行编译 我们点击上图中的红框图标,等编译完 如果编译完没有错误就表明程序可以运行了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Allen953

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值