Arduino 与树莓派 Raspberry Pi 相比各自有什么优缺点

Arduino 与树莓派 Raspberry Pi 相比各自有什么优缺点,第1张

 Raspberry Pi有Arduino接口兼容板子卖,一举两得。淘宝上还有产品叫PCDuino,1GHzCPU,跑Ubuntu,接口直接兼容Arduino。

  Raspberry Pi有自己的操作系统,对Linux熟悉的可以直接上手,接口多,和外围设备通信也比较方便,USB、LAN、HDMI插上就能用。RPi便于在移动设备上操作,插个无线网卡,手机连上ssh就可以直接操作了。我现在把SD卡里的照片传输到移动设备上就用RPi建ftp服务器实现,在没有电脑的地方非常方便。还有,Linux上各种问题做好的解决方案非常多。

  Arduino的好处:传感器多,但是通讯协议要自己写。体积小、硬件选择多样,便于嵌入式开发。学过C的同学可以看两个例程就直接写程序了。缺点:移动设备难以编程。Arduino不像RPi是一个完整的系统,如果有部件不稳定,不知道哪里会出问题。而且Arduino没有独立的操作系统,自己写程序很蛋疼。

使用arduino提取网页中的并显示在自己的网页上的方法:

1、设置screenimage(image, xPos, yPos);的参数:

image : a named instance of PImage

xPos : int, location on the x-axis to start drawing

yPos : int, location on the y-axis to start drawing

2、举例说明:

PImage logo;

void setup() {

// initialize the screen

EsploraTFTbegin();

// initialize the SD card

SDbegin(SD_CS);

// set the background the black

EsploraTFTbackground(0, 0, 0);

// load the image into the named instance of PImage

logo = EsploraTFTloadImage("arduinobmp");

// if it is a valid image file, turn the Esplora's LED green

if (logoisValid()) {

EsplorawriteGreen(255);

}

else{

// if it is not valid, turn the LED red

EsplorawriteRed(255);

}

// draw the image on the screen starting at the top left corner

EsploraTFTimage(logo, 0, 0);

}

void loop() {

//循环处理另一个网页上的,存放到本网页的固定位置

}

实际上是串口读入字符串,再转换为int型数据。

[C++] 纯文本查看 复制代码代码001002003004005006007008009while(Serialavailable() > 0) { intinChar = Serialread(); if(isDigit(inChar)) {inString += (char)inChar;}i=inStringtoInt();}}

Arduino只有一个CPU,要在一个CPU上实现多线程的话,最终都是通过软件实现的。Arduino是一款便捷灵活、方便上手的开源电子原型平台,包含硬件(各种型号的Arduino板)和软件(ArduinoIDE)。

它构建于开放原始码simpleI/O介面版,并且具有使用类似Java、C语言的Processing/Wiring开发环境。

看实际情况吧,如果只是差一个半个输入I/O,可以选用Nano板代替,比UNO多出两个analoginput。

如果真的不够用,想要调用的库也不少了,也要考虑程式的空间是否足够。

UNO只有32KBflash,Mega2560可是256KB。而SDRAMmega2560亦是UNO的4倍。对比较大的程式,mega是必然的。这些记忆体的限制,单靠扩展I/O是不行的。

如果空间及预算许可的话,mgea2560硬体上也可以给更大的弹性,将来再增加设备也比较容易,而且有多个serialI/O及interrupt,可实现的东西更多。但mgea2560长一半,对细小系统来说会比较大了。所以,如果可以的话,个人觉得mega2560比UNO+扩展I/O更好。

用微信控制灯泡。

搞个微信公众号,设置把请求转发到你自己的公众号服务器。公众号服务器上用Python搭一个HTTP服务器,获取到来自微信的请求。然后用Python开多一个线程通过TCP/UDP协议把消息推送到本地电脑,电脑通过串口连接Arduino电路板。Python调用serial模块和Arduino电路板通信,Arduino控制灯泡的行为。

实现了一下,写得很简陋:

livoras/wx-arduino·GitHub

