兴趣爱好,喜欢玩单片机。先后折腾过51和STM32单片机。最近买了块ESP8266模块,一直以为ESP8266只是个WIFI模块,但是看了网上的资料后,发现这个不仅仅是个模块的功能,似乎拥有挺多单片机的功能。还有自己的编程方法,算了,不打算学太多。最近留意到这个模块支持Arduino,听说Arduino超级简单。不由得心动,想尝试一下。上网搜了一下,发现 Wemos 系列的开发板,倒是不贵,入手一块 Wemos D1.
从图片上看,这个板子资源挺丰富的,D0~D15个口,有IIC、SPI、串口、AD,真够霸气的了。
接下来安装Arduino,这个没啥好说的,按照网上的教程做就是的了。
1.打开Arduino IDE(楼主当前版本是1.6.13)-> 首选项 -> 附加开发板管理器网址,填入:http://arduino.esp8266.com/stable/package_esp8266com_index.json,重启一下IDE
2. 工具-> 开发板 -> 点击开发板管理器->滚到最下面 选择esp8266 by ESP8266 Community 版本选最新的就好。国内的网络呢,对国外的网站是有屏蔽的,慢慢弄,总是会弄好的。
然后就是跑程序啦!
第一个程序当然是点灯啦!
打开arduino的IDE界面,工具--》开发板 选择WeMos D1 R1,插上板子,看看计算机识别的串口是那个,板子上带了个CH340的usb转ttl的芯片,要先装好驱动。在 工具--》端口 选择好串口号。最后在 文件--》示例--》esp8266--》blink。一个点灯的程序就出来了。点击向右箭头的图标,就能编译上传了。一切都很顺利。8266模块的灯也开始闪烁了。
void setup() {
pinMode(LED_BUILTIN, OUTPUT); // Initialize the LED_BUILTIN pin as an output
}
// the loop function runs over and over again forever
void loop() {
digitalWrite(LED_BUILTIN, LOW); // Turn the LED on (Note that LOW is the voltage level
// but actually the LED is on; this is because
// it is active low on the ESP-01)
delay(1000); // Wait for a second
digitalWrite(LED_BUILTIN, HIGH); // Turn the LED off by making the voltage HIGH
delay(2000); // Wait for two seconds (to demonstrate the active low LED)
}
第一个程序搞定了,内心是激动的。心情是愉悦的。那么按照之前学习单片机的习惯,先要有控制欲,我要能控制一切IO口,一切IO口要为我所用。 例程中LED_BUILTIN,是谁?
肯定是个宏定义。在哪里定义?
我不知道!值是多少?这个不难,调试就好!
妮玛!没有调试。好吧!上网查,没查到。但是 有个串口的用法!很好,我把你打出来 就知道了。打印出来,值是2.好了,重新改写:
void setup() {
pinMode(2, OUTPUT); // Initialize the LED_BUILTIN pin as an output
}
// the loop function runs over and over again forever
void loop() {
digitalWrite(2, LOW); // Turn the LED on (Note that LOW is the voltage level
// but actually the LED is on; this is because
// it is active low on the ESP-01)
delay(1000); // Wait for a second
digitalWrite(2, HIGH); // Turn the LED off by making the voltage HIGH
delay(2000); // Wait for two seconds (to demonstrate the active low LED)
}
LED灯照亮无误,就是这么简单!哈哈!
然后信心满满的,找了个有限流的LED灯,接到了,D2上,然后 居然不亮,瞬间怀疑人生了,检查了几遍,就是不亮。改程序,换IO口,也不亮,为啥?冷静下来,上网找了一下,发现Arduino操纵IO口,是直接用数字,但是 Wemos D1的数字和IO口不对应!
WeMos中定义的arduino引擎编号其实是与ESP8266上的GPIO引擎编号对应.即:
16=D2;
14 = D5/D13;
12 = D6/D12;
13 = D7/D11;
15 = D10;
2 = D9;
4 = D4;
5 = D3;
0 = D8;
这算第一个坑,不过好在 经过测试,这些引脚都可以作为数字引脚输入与输出。难道以后 都要先查表,再通过数字 控制IO口?太不方便了,上网继续找答案,发现原来可以这样操纵 直接用 D0~D13。这样就是与板子上的资源对应了。
继续测试板子,从网上下载了超声波的程序,控制我的超声波模块,一次成功。再测试控制舵机,也是一次搞定。真心话,Arduino控制真的简单,简简单单几句话,超声波模块就能够用了,无论51、STM32都没能这么简单。Arduino不用管时间寄存器,打开串口也是拿来就用。
本以为这样就要一帆风顺了,慢着,还有坑在等我。心理想着 这个板子既然功能这么强大,那么用来控制电机,应该也很好吧!所以我要用他的pwm功能。网上一查,PWM很简单啊,用 用analogWrite(pin, val) pin引脚的编号,传说中只能用 3,5,6,9,10,11 这几条;val 是 0~255 的整数值,对应电压从 0 到+5V。这样对应我这个板子,那就应该是 0~3.3v的电压变化,至于那几个管脚,试试就知道了。
写代码,烧程序,一切都那么简单,PWM吗,从0慢慢变化到255就是个呼吸灯了。上led灯,咦,效果不太对,LED灯亮度有变化,但是没有到灭?为啥?上外用表,电压有变化,从0~到了1v多点,就跳回0了,为啥?串口输出,发现 val在0时,输出0 没错,但是在255时,却不是3.3v,郁闷!为什么?检查电路,没毛病。检查代码,没毛病。上网,没看到什么有价值的。重新控制IO口,0是0v,1是3.3v没问题啊!整个人都奔溃了。仔细想想,analogWrite(pin,val) 这个函数,没看见原型,所以不知道 入口参数应该是什么样的,尝试加大val的值,果然,有反应,电压慢慢的上去了。经测试 val的值,应该在0~1000之间。
永远不要相信任何人对我们的任何评价,这样的你,不会在不知不觉中跟魔鬼们签下限制自己的契约。......