我使用的是Goouuu-ESP32它自带了蓝牙模块所以不用再另外购买
此蓝牙的使用程序可参考https://blog.csdn.net/m0_46139849/article/details/107441056
#include <Arduino.h>
#include <WiFi.h>
#include "BluetoothSerial.h"
#if !defined(CONFIG_BT_ENABLED) || !defined(CONFIG_BLUEDROID_ENABLED)
#error Bluetooth is not enabled! Please run `make menuconfig` to and enable it
#endif
#define DJ0_PWM 13
#define DJ1_PWM 12
#define DJ2_PWM 14
#define DJ3_PWM 27
#define DJ4_PWM 25
#define DJ5_PWM 26
#define DJ6_PWM 33
#define DJ7_PWM 32
#define DJ8_PWM 21
#define DJ9_PWM 19
#define DJ10_PWM 22
#define DJ11_PWM 23
BluetoothSerial SerialBT;
char BT;
double d0 = 73.3,d3 = 95.3,d6 = 76.8,d9 = 76.8;
double x,z,BD,xB,zB,L1 = 57,L2 = 50,L3 = 61;
double duty0,duty1,duty2,duty3,duty4,duty5,duty6,duty7,duty8,duty9,duty10,duty11; // 占空比变量
//double dutyCycle0,dutyCycle1,dutyCycle2,dutyCycle3,dutyCycle4,dutyCycle5,dutyCycle6,dutyCycle7,dutyCycle8,dutyCycle9,dutyCycle10,dutyCycle11; // 设置占空比
double Initial_Alpha0,Initial_Beta0,
Initial_Alpha1,Initial_Beta1,
Initial_Alpha2,Initial_Beta2,
Initial_Alpha3,Initial_Beta3; //设置角度
int freq = 50;
int freq0 = freq; // 频率
int channel0 = 0; // 通道0,共16个通道,0~15
int resolution0 = 10; // 分辨率,取值0~20,duty最大取值为2^resolution-1
int freq1 = freq; // 频率
int channel1 = 1; // 通道1,共16个通道,0~15
int resolution1 = 10; // 分辨率,取值0~20,duty最大取值为2^resolution-1
int freq2 = freq; // 频率
int channel2 = 2; // 通道0,共16个通道,0~15
int resolution2 = 10; // 分辨率,取值0~20,duty最大取值为2^resolution-1
int freq3 = freq; // 频率
int channel3 = 3; // 通道0,共16个通道,0~15
int resolution3 = 10; // 分辨率,取值0~20,duty最大取值为2^resolution-1
int freq4 = freq; // 频率
int channel4 = 4; // 通道0,共16个通道,0~15
int resolution4 = 10; // 分辨率,取值0~20,duty最大取值为2^resolution-1
int freq5 = freq; // 频率
int channel5 = 5; // 通道0,共16个通道,0~15
int resolution5 = 10; // 分辨率,取值0~20,duty最大取值为2^resolution-1
int freq6 = freq; // 频率
int channel6 = 6; // 通道0,共16个通道,0~15
int resolution6 = 10; // 分辨率,取值0~20,duty最大取值为2^resolution-1
int freq7 = freq; // 频率
int channel7 = 7; // 通道0,共16个通道,0~15
int resolution7 = 10; // 分辨率,取值0~20,duty最大取值为2^resolution-1
int freq8 = freq; // 频率
int channel8 = 8; // 通道0,共16个通道,0~15
int resolution8 = 10; // 分辨率,取值0~20,duty最大取值为2^resolution-1
int freq9 = freq; // 频率
int channel9 = 9; // 通道0,共16个通道,0~15
int resolution9 = 10; // 分辨率,取值0~20,duty最大取值为2^resolution-1
int freq10 = freq; // 频率
int channel10 = 10; // 通道0,共16个通道,0~15
int resolution10 = 10; // 分辨率,取值0~20,duty最大取值为2^resolution-1
int freq11 = freq; // 频率
int channel11 = 11; // 通道0,共16个通道,0~15
int resolution11 = 10; // 分辨率,取值0~20,duty最大取值为2^resolution-1
struct ForwardKinematics //建立一个结构体用来存储计算后的角度值
{
double Alpha; //角度α
double Beta; //角度β
}h;
void Inverse_kinematics(double x,double z) //逆运动学计算公式
{
xB = 0;
zB = 1.732/2*L1;
if(x<0)
{
x = -x;
BD = sqrt(x*x+(z-zB)*(z-zB));
h.Alpha = 60+acos((x*x+BD*BD-(z-zB)*(z-zB))/(2*x*BD))*180/PI-acos((L2*L2+BD*BD-L3*L3)/(2*L2*BD))*180/PI;
h.Beta = acos((L2*L2+L3*L3-BD*BD)/(2*L2*L3))*180/PI;
}else if(x>0)
{
BD = sqrt(x*x+(z-zB)*(z-zB));
h.Alpha = 60+180-acos((L2*L2+BD*BD-L3*L3)/(2*L2*BD))*180/PI-acos((x*x+BD*BD-(z-zB)*(z-zB))/(2*x*BD))*180/PI;
h.Beta = acos((L2*L2+L3*L3-BD*BD)/(2*L2*L3))*180/PI;
}else
{
BD = z-zB;
h.Alpha = 150-acos((L2*L2+BD*BD-L3*L3)/(2*L2*BD))*180/PI;
h.Beta = acos((L2*L2+L3*L3-BD*BD)/(2*L2*L3))*180/PI;
}
}
void ledc_Initialization() //ledc初始化程序
{
ledcSetup(channel0, freq0, resolution0); // 设置通道0
ledcSetup(channel1, freq1, resolution1); // 设置通道1
ledcSetup(channel2, freq2, resolution2); // 设置通道2
ledcSetup(channel3, freq3, resolution3); // 设置通道3
ledcSetup(channel4, freq4, resolution4); // 设置通道4
ledcSetup(channel5, freq5, resolution5); // 设置通道5
ledcSetup(channel6, freq6, resolution6); // 设置通道6
ledcSetup(channel7, freq7, resolution7); // 设置通道7
ledcSetup(channel8, freq8, resolution8); // 设置通道8
ledcSetup(channel9, freq9, resolution9); // 设置通道9
ledcSetup(channel10, freq10, resolution10); // 设置通道10
ledcSetup(channel11, freq11, resolution11); // 设置通道11
ledcAttachPin(DJ0_PWM, channel0); // 将通道0与引脚13连接
ledcAttachPin(DJ1_PWM, channel1); // 将通道1与引脚12连接
ledcAttachPin(DJ2_PWM, channel2); // 将通道2与引脚14连接
ledcAttachPin(DJ3_PWM, channel3); // 将通道3与引脚27连接
ledcAttachPin(DJ4_PWM, channel4); // 将通道4与引脚26连接
ledcAttachPin(DJ5_PWM, channel5); // 将通道5与引脚25连接
ledcAttachPin(DJ6_PWM, channel6); // 将通道6与引脚33连接
ledcAttachPin(DJ7_PWM, channel7); // 将通道7与引脚32连接
ledcAttachPin(DJ8_PWM, channel8); // 将通道8与引脚21连接
ledcAttachPin(DJ9_PWM, channel9); // 将通道9与引脚19连接
ledcAttachPin(DJ10_PWM, channel10); // 将通道10与引脚23连接
ledcAttachPin(DJ11_PWM, channel11); // 将通道11与引脚22连接
}
void ledc_dutycycle0() //比较角度设置占空比
{
duty1 = 102.4; // 设置初始占空比
duty2 = 76.8; // 设置初始占空比
Initial_Alpha0 = 90; //设置初始角度
Initial_Beta0 = 90; //设置初始角度
if(h.Alpha>Initial_Alpha0)
{
duty1=duty1-(h.Alpha-Initial_Alpha0)*0.71;
}
if(h.Alpha<Initial_Alpha0)
{
duty1=duty1+(Initial_Alpha0-h.Alpha)*0.71;
}
if(h.Beta>Initial_Beta0)
{
duty2=duty2+(h.Beta-Initial_Beta0)*0.71;
}
if(h.Beta<Initial_Beta0)
{
duty2=duty2-(Initial_Beta0-h.Beta)*0.71;
}
}
void ledc_dutycycle1() //比较角度设置占空比
{
duty4 = 83.9; // 设置初始占空比
duty5 = 73.3; // 设置初始占空比
Initial_Alpha1 = 90; //设置初始角度
Initial_Beta1 = 90; //设置初始角度
if(h.Alpha>Initial_Alpha1)
{
duty4=duty4+(h.Alpha-Initial_Alpha1)*0.71;
}
if(h.Alpha<Initial_Alpha1)
{
duty4=duty4-(Initial_Alpha1-h.Alpha)*0.71;
}
if(h.Beta>Initial_Beta1)
{
duty5=duty5-(h.Beta-Initial_Beta1)*0.71;
}
if(h.Beta<Initial_Beta1)
{
duty5=duty5+(Initial_Beta1-h.Beta)*0.71;
}
}
void ledc_dutycycle2() //比较角度设置占空比
{
duty7 = 66.13; // 设置占空比
duty8 = 76.8; // 设置占空比
Initial_Alpha2 = 90; //设置初始角度
Initial_Beta2 = 90; //设置初始角度
if(h.Alpha>Initial_Alpha2)
{
duty7=duty7-(h.Alpha-Initial_Alpha2)*0.71;
}
if(h.Alpha<Initial_Alpha2)
{
duty7=duty7+(Initial_Alpha2-h.Alpha)*0.71;
}
if(h.Beta>Initial_Beta2)
{
duty8=duty8+(h.Beta-Initial_Beta2)*0.71;
}
if(h.Beta<Initial_Beta2)
{
duty8=duty8-(Initial_Beta2-h.Beta)*0.71;
}
}
void ledc_dutycycle3() //比较角度设置占空比
{
duty10 = 76.8; // 设置占空比
duty11 = 76.8; // 设置占空比
Initial_Alpha3 = 90; //设置初始角度
Initial_Beta3 = 90; //设置初始角度
if(h.Alpha>Initial_Alpha3)
{
duty10=duty10+(h.Alpha-Initial_Alpha3)*0.71;
}
if(h.Alpha<Initial_Alpha3)
{
duty10=duty10-(Initial_Alpha3-h.Alpha)*0.71;
}
if(h.Beta>Initial_Beta3)
{
duty11=duty11-(h.Beta-Initial_Beta3)*0.71;
}
if(h.Beta<Initial_Beta3)
{
duty11=duty11+(Initial_Beta3-h.Beta)*0.71;
}
}
void Write()
{
//左前自上而下
ledcWrite(channel0, d0); // 输出PWM,dutyCycle为占空比
ledcWrite(channel1, duty1); // 输出PWM,dutyCycle为占空比
ledcWrite(channel2, duty2); // 输出PWM,dutyCycle为占空比
//右前
ledcWrite(channel3, d3); // 输出PWM,dutyCycle为占空比
ledcWrite(channel4, duty4); // 输出PWM,dutyCycle为占空比
ledcWrite(channel5, duty5); // 输出PWM,dutyCycle为占空比
//左后
ledcWrite(channel6, d6); // 输出PWM,dutyCycle为占空比
ledcWrite(channel7, duty7); // 输出PWM,dutyCycle为占空比
ledcWrite(channel8, duty8); // 输出PWM,dutyCycle为占空比
//右后
ledcWrite(channel9, d9); // 输出PWM,dutyCycle为占空比
ledcWrite(channel10, duty10); // 输出PWM,dutyCycle为占空比
ledcWrite(channel11, duty11); // 输出PWM,dutyCycle为占空比
delay(5);
if (SerialBT.available()) //每执行一个动作都检测一次蓝牙串口是否接收到信息
{
BT = SerialBT.read();
}
}
void duty_Initialization() //动作初始化
{
//左前腿
ledcWrite(channel0, 73.3); // 输出PWM,dutyCycle为占空比
ledcWrite(channel1, 102.4); // 输出PWM,dutyCycle为占空比
ledcWrite(channel2, 76.8); // 输出PWM,dutyCycle为占空比
//右前
ledcWrite(channel3, 95.3); // 输出PWM,dutyCycle为占空比
ledcWrite(channel4, 83.9); // 输出PWM,dutyCycle为占空比
ledcWrite(channel5, 73.3); // 输出PWM,dutyCycle为占空比
//左后
ledcWrite(channel6, 73.2); // 输出PWM,dutyCycle为占空比
ledcWrite(channel7, 66.1); // 输出PWM,dutyCycle为占空比
ledcWrite(channel8, 76.8); // 输出PWM,dutyCycle为占空比
//右后
ledcWrite(channel9, 73.2); // 输出PWM,dutyCycle为占空比
ledcWrite(channel10, 76.8); // 输出PWM,dutyCycle为占空比
ledcWrite(channel11, 76.8); // 输出PWM,dutyCycle为占空比
delay(5);
}
void setup()
{
Serial.begin(115200);
SerialBT.begin("ESP32test"); //设置蓝牙名称
ledc_Initialization(); // ledc初始化程序
}
void loop()
{
duty_Initialization();
if (SerialBT.available())
{
BT = SerialBT.read();
}
delay(20);
if(BT=='1')
{
forward(); //动作前进
}
if(BT=='2')
{
backoff(); //动作后退
}
if(BT=='3')
{
turnleft(); //动作左转
}
if(BT=='4')
{
turnright(); //动作右转
}
}
相应的动作函数因为会占到大量篇幅所以程序中已经省略了
由于在执行动作的过程中需要不断检索蓝牙串口是否收到终止信息,所以需要占用一定的资源执行检索程序,很庆幸ESP32的性能足够,不过这里还是建议将检索程序写到定时器中断函数中去。
1. 查看Git的配置文件,可查看到用户名git config --listgit config--global user.name="huyan"可查看用户名和密码的设置2. set用户名密码,pull或push不用输入用户名和密码git remote -v 获取到远程的url, 然后将用户名和密码放在http://或https://之后,git remote s...
转载自:http://blog.itpub.net/25701553/viewspace-702957context这个词见得还是挺多的,尤其是在计算机领域。大部人将它翻译为上下文,我也就跟随大众吧。比如操作系统中的上下文切换等等。那么上下文到底意味着什么呢?在我看来就是当前程序运行的一个环境信息。举个例子说吧,当一个用户登录oracle之后就会有一个session,这个session中包含了
手算开平方【题目】如果没有计算机,你会手算开平方吗? 实际上,这不需要特殊的口诀,只要用普通的四则运算就足够了。比如求2的开方,你先猜一个数 p, 用 2 除以 p 得 q。假如正好猜中了,必然 p = q,如果没猜中,那么真实的值必定在 p, q 之间,下一次你就猜 (p+q)/2, 如此反复就可以很快达到很高的精度了。请编程模拟这个过程。从描述中可以感觉到是个递归的过程。haskell 处...
光纤到户(FTTH)技术为高速宽带接入到家庭用户提供了理想平台,而且给固定接入网和先进的无线网络带来了巨大益处,而PON(以太网无源光网络)作为光纤到户部署中的领先技术,现已广泛应用于网络部署中。PON以太网无源光网络的广泛应用离不开PON光模块,因为它是PON系统的重要组成部分。飞速(FS)在本文将介绍一些实用的PON光模块知识。什么是PON光模块?PON光模块的功能和作用是什么?PON光模块是用于PON系统的一种高性能光模块,也被称为PON模块,符合ITU-T G.984.2标准和多源协议(MS
前两天看程序,发现在某个函数中有下面这段程序:int n; //define a variable nint array[n]; //define an array with length n在我所学的C语言知识中,这种数组的定义在编译时就应该有问题的,因为定义数组时,数组的长度必须要是一个大于0的整型字面值或定义为 const 的常量
不管是使用RN还是使用Flutter,在创建项目的时候,都会在原生工程中进行一些依赖,但是iOS在使用CocosPod安装依赖包的时候不同的版本下载包的仓库是不一样的,所以经常会报如下的错误。DN: trunk URL couldn't be downloaded: https://cdn.jsdelivr.net/cocoa/Specs/3/2/5/FlipperKit/0.79.1/FlipperKit.podspec.json Response: 302 Found. Redirecting to
https://www.nowcoder.com/practice/75e878df47f24fdc9dc3e400ec6058ca正规解法(反转链表,通过调整链表指针达到反转链表)时间复杂度:O(n), 遍历一次链表空间复杂度:O(1)/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class Solution {public:
1、 相关性的作用a) 描述或规范特性与特性、特性值与特性值、特性与特性值之间的相互关系b) 控制超级BOM中项目的选择和超级工艺路线中工序的选择c) 对BOM和工艺路线的数据进行更改或计算2、 相关性的种类a) 前提条件:指满足什么条件才出现某个特性或特性值,应用于特性和特性值对象;如SFPS是否泼水和PSBL泼水剂
Python中的random模块用于生成随机数。下面介绍一下random模块中最常用的几个函数。random.randomrandom.random()用于生成一个0到1的随机符点数: 0 random.uniform random.uniform的函数原型为:random.uniform(a, b),用于生成一个指定范围内的随机符点数,两个参数其中一个是上限,一个是下限。如果a > b
一、Hadoop集群配置如下主机名IPJDK版本描述m1 192.168.142.1441.8.0_161 Hadoop集群2.7 NameNodes1 192.168.142.145 1.8.0_161 Hadoop集群2.7 DataNode1s2 192.168.142.1461.8.0_161 Hadoop集群2.7 DataNode2别忘了在/etc...
其实,这是因为链接库没有导入,导致很多的符号未曾定义。原文:https://blog.csdn.net/carrie0728/article/details/51836156VS+Qt+OpenGL最近一直再找VS+Qt+OpenGL的教程,终于找到了上面 Qt+OpenGL 的教程了,看了一下,觉得还不错,就跟着一步一步的来。由于我想在VS平台上运行,使用VS里面的Qt插件,所以有些地方还是有所不同的(如果你想配置一下VS+Qt,CSDN上有很多教程和资源哦!)。首先呢,说一个小问题,如果你跟着一
将oledb读取的excel数据快速插入的sqlserver中,很多人通过循环来拼接sql,这样做不但容易出错而且效率低下,最好的办法是使用bcp,也就是System.Data.SqlClient.SqlBulkCopy 类来实现。不但速度快,而且代码简单,下面测试代码导入一个6万多条数据的sheet,包括读取(全部读取比较慢)在我的开发环境中只需要10秒左右,而真正的导入过程只需要4.5秒。...