社区导航

 
查看: 2367|回复: 15

[分享] 【我的MicroPython入门之路】志在必学

[复制链接]

41

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2018-1-9 20:15:10 | 显示全部楼层 |阅读模式
       我是玩PC机的,90年学过点BASIC编程,知道少许模拟电路,2013年和单位上的同事一起想做个激光琴,我负责设想,同事负责电子和单片机部分。当时想得很简单:用成品电子琴来发声、用激光和光敏电阻接入开关管矩阵控制按键,结果遇到很多问题,更大的问题是同事生儿子后没时间弄了,激光琴的大架子在我家客厅里头摆了好几个月,什么都不懂啊,没办法,硬着头皮去百度搜索“最容易的单片机”,花了两个星期把两个Arduino的论坛乱翻看了些贴子,看上去这东西居然并没有想像的那么难,一个星期就把主要部分写出来了,但又过了很久才全部弄完,加了些颤音、渐弱等功能。初学遇到的坑就是多,原理上非常简单的东西,居然陆续弄了一年半才做出来,其实主体程序也并不长。
       自从学了Arduino,自信心就开始膨胀,常以“能用单片机”自诩。自从“今日头条”开始流行,知道了Python是个好东西,而单片机也从之前的Arduino nano转到Leonardo,花了两年时间很勉强地做了个基于路由器和摄像头的远程计算机键盘鼠标控制硬件原型,操作还很滞后,此时市场上已经由向日葵公司生产出远控成品了。

       现在转到8266和ESP32,发现官方推荐了MicroPython来进行开发,真是太好了,又有比Arduino更好玩的东西了,我年龄大,学起来不一定快,但我可以慢慢学,总有一天能用MicroPython给ESP32编上几个段子玩,最近想做的是阳台取水浇花器,从空气中取水,再用喷水枪向着花草的方向喷出去,主要问题是我家阳台的花草因为我几个月不浇水已经死过很多轮了。等我做完过后再用ESP32来实现智能灯,实现灯和灯以及WIFI之间进行WIFI通信和LIFI通信,以实现智能灯和智能音箱的功能,如果没猜错的话,等我弄出来应该至少5年后,市场上早有类似产品了,不过我不后悔,学着玩,弄着玩呗,即使没做出来也没啥关系是吧?






补充内容 (2018-1-16 18:52):
试用几块不同的8266和在uPyCraft的的引脚定义---3、4、5楼
LED灯亮度调整---10楼
用两根脚直接拖超微型电机并控制正转反转---11楼
取网络时间---12、13楼
8266驱动舵机---14楼
ESP32无法直接处理音频,搜资料中....


回复

使用道具 举报

7305

TA的帖子

14

TA的资源

版主

Rank: 6Rank: 6

测评达人

发表于 2018-1-9 20:28:25 | 显示全部楼层
不会那么久的,用micropythhon,开发速度会比arduino和C快很多。


回复

使用道具 举报

41

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2018-1-9 20:50:28 | 显示全部楼层
本帖最后由 9zhmke 于 2018-1-10 16:53 编辑
dcexpert 发表于 2018-1-9 20:28
不会那么久的,用micropythhon,开发速度会比arduino和C快很多。

谢谢版主临贴,请多指教
先试一块自带OLED屏的8266:
TB2j.5naBDH8KJjy1zeXXXjepXa_!!2212686325.png
内容居然写不进去,估计是刷的FLASH不同,这个块子要贵一点,怕弄成别的刷不回去把屏废掉,就不再做实验了换一块8266吧。



回复

使用道具 举报

41

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2018-1-9 23:40:02 | 显示全部楼层
      最早买的是http://nodemcu.com的小黄板子,当然先用uPyCraft跑blink.py了,这可是官方推荐的东西,这个IDE太省心了:自动升级、选好端口类型就可以调例子来用。

      不过还是要建议能把上次选择的型号作为默认选择,否则每次都要把Microbit切换到8266,例子里里的程序很轻松就跑起来了,除了LED不亮以外,什么都很正常..... 唉,板子不同,定义的脚不一样,提醒后来者,如果使用了和我一样的板子,记住uPyCraft里定义的脚的区别:

