- A+
最近有点事,一个星期没有写博客记录啦,其实遇到了不少有用的知识和小项目,没有写博客记录惭愧惭愧
废话不多说,我们进入正题:
这次我们用点灯科技来控制舵机的旋转
使用的还是我们的Arduino IDE,硬件的需求有esp8266 nodemcu以及一个舵机
1、为Arduino IDE添加点灯科技的库文件,具体操作看文章:
小爱同学脱离局域网远程控制开关?
2、上代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 |
#include <Servo.h> #define BLINKER_WIFI #include <Blinker.h> char auth[] = ""; //key char ssid[] = ""; //wifi名称 char pswd[] = ""; //wifi密码 // 新建组件对象 BlinkerButton Button1("btn-max"); //位置1 按钮 数据键名 BlinkerButton Button2("btn-min"); //位置2 按钮 数据键名 BlinkerButton Button3("btn-pw"); //循环模式 按钮 数据键名 开关模式 Servo myservo; BlinkerSlider Slider1("max-num"); //位置1 滑块 数据键名 范围1-180 BlinkerSlider Slider2("min-num"); //位置2 滑块 数据键名 范围1-180 BlinkerSlider Slider3("ser-num"); //实时位置 滑块 数据键名 范围1-180 BlinkerSlider Slider4("time-num"); //循环模式间隔时间 滑块 数据键名 范围单位毫秒 bool xunhuan_mode = false; int servo_max,servo_min,ser_num,time_num; void button1_callback(const String & state) { //位置1按钮 BLINKER_LOG("get button state: ", servo_max); myservo.write(servo_max); Blinker.vibrate(); } void button2_callback(const String & state) { //位置2按钮 BLINKER_LOG("get button state: ", servo_min); myservo.write(servo_min); Blinker.vibrate(); } void button3_callback(const String & state) { //位置3按钮 开关模式 // Blinker.vibrate(); if(state == "on"){ xunhuan_mode = true; Button3.print("on"); Blinker.delay(100); }else if (state == "off"){ xunhuan_mode = false; Button3.print("off"); Blinker.delay(100); } } void slider1_callback(int32_t value) { servo_max = value; Slider1.color("#1E90FF"); Slider1.print(); BLINKER_LOG("get slider value: ", value); } void slider2_callback(int32_t value) { servo_min = value; Slider2.color("#FFF8DC"); Slider2.print(); BLINKER_LOG("get slider value: ", value); } void slider3_callback(int32_t value) { ser_num = value; myservo.write(ser_num); Blinker.delay(100); BLINKER_LOG("get slider value: ", value); } void slider4_callback(int32_t value) { time_num = value; Blinker.delay(100); BLINKER_LOG("get slider value: ", value); } void xunhuan(){ myservo.write(servo_max); Blinker.delay(time_num/2); myservo.write(servo_min); Blinker.delay(time_num/2); } void setup() { Serial.begin(115200); BLINKER_DEBUG.stream(Serial); Blinker.begin(auth, ssid, pswd); Button1.attach(button1_callback); Button2.attach(button2_callback); Button3.attach(button3_callback); Slider1.attach(slider1_callback); Slider2.attach(slider2_callback); Slider3.attach(slider3_callback); Slider4.attach(slider4_callback); myservo.attach(5); //servo.attach():设置舵机数据引脚 myservo.write(10); //servo.write():设置转动角度 servo_max=70; servo_min=120; time_num=500; } void loop() { Blinker.run(); if(xunhuan_mode==true){ xunhuan(); } } |
这里说一下Servo库
- attach()
描述
将Servo变量附加到引脚,注意:在Arduino 0016及之前的版本上,Servo库仅支持将舵机连接至第9和第10脚上。
语法
servo.attach(pin)
servo.attach(pin, min, max)
参数说明
servo,一个类型为servo的变量
pin,连接至舵机的引脚编号
min(可选),舵机为最小角度(0度)时的脉冲宽度,单位为微秒,默认为544
max(可选),舵机为最大角度(180度时)的脉冲宽度,单位为微秒,默认为2400- write()
描述
向舵机写入一个数值,来直接控制舵机的轴。在一个标准的舵机中,这将设定齿轮的角度,将齿轮转到对应的位置。在一个连续旋转的舵机中,这将设置一个舵机的角度(0作为全速向一边,180为全速向另一边,在90附近的值为停止)。
语法
servo.write(angle)
参数说明
servo,一个类型为servo的变量
angle,写向舵机的角度,从0到180之间
然后这里设置的是GPIO引脚,而我们esp8266并没有标明GPIO编号
我们按照下面编号对应表进行设置:
所以我们设置的GPIO5就是我们的D1端口
接下来进行烧录,硬件连接
这里再说一下我们的舵机接线问题:
在我手上的小舵机有三根线:棕色、红色以及黄色
黄色线为数据线,接我们数据引脚D1
红色为正极:接正极供电
棕色为负极:接负极接地
3、点灯科技APP设备的按钮设置
进入我们的设备
以下是我设置好的按钮和滑块:
可以看到有三个按钮,四个滑块,具体怎么设置呢?
三个按钮我们都以下为模板设置:
数据键名和文本名称都在我们代码头部注释了,大家注意一下。
可以看到我设置的键名为btn-max,文本名称为位置1。
以及我们的位置2和循环模式都是这样设置的
接下来我们设置滑块:
我们一共有4个滑块,其中位置1、位置2以及实时位置的设置是一模一样的:
我们设置对应的文本名称以及键名,最小值为0,最大值为180,代表舵机转动的角度
我这里再说一下最后一个,循环时间的滑块设置,其实和前面三个滑块的设置一样,设置文本名称以及对应的数据键名。但是,这里的最大值最小值可以根据自己的需求来的,它代表的是循环的间隔时间,单位为毫秒。我设置了0-2000,最大的时候间隔时间为2000毫秒。
4、我们上电开机:
一开始我们可以看到舵机复位到初始位置
设备在线以后我们进入我们设置好的控制界面
将位置2的滑块设置到一下位置,再点击位置2的按钮,可以看到舵机转动了
剩下的按钮及功能大家自己去慢慢尝试吧