要是你有兴趣,还可以把Arduino接入你的家用电路,脑洞大一点你就可以在公司用微信控制你家的空调。UPDATE:代码仓库已经没有维护了,哪位大神有兴趣可以把它弄成通用的流程和组件,说不定是个商机(逃

Android联网可以采用HttpPost,HttpGet封装post请求和get请求,再使用HttpClient的excute方法发送post或者get请求并返回服务器的响应数据。

1、设置连接和读取超时时间,并新建HttpClient对象:

// 设置连接超时时间和数据读取超时时间

HttpParams httpParams = new BasicHttpParams();

HttpConnectionParamssetConnectionTimeout(httpParams,

30000);

HttpConnectionParamssetSoTimeout(httpParams,

30000);

//新建HttpClient对象

HttpClient httpClient = new DefaultHttpClient(httpParams);

2、Get请求:

HttpPost post = new HttpPost(KeySourceHOST_URL_STR);

// set HTTP head parameters

Map<String, String> headers = heads;

Set<String> setHead = headerskeySet();

Iterator<String> iteratorHead = setHeaditerator();

while (iteratorHeadhasNext())

{

String headName = iteratorHeadnext();

String headValue = (String) headersget(headName);

postsetHeader(headName, headValue);

}

/

通常的HTTP实体需要在执行上下文的时候动态生成的。

HttpClient的提供使用EntityTemplate实体类和 ContentProducer接口支持动态实体。

内容制作是通过写需求的内容到一个输出流,每次请求的时候都会产生。

因此,通过EntityTemplate 创建实体通常是独立的,重复性好。

/

ontentProducer cp = new ContentProducer()

{

public void writeTo(OutputStream outstream)

throws IOException

{

Writer writer = new OutputStreamWriter(outstream,

"UTF-8");

writerwrite(requestBody);

writerflush();

writerclose();

}

};

HttpEntity entity = new EntityTemplate(cp);

postsetEntity(entity);

}

//执行connect ,需要try ,catch处理

response = httpClientexecute(post);

3、Post请求:

HttpPost post = new HttpPost(KeySourceHOST_URL_STR);

// set HTTP head parameters

Map<String, String> headers = heads;

Set<String> setHead = headerskeySet();

Iterator<String> iteratorHead = setHeaditerator();

while (iteratorHeadhasNext())

{

String headName = iteratorHeadnext();

String headValue = (String) headersget(headName);

postsetHeader(headName, headValue);

}

/

通常的HTTP实体需要在执行上下文的时候动态生成的。

HttpClient的提供使用EntityTemplate实体类和ContentProducer接口支持动态实体。

内容制作是通过写需求的内容到一个输出流,每次请求的时候都会产生。

因此,通过EntityTemplate创建实体通常是独立的,重复性好。

/

ContentProducer cp = new ContentProducer()

{

public void writeTo(OutputStream outstream)

throws IOException

{

Writer writer = new OutputStreamWriter(outstream,

"UTF-8");

writerwrite(requestBody);

writerflush();

writerclose();

}

};

HttpEntity entity = new EntityTemplate(cp);

postsetEntity(entity);

}

//connect ,need try catch

response = httpClientexecute(post);

4、请求Response响应处理:

if (responsegetStatusLine()getStatusCode() == 200)

{

// get response xml

/

因为直接调用toString可能会导致某些中文字符出现乱码的情况。所以此处使用toByteArray

如果需要转成String对象,可以先调用EntityUtilstoByteArray()方法将消息实体转成byte数组,

在由new String(byte[] bArray)转换成字符串。

/

byte[] bResultXml = EntityUtilstoByteArray(response

getEntity());

if (bResultXml != null)

{

String strXml = new String(bResultXml, "utf-8");

}

}

//Todo xmlAnalysis

首先51是最古老的芯片(指8051),专利过期了其他厂家兼容芯片琳琅满目。在你列出的这几种里面速度慢,内存小(排除有些厂家出的魔改的型号)。常见的厂家stc的,atmel的正统89c51系列以及后期魔改型号。国产的st89,10,11,12,以及最新的15。还有c8051系列,以及高速usb接口的芯片,以及有很多无线收发芯片的核心是8051的。但是指令集兼容但是寄存器的复杂度就不一样了。

