什么是arduino?
Arduino,是一个开放源代码的单芯片微控制器,它使用了Atmel AVR单片机,采用了开放源代码的软硬件平台,建构于简易输出/输入(simple I/O)界面板,并且具有使用类似Java、C语言的Processing/Wiring开发环境。
以上是维基百科的解释,我觉得这个解释虽然很到位,但不好,在于它忽略了解释的对象,如果我是一个IT小白,那真不明白在说的什么。
那到底如何告诉别人什么是arduino?可以去看arduino中文论坛的初识arduino。我介绍不来,不多说了,这篇文章主要针对熟悉电子电路的IT从业者以及工作交差。
很多电子从业者的朋友或许会鄙视arduino,不就是一块低性能的AVR单片机开发板吗?搭积木一样的傻瓜式编程的东西,给外行人玩的东西,有什么了不起。诚然,arduino表现出来的是一块单片机开发板,但仔细摸索你会发现,在GitHub里面有Arduino for STM32的源码,各类的IOT芯片也支持arduino,如wifi soc ESP8266等,各类芯片都把自己开发封装成arduino,你还觉得他是只是一块逼格比较高的AVR得开发板吗?所以说按我的理解,arduino是一个准标准的软硬件开发平台,类似VC开发Windows软件一样的平台,集成各类库文件,可以这样类比,电脑硬件对于arduino的硬件板,它的IDE类似VC,它集成各类嵌入式软件开发的库文件,比如delay(),Serial.read()等单片机开发常用函数,以及一些像I2C、SPI接口库或者传感器库,与单片机开发不同之处在于不需要对寄存器进行操作,直接调用函数,简单快捷。有人又说了,STM32、PIC、芯唐什么的单片机也有库函数,也可不直接操作寄存器。可是那些库函数只是简化写寄存器的方式,要使用对应的功能,还是要熟悉对应的寄存器操作,arduino的库函数是完全不用知道那些底层的寄存器的,不同的arduino板直接可以使用相同的函数,像不同单片机跑UCOS一样,移植后开发都一样。所以别说arduino是淘汰AVR的破板了,也别乱鄙视,电脑虽然强大,但8位单片机的出货量是电脑的几何倍,每个东西都有存在的空间,不是越强大越好,只有哪个场所合适用哪个的问题,况且让编程越来越简单是大势所趋,重复造轮子的事很没必要,arduino虽然不算完美方案,但是个指明出路的地方,Windows跟Ubuntu对比起来也丑,但第一系统是Windows,除了它出的早外,有个很大的原因就是基于VC的开发平台真是谁用谁知道,微软量身定做一大堆标准库,简简单单就上手的IDE平台,让多少程序员投入Windows怀抱,才有了现在Windows的生态。所以也很希望在嵌入式开发领域也有个类似的平台,可能arduino不是最终出路,但一定是那个出路的一个台阶。
arduino的优点
跨平台
Arduino IDE可以在Windows、Macintosh OSX、Linux三大主流操作系统上运行,而其他的大多数控制器只能在Windows上开发。
简单清晰的开发
Arduino IDE基于processing IDE开发。对于初学者来说,极易掌握,同时有着足够的灵活性。Arduino语言基于wiring语言开发,是对 AVRGCC库的二次封装,不需要太多的单片机基础、编程基础,简单学习后,你也可以快速的进行开发。
开放性
Arduino的硬件原理图、电路图、IDE软件及核心库文件都是开源的,在开源协议范围内里可以任意修改原始设计及相应代码。
社区与第三方支持
Arduino有着众多的开发者和用户,你可以找到他们提供的众多开源的示例代码、硬件设计。例如,可以在Github.com、Arduino.cc、Openjumper.com等网站找到Arduino第三方硬件、外设、类库等支持,更快更简单的扩展你的Arduino项目。
硬件开发的趋势
Arduino不仅仅是全球最流行的开源硬件,也是一个优秀的硬件开发平台,更是硬件开发的趋势。Arduino简单的开发方式使得开发者更关注创意与实现,更快的完成自己的项目开发,大大节约了学习的成本,缩短了开发的周期。
以上摘自《Arduino程序设计基础》
使用arduino的注意事项
每个东西都有其适用性的地方,其实对于熟悉某个单片机开发的人来说,使用arduino是不合适的,它虽然开发非常简单,对于简单项目,只要关注自己的业务逻辑,直接上手就行了。然而,就是因为他的简单,导致使用不灵活,片上资源也少,有些时候真的会掉进坑里,所以使用时三思,以下是我自己测试后,有些要注意的地方,可能不对,帮忙提醒下。
- 处理速度慢,实时性不高,基本的arduino版本都是ATmage做主控芯片,它时钟频路16M,跟增强型51差不多,而且代码又做了第二次封装,所以对处理性能要要求的应用自己酌情使用。别说Arduino for STM32,不是官方的,谁知道有什么坑。
- 多任务、多线程编程有点麻烦,虽然GitHub里可以找到多任务切换的源码,但使用时需要注意每个任务的时间片格,相对于UCOS、RT-Thread之类实时操作系统,各种优先级、抢占机制、线程通讯。用arduino累啊。
- 中断2个,计数器无,时钟频率设置麻烦,比如IO口的时钟频率基本不能设置,I2C、SPI口也是少的可怜,好多东西都要外扩,没有片上集成。
- PWM输出、模拟输入口到挺多的,但PWM的频率最大是500Hz,对于一些控制是不符合要求的,比如有些电机及配套的驱动,用这个频率控制会导致电机振动厉害,另外占空比设置只能0-255,对于一些性能要求比较严格的控制也是比较麻烦的。模拟输入的采样精度是10位,采用间隔是100us,这些都是比较低的值,虽然能满足大部分传感器的值,选用开发时还是需要注意的。
- 串口缓存最大的数是128,而且不能中断接收,对于一些通讯协议定义起来需要注意了。
举例介绍下arduino的开发过程
说了这些,其实要是没自己上手下不会有概念的,那么我取个例子来说明下arduino的开发过程,就举个避障小车开发的例子。小车的系统结构大致如图。
采用带编码器的直流电机,PWM方式控制电机转速度,各类传感器先举红外传感器,其他待定,arduino控制电机以及各类传感器,于上层主控制器一起构成一个智能小车。
由于编码器需要采集电机脉冲信号,为了方便无误采用arduino的两个中断计数,串口通信和各类传感器采用遍询式判断,为了简化编程,采用任务调度器实现编程。
那么现在开始这个arduino的开发吧!
默认你准备了硬件,那么先Arduino IDE下载安装吧,驱动安装不上看各版本驱动安装方法。安装好后打开软件如下图。
配置好后就可以上手了,这里推荐你看Arduino.Cookbook.Michael.Margolis这本书,上面有具体常用函数用法,有些不明白的可以查阅arduino IDE自带的例程,我觉得这样上手比较快,最后具体项目可以Google。比如我需要用到一个任务调度器,找到一个大神弄好的任务调度器,先自己测试下这个调度器的性能,代码如下:
#include "TaskScheduler.h" //下载源码放到项目目录下,引用
const int ledPin=13;//led引脚IO号
int ledState=0;//led状态标志
void setup()
{
// put your setup code here, to run once:
pinMode(ledPin,OUTPUT); //led引脚的IO设置成输出模式
Sch.init(); //初始化调度器
Sch.addTask(ledtest,20,1000,1); //从第 20 毫秒开始闪烁 LED,每隔 1s, LED 状态改变一次
Sch.addTask(serialtest,0,1,0); //串口测试程序
Serial.begin(9600); //开始串口通信
Sch.start() ;//启动调度器
}
void loop()
{
// put your main code here, to run repeatedly:
Sch.dispatchTasks(); // 执行被调度的任务,用调度器时放上这一句即可
}
void ledtest()
{
if(ledState==0) digitalWrite(ledPin,HIGH); //输出为高电平
else digitalWrite(ledPin,LOW); //输出为低电平
ledState=~ledState; //取反
}
void serialtest()
{
if(Serial.available()) //判断串口缓存是否有数据
{
Serial.print((char)Serial.read()); //将读到的数据发送回去
Serial.flush(); //清空串口缓存
}
}
测试下,除了需要注意每个任务的调用时间片,其他都OK,就用这个做小车的软件框架。
未完待续……