Pin:前面的序号是uPyCraft里的,后面的是板子上标注的。
0=3脚(板子上标注的,下同)
1=板载灯,因向串口输数据,推测为RX
2=4脚
3=9脚(RX)
4=2脚
5=1脚
9=ERROR
10=没反应
5-8:没有,程序出错(板子官方说可以用10个脚)没找到他们的软件下载
明天再试了。


回复

使用道具 举报

41

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2018-1-10 11:09:13 | 显示全部楼层
本帖最后由 9zhmke 于 2018-1-11 13:36 编辑

今天测试了另一款板子:ESP-WROOM-32,貌似这个板子的内存要大一些: TB1TkXeRFXXXXcsXpXXXXXXXXXX_!!0-item_pic.jpg
得出引脚结论是:
Pin:
0=3脚
1=因向串口输数据,推测为TX
2=4脚,右板载灯(小)
3=RX脚
4=2脚
5=1脚
6-8:没有脚,编译出错
9=ERROR
10=SD3
11=ERROR
12=6脚
13=7脚
14=5脚
15=8脚
16=0脚,左板载灯(大)
17-20,没有脚,编译出错
重新测试昨天的结果,发现也是10后面的没有试,试出来的结果相同。
开始编写:
1、SmartConfig.....没找到先例,再等等。
2、ScanWifi....例子中也没有,我还是再把论坛里别人的程序先看看吧。关闭程序,等等,怎么有个出错提示?让查看uPyCraft_V0.29.log??
打开看看呢:

  1. Traceback (most recent call last):
  2.   File "uPyCraft.py", line 541, in run
  3.   File "C:\Python34\lib\site-packages\serial\serialutil.py", line 590, in inWaiting
  4.   File "C:\Python34\lib\site-packages\serial\serialwin32.py", line 257, in in_waiting
  5. serial.serialutil.SerialException: ClearCommError failed (PermissionError(13, '拒绝访问。', None, 5))
  6. Traceback (most recent call last):
  7.   File "uPyCraft.py", line 541, in run
  8.   File "C:\Python34\lib\site-packages\serial\serialutil.py", line 590, in inWaiting
  9.   File "C:\Python34\lib\site-packages\serial\serialwin32.py", line 257, in in_waiting
  10. serial.serialutil.SerialException: ClearCommError failed (PermissionError(13, '拒绝访问。', None, 5))
复制代码

原来是我没有安装Python3啊,这个是不是该改一改?话说我如果装的3.6会不会目录也对不上号?
从环境变量%PYTHONPATH%里可以查到当前安装的Python在哪里的....


回复

使用道具 举报

41

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2018-1-10 17:01:55 | 显示全部楼层
本帖最后由 9zhmke 于 2018-1-10 17:03 编辑

再次更换,这次上ESP32了: TB2mjc0h46I8KJjSszfXXaZVXXa_!!1804731589.jpg
blink的效果极佳! 所有端口与uPyCraft定义相同,这下不用担心有什么不兼容的情况了。


回复

使用道具 举报

1026

TA的帖子

0

TA的资源

五彩晶圆(中级)

Rank: 8Rank: 8

荣誉会员勋章

发表于 2018-1-11 09:36:30 | 显示全部楼层
从空气中取水?想了半天还是没想到怎么从空气中取水~~~

点评

空气中取水应该是可以实现的,需要一个半导体制冷片,合理的设计下收集装置,冬天比较干,水可能少。  详情 回复 发表于 2018-1-11 11:29


回复

使用道具 举报

2692

TA的帖子

8

TA的资源

版主

Rank: 6Rank: 6

发表于 2018-1-11 11:29:39 | 显示全部楼层
sblpp 发表于 2018-1-11 09:36
从空气中取水?想了半天还是没想到怎么从空气中取水~~~

  空气中取水应该是可以实现的,需要一个半导体制冷片,合理的设计下收集装置,冬天比较干,水可能少。


回复

使用道具 举报

41

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2018-1-11 13:32:54 | 显示全部楼层
strong161 发表于 2018-1-11 11:29
空气中取水应该是可以实现的,需要一个半导体制冷片,合理的设计下收集装置,冬天比较干,水可能 ...

你说得对,但经过我们尝试,半导体的效果太差,现在是用的压缩机,一晚上从开放的阳台可以取2升水,室内1升,基本上能保证一个阳台的花不死掉。


回复

使用道具 举报