说arduino的话,arduino算是一个平台,他的早起,也是最广泛的核心是基于avr单片机的。我们都戏说arduino团队是给avr收买了帮avr买芯片。既然你没问avr的我就只说说arduino的情况。他简单易懂,做毕业,原型,快速开发的时候,硬件搭设方便,基本不用你去画板子,导线连接模块就是了。代码也全是简单易懂的。基本不涉及到寄存器级。总得来说就是开发快。小量定制化还是划算。真的做产品或者研究就算了,成本高,简单高度抽象化带来就是效率底下以及资源开销大,模块数量上去后系统就撑不住了。

虽然现在也有基于stm32,fpga,lpc,pic等芯片做的arduino,但是开源库和ide的开发很多没跟上,不兼容也没办法继承avr的arduino遗产。虽然官方也出了avr32位单片机的arduino,以及arm m0,还有配合嵌入式openwrt系统的arduino yun。但是价格以及方便性简直了(更何况新的芯片大多是低压io,外接模块很少兼容。

说stm32之前要说arm,上面的人也说过了,arm有分好几个版本。只说最近的划分,一个就是带mmu内存管理的,一般需要外接ram,flash才能工作。就是你听到的手机处理器arm多少多少,还有的路由器的处理器,以及服务器的处理器。特点是跑系统。还有就是不带mmu的嵌入式,和8051一样带ram,flash。现在划分了m0 m3 m4 m7等用在嵌入式,以及m0+升级版和其他特殊版本。总之就是比8051高了不知道哪里去了的芯片。然后stm32是st意法半导体公司向arm公司购买了核心(嵌入式)版权,加上自己的外设生产的一个系列的芯片。功能强大速度快外设多。但是寄存器复杂度等和8051就不能比了。所以官方也出了库,现在还出了专门的代码生成软件cube来简化操作。

fpga就厉害多了,前面说的几种都是单片机,做运算都是一步步来的,逻辑上是串联的。fpga是并行的,单片机一次同一时间只能做一次运算,fpga只要资源够(芯片买的贵),你心情好,同时进行成百上千的运算都可以的。所以一般用在速度要求高的地方,比如视频压缩,高速网络设备等。8051,arduino,stm32,10元左右就能上,fpga不上百就没啥资源可用,连前面三都比不过。fpga也不是用c来开发的,你可以想象成是一个数学的算法然后转到电路去执行(视频压缩就是一种)。更考数学,算法类的。

总结1,8051系列已经是辉煌的末日了。构架上已经拉后腿了,除了老代码,老系统升级,就是特定领域的芯片上使用。但是他至今还占用很大份额的原因是——大学的课本是他。

总结2,arduino就是一个玩具,玩玩可以,艺术类学生用来做互动的比较多。很多是不懂嵌入式硬件的程序员用来做东西玩。真正懂的要么直接用底层的avr要么用stm32或者其他了

总结3stm32杠杠的,值得学。在同性质的单片机里面最具性价比的。学习资料也多。

总结4 没的说太大范围了,都攘括了上一条总结的东西。

总结5高大上。学好饭碗不愁,高薪。但是怎么也得博士硕士才能干出点成绩,野路子的话是享受不到这个的。同时资料也少,入门成本高。

  首先,我估计大家都没有USB TO TTL 硬件,也不是所有的坛友都有mangoII,所以我今天就写个特别的arduino程序,让arduino变成一个串口转发器。

  原理很简单。。从串口芯片到单片机和这个口是个并联关系。。然后usb 到这个IO口有1k电阻,我就启用了单片机的内上拉稍微平衡下阻抗,,就把arduino板子作为usb to ttl工具了。。嘿嘿

  (本设置在mangoII板硬件环境下测试通过,不确定其他硬件是否可以使用,请自行尝试)

  代码如下:

  ARDUINO 代码复制打印

  void setup() {

  pinMode(0,INPUT_PULLUP);

  pinMode(1,INPUT_PULLUP);

  

  }

  

  void loop() {

  // put your main code here, to run repeatedly:

  

  }

  因为程序很简单,我又偷懒就没写注释了。主要内容就是创建一个软串口,软串口接模块 ,然后让软串口的回显数据转发到硬件串口,硬件串口的输入数据转发到软串口。

  下面来介绍下接线

  3V3 ------------ VCC

  ARDUINO GND ------------ GND esp8266

  IO1 ------------ TX

  IO0 ------------ RX

  注意,TX 是直接对应板子上的TX RX 对应RX。,。原因自己思考下。

  非常简单的接线,就是把我们的WIFI模块接到arduino的软串口上,需要注意的是,wifi模块是33V供电。

  好了。已经全部准备好了。我们要正式开始了。首先我们打开串口监视器,然后重新插拔一下模块的VCC接线(让模块重启,显示其启动信息),你应该能看到如下图所示的启动信息,说明已经没有任何问题了。

  1png

  前面的乱码是因为模块启动信息的波特率与后面启动后不一致造成的,不管就行了

  重点来了看窗口的右下角“没有结束符”

  这个要选择成“回车”如下图

  1png

  我们输入下面这个指令

  AT+Reset

  复制代码

  点击发送后,模块会重启

  显示如下

  AT+Reset

  done

  返回字符是done 为啥d没了呢,实际上是有的。可能是软串口的bug,这个我们不研究了。。反正能用知道就行了,不影响使用。

  好上面的重启命令我们等会会经常用到

  下面,我们要查询一下模块的工作模式,模块一共有三种工作模式1Station 2AP 3Station+AP 第一种是客户端模式,第二种是接入点模式,第三种是两种模式共存。既然我们是登陆路由器然后往指定网络传数据,所以我们选第一种模式。。

  设置之前先查询

  AT+MODE

  复制代码

  返回内容:

  AT+MODE

  +MODE:0

  done

  这个0就是没配置的意思。。我们配置成1即可

  用这个命令来设置

  AT+MODE=1

  复制代码

  这样就设置成模式1了。具体的详细指令请参阅上面的指令手册以及自己多尝试

  返回如下:

  AT+MODE=1

  one

  坑爹的d又丢了,不管~~~这个时候,关键的时刻来了,这时候虽然设置了。但还没有生效,需要重启模块。还记得我之前说的指令么?我就不重复写了。。反正这时候要重启(拔电源插头也是可以的)

  然后我们来查询下

  AT+MODE

  复制代码

  返回如下:

  AT+MODE

  +MODE:1

  done

  大概就是这样就设置好模式了。

  我们后面就暂时不介绍回显内容了,很简单

  然后就是查询一下附近能搜索到的wifi网络信号

  AT+ShowAP

  复制代码

  回显内容就是周围wifi信号

  看到自己的wifi就可以加入网络了

  AT+JoinAP="SSID","PASSWD"

  复制代码

  很简单的命令对吧,前面写SSID号,后面写密码。回车发送命令就可以加入网络了。记得加完网络重启下模块

  好了,这样模块就连上路由器了

  下面就需要有个小工具,在自己计算机(局域网内)上建立一个TCP端口的监听,来模拟服务器

  小工具连接

  我计算机IP是1921681101 我打算监听8089端口,如下图配置,监听(当然你也可以监听你需要的任何端口)

  tcppng

  (说明:任何网络服务器都可以看成是工作在指定端口,负责解析指定协议的端口监听器)

  设置模块到单链接模式(只能使用一个连接的模式,这种比较方便简单,多链接模式我们以后再讲)

  AT+MUX=0

  复制代码

  然后重启模块(拔电或者用reset指令都可以)

  好了。以上的设置模块设置一次后,断电后还是会有记忆的。。也就是说只需要配置一次。。下面开始建立TCP连接啥的。断电不会重连了。。

  下面我们在模块上建立一个TCP的连接

  使用指令

  AT+NewSTA=“TCP”,“1921681101”,8089

  复制代码

  很简单的指令,首先说明连接类型,目标ip地址,端口号。。这样就建立好了。。

  然后我们就能发送数据了

  指令

  AT+UpDate=11

  复制代码

  然后串口会返回一个>号,我们继续输入hello world发送

  这样就会从TCP监听的一端看到数据了。很简单吧

  指令后面的11的意思就是你要发送的字符的长度。系统是靠字符长度判断一句话是否可以发送,所以我们的数据长度要和下面要发送的字符串的长度等长才行。。

  简单的教程目前就到这里了,有助于大家理解AT指令的使用。

  另外我们还有一个arduino的库,虽然目前开发的不太完全,基本函数都开发完了,例程还没写好,bug可能还有不少,也都在调试中,有兴趣的可以去看看

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
网站模板库 » Arduino 与树莓派 Raspberry Pi 相比各自有什么优缺点

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情