![在孙老师的启发下](http://upload-images.jianshu.io/upload_images/1108512-6ade51cd78e0b4a5.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
关于Python语言的介绍安装请参考[廖雪峰的Python教程](http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000)
Python是一门解释型语言,虽然不能够像c语言一样编译上传到Arduino——什么你说MicroPython,我们再说Arduino呢——仍然是可以跟Arduino的玩耍的,就像scratch一样。
## 前言
Python玩转arduino的方式跟mblock的在线编程模式差不多的,都是先给arduino写入一个固件,然后操作,不同的是mblock是通过积木来向arduino下指令,这里我们用Python.
## mblock对arduino在线编程的步骤
1. 连接arduino到电脑
2. 打开mblock软件
3. 选择对应端口
2. 选择合适的控制板
![选择合适的串口](http://upload-images.jianshu.io/upload_images/1108512-202f2e57330c2f7a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![选择Arduino控制板](http://upload-images.jianshu.io/upload_images/1108512-9b008777b4891f5d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![安装固件](http://upload-images.jianshu.io/upload_images/1108512-65bb916e43779fa7.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![成功上传固件](http://upload-images.jianshu.io/upload_images/1108512-a70a6806a667fd3b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
然后我们就可以愉快的编程了.
## 用Python玩转Arduino
首先你要安装Python,并且确保安装了pip
然后我们要用到一个代码块[Python Arduino 原型API第二版](https://github.com/vascop/Python-Arduino-Proto-API-v2).
>This is a project based on the original [Python Arduino Prototyping API](https://github.com/HashNuke/Python-Arduino-Prototyping-API). I started a fork and after a while the whole thing was getting too different to make a pull request so I just put it here. The old project had wierd things going on to handle the communication, where I rely on parseInt() to do the work for me. There were also problems with analogWrite(), which is working in this version.
这个代码库呢是基于 [Python Arduino Prototyping API](https://github.com/HashNuke/Python-Arduino-Prototyping-API),作者复制了一份,做了很多改动,跟原始版本相差很大,于是就成了一个独立的版本.这个版本的通讯方式跟老版本不同,主要是用到了```parseInt()```函数.当然这个版本不是很完善,```analogWrite()```用起来可能会有问题——不过凡是代码的问题,都可以修复的不是吗.
**python玩转arduino的方法有很多,后面我在完善介绍别的**.
![下载Python操作arduino的库](http://upload-images.jianshu.io/upload_images/1108512-30751e6dcff1e6f0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
### 上传固件
![用Arduino软件打开固件文件prototype.pde,提示点是就好](http://upload-images.jianshu.io/upload_images/1108512-e0546bd1fb723b9d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![选择正确的开发板类型](http://upload-images.jianshu.io/upload_images/1108512-30460228e6dd9a63.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![选择正确的串口](http://upload-images.jianshu.io/upload_images/1108512-c8b6c16031a14194.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![选择完如图所示](http://upload-images.jianshu.io/upload_images/1108512-a08043393c92e236.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![上传固件代码](http://upload-images.jianshu.io/upload_images/1108512-305e3f747c5d2469.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![固件上传成功](http://upload-images.jianshu.io/upload_images/1108512-7ebae7d37238b794.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
这样准备工作就已经完成了,那么让我们开始愉快的玩耍把.这个过程跟在mblock里连接硬件,最后上传固件本质是一样的,形式不同而已.
### 开始玩耍把
学习编程总是从**Hello world!**开始,而学习硬件总是从点亮LED灯开始,那么今天我们就用这个库来试着点亮一盏LED灯.
![新建文件simple_analogread.py](http://upload-images.jianshu.io/upload_images/1108512-72348abc106457e1.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
然后修改代码如下图就可以了.
```
from arduino import Arduino
import time
b = Arduino('COM15')
# 实例化一个板子
# 突然很好奇如果我实例多个是否可以?
pin = 13
#declare output pins as a list/tuple
b.output([pin])
# 用列表的形式指定哪些针脚
# 用来当做输出针脚
for x in range(10):
b.setHigh(pin)
# 设定pin引脚为高电平
# b在这里就是指板子
time.sleep(1)
# 利用time库中的sleep函数
print b.getState(pin)
# 这个只是用来打印输出状态
b.setLow(pin)
# 这顶引脚pin为低电平
print b.getState(pin)
time.sleep(1)
b.close()
```
*快看看Arduino板子上自带的13号led灯是不是开始闪烁了呢?*
这种方法不是很好玩,这个代码封装的比较麻烦,相比于树莓派最新版的GIPO库,差的太多,最新的```gpiozero```真的超好用的.后面介绍.
通过上面的代码就可以跟arduino愉快的玩耍了
>**注意**:
**b = Arduino('COM15')**
引号里面代表的是具体通过那个端口跟arduino进行通讯,这里我的是'COM15'端口,大家要注意.
### close()函数
函数的作用是关闭串口链接,释放资源,重新运行代码的时候不需要重新插拔串口,不然就得重新插拔,作为一个好的习惯保留把.
## 点评
这个类库做一点小东西足够了,驱动1602液晶屏啊,电机啊什么还不行,舵机和步进电机可以,但是在中小学教学做一些简单的东西足够了.
或者是在用树莓派控制arduino的情况下,足够了,当然还有其他方式,未完待续
在GitHub上,搜一下以arduino为关键字进行搜索,选择Python语言的结果,就有很多库可以用.慢慢找一下总有符合自己风格的.
![GitHub的搜索结果](http://upload-images.jianshu.io/upload_images/1108512-d284c6db32809d1e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
可以看到JavaScript的项目也很多啊,前端的福音啊,感觉JavaScript现在都快逆天了.
可以看到很多甚至是HTML项目,应该是网页控制arduino,webarduino这种。
发现了一个很腻害的Arduino物联网平台项目[PlatformIO](http://platformio.org/)
![相关案例](http://upload-images.jianshu.io/upload_images/1108512-8990615bc10f15db.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![感觉好厉害的样子](http://upload-images.jianshu.io/upload_images/1108512-7d70121386618b0a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
### 其他库
发现了[Python版本的arduino命令API](https://github.com/thearn/Python-Arduino-Command-API),似乎这个要完善的多,支持舵机,不过这个库已经三年没有更新了,o(╯□╰)o
![python-arduino-command-api](http://upload-images.jianshu.io/upload_images/1108512-c9c7c92a999d55b6.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
没事搜一搜GitHub,总有意想不到的收货.
## 扩展
其实这种实现模式的关键是在arduino写入固件然后通讯,你可以直接用serial的方式——下次介绍——也可以用firmata这种复杂的通信协议来通信,视乎个人的开发能力而定。
对底层了解越多玩儿越多,未来我也会在深入学习的过程中不断的分享我的经验,欢迎大家留言讨论。