41

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2018-1-11 21:59:44 | 显示全部楼层
先来个简单的,blink只是点亮LED管子吧,先来试试对LED调光。 之前在Arduino上试过使用模拟脚对LED调光,发现LED对电压很敏感,多一点点就亮了少一点点就是不亮。看来只能从PWM下手。
查阅了论坛里的手册,知道了调用方法例如:led = PWM(Pin(2), freq=100);led.duty(800)
通过调试,得到了自己想写的第一个程序:

  1. import time
  2. from machine import PWM, Pin
  3. led = PWM(Pin(4), freq=1000)
  4. for i in range(1023):
  5.   led.freq(i)
  6.   #print (i)
  7.   for j in range(1023):
  8.     led.duty(j)
  9.     time.sleep_ms(i)
复制代码

从测试得出结论:频率取70和70以上时几乎感觉不到频闪,占空比从1-1023里面,700左右是最佳亮度,再向上虽然能感觉到更亮,但已经并不是很明显了。
猜测:使用三分之二的占空比可以更省电吗?


回复

使用道具 举报

41

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2018-1-11 22:23:32 | 显示全部楼层
本帖最后由 9zhmke 于 2018-1-12 20:45 编辑

想用来控制小型电动机的正转反转,于是写了段小程序:

  1. #hardware platform: FireBeetle-ESP8266

  2. import time
  3. from machine import Pin
  4. led1=Pin(4,Pin.OUT)
  5. led2=Pin(5,Pin.OUT)

  6. while True:
  7.   led1.value(1)
  8.   led2.value(0)
  9.   time.sleep(5)
  10.   led1.value(0)
  11.   led2.value(1)
  12.   time.sleep(5)
复制代码

之前测试了使用2脚和4脚之间,发现不能转起来,应该是内部带负载能力不够吧,转到使用4脚和5脚后,小电机顺利转起来了,无负载时电压是3.3V(实际3.27V),带上小电机后启动瞬间电压低到0.7V,正常运转后恢复到1.76V。
使用的板子是8266:
1.jpg
所使用的小电机是强磁小电机:
TB2K_7YaXXXXXbHXXXXXXXXXXXX-920426663.jpg


回复

使用道具 举报

41

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2018-1-12 22:56:44 | 显示全部楼层
今天准备先来个取网络时间的小程序,从uPyCraft的例子拼接MicroPython里的代码,组合了一段出来,看上去可以用:

  1. import network
  2. import socket
  3. import time
  4. import machine
  5. import utime
  6. try:
  7.     import usocket as socket
  8. except:
  9.     import socket
  10. try:
  11.     import ustruct as struct
  12. except:
  13.     import struct
  14. SSID="dp168.com"
  15. PASSWORD="dp168.com"
  16. wlan=None
  17. s=None

  18. def connectWifi(ssid,passwd):
  19.   global wlan
  20.   wlan=network.WLAN(network.STA_IF)                     #create a wlan object
  21.   wlan.active(True)                                     #Activate the network interface
  22.   wlan.disconnect()                                     #Disconnect the last connected WiFi
  23.   wlan.connect(ssid,passwd)                             #connect wifi
  24.   while(wlan.ifconfig()[0]=='0.0.0.0'):
  25.     time.sleep(1)
  26.   return True
  27. connectWifi(SSID,PASSWORD)
  28. ip=wlan.ifconfig()[0]                                 #get ip addr
  29. NTP_DELTA = 3155673600
  30. host = "pool.ntp.org"
  31. NTP_QUERY = bytearray(48)
  32. NTP_QUERY[0] = 0x1b
  33. addr = socket.getaddrinfo(host, 123)[0][-1]
  34. s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  35. s.settimeout(1)
  36. res = s.sendto(NTP_QUERY, addr)
  37. msg = s.recv(48)
  38. s.close()
  39. val = struct.unpack("!I", msg[40:44])[0]
  40. t = val - NTP_DELTA
  41. print('取得总时间数为:',t)
  42. tm = utime.localtime(t)
  43. tm = tm[0:3] + (0,) + tm[3:6] + (0,)
  44. machine.RTC().datetime(tm)
  45. print(utime.localtime())   

  46. wlan.disconnect()
  47. wlan.active(False)
  48. time.sleep(5000)

复制代码


回复

使用道具 举报

