嵌入式学习笔记我爱编程arduino

arduino简单介绍

2017-03-22  本文已影响2199人  竹个介

什么是arduino?

Arduino,是一个开放源代码单芯片微控制器,它使用了Atmel AVR单片机,采用了开放源代码的软硬件平台,建构于简易输出/输入(simple I/O)界面板,并且具有使用类似JavaC语言的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的开发过程

说了这些,其实要是没自己上手下不会有概念的,那么我取个例子来说明下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,就用这个做小车的软件框架。
未完待续……

上一篇下一篇

猜你喜欢

热点阅读