41

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2018-1-12 23:01:11 | 显示全部楼层
想测试获取网络时间的程序段,在QQ群里一说,马上就有高手跳出来,几分钟就写出了程序

  1. import time
  2. import urequests as requests
  3. def do_connect():
  4.     import network
  5.     wlan = network.WLAN(network.STA_IF)
  6.     wlan.active(True)
  7.     if not wlan.isconnected():
  8.         print('connecting to network...')
  9.         wlan.connect('dp168.com', 'dp168.com')
  10.         while not wlan.isconnected():
  11.             pass
  12.     print('network config:', wlan.ifconfig())

  13. do_connect()
  14. while True:
  15.   date = requests.get("http://cgi.im.qq.com/cgi-bin/cgi_svrtime").text
  16.   time.sleep(1)
  17.   if len(date) <= 20:
  18.     print(date)
  19.   else:
  20.     print("连接异常")
复制代码

本程序由网名为800042828的MicroPythonQQ群友友情赞助


回复

使用道具 举报

41

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2018-1-13 12:40:32 | 显示全部楼层
找了很久才找到舵机的资料,用8266驱动了舵机: IMG_20180113_120350.jpg

  1. import machine
  2. import time
  3. servo = machine.PWM(machine.Pin(4), freq=50)
  4. print("起始位停留5秒")
  5. servo.duty(10)
  6. #servo.duty(120,3000)
  7. time.sleep(5)
  8. print("对面停留5秒")
  9. servo.duty(110)
  10. time.sleep(5)
  11. print("停留在中间")
  12. servo.duty(65)
  13. print("结束")
复制代码

点评

test  详情 回复 发表于 2018-1-31 17:01


回复

使用道具 举报

41

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2018-1-31 17:01:57 | 显示全部楼层
本帖最后由 9zhmke 于 2018-1-31 17:02 编辑
9zhmke 发表于 2018-1-13 12:40
找了很久才找到舵机的资料,用8266驱动了舵机:

今天终于有空,把无水浇花器的流程图画出来了
QQ图片20180131170224.png

点评

8266和操纵杆控制: 买回了操纵杆傻眼了:总共有5根引出脚,分别是GND、VCC、X轴、Y轴、开关,这意思着X轴是一个模拟量输入,Y轴是另一个模拟量输入,众所周知8266是出了名的只有一个A0输入,到群里请教了一会儿,  详情 回复 发表于 2018-3-11 10:26


回复

使用道具 举报

41

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2018-3-11 10:26:38 | 显示全部楼层
本帖最后由 9zhmke 于 2018-3-11 10:29 编辑
9zhmke 发表于 2018-1-31 17:01
今天终于有空,把无水浇花器的流程图画出来了

8266和操纵杆控制:
买回了操纵杆傻眼了:总共有5根引出脚,分别是GND、VCC、X轴、Y轴、开关,这意思着X轴是一个模拟量输入,Y轴是另一个模拟量输入,众所周知8266是出了名的只有一个A0输入,到群里请教了一会儿,某Arduino群里的网红给了我个主意:分时测量。

       通过调试,证实了这么做完全没有问题:3.3V经4.7K电阻接A0和操纵杆的VCC,记住不是8266端,其实接VCC还是GND都差不多,只是读数是反过来的。X和Y轴的输出分别接到了D5和D6两只脚。
       在使用时,测量X值则把D5设为输出0状态,D6悬空设为读状态,然后读A0,紧接着把D5设为悬空读状态,把D6设为输出0状态,再读取A0,就读出了X和Y两个值。由于MicroPython没办法配SmartConfig,我已转回去使用Arduino了,不过原理和用法都差不多,随时关注MicroPython,等功能上了就回来:

  1. #include <ESP8266WiFi.h>
  2. int sensorValue=0;
  3. void setup() {
  4.   Serial.begin(115200);
  5. }

  6. void loop() {
  7.   pinMode(14, OUTPUT);
  8.   pinMode(12, INPUT);
  9.   digitalWrite(14, 0);
  10.   sensorValue = analogRead(A0);
  11.   Serial.print("X:");
  12.   Serial.print(sensorValue);
  13.   pinMode(12, OUTPUT);
  14.   pinMode(14, INPUT);
  15.   digitalWrite(12, 0);
  16.   sensorValue = analogRead(A0);
  17.   Serial.print("     Y:");
  18.   Serial.println(sensorValue);
  19.   delay(1000);
  20. }

复制代码



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2018-12-13 16:40 , Processed in 0.424318 second(s), 17 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表