Archive for the ‘硬件相关’ Category

AIS-AIR 空气净化器官网 小杰SSJ

STM8, 个人的心情空间, 硬件相关 | Posted by 老沙
12月 29 2017

买了一个AIS-AIR 空气净化器

非常好用,低风量十分安静,可以睡觉用

高风量暴力,那个大风吹呀吹。。。。。

官网:

淘宝店:

https://kumouse.taobao.com/?spm=2013.1.1000126.d21.6b7f1849L7JcBE

https://item.taobao.com/item.htm?spm=a230r.7195193.1997079397.8.lhcQLr&id=562691358312&abbucket=17

AR/QCA SPI 启动原理和 ART 地址定位原理

硬件相关 | Posted by 老沙
5月 11 2016

本贴主要讲解 Bootloader 是如何在使用 SPI Flash 的 AR/QCA 的芯片上启动的,以及 OpenWrt 代码 ar71xx 的 mach 文件中类似于 u8 *art = KSEG1ADDR(0x1fff0000) 中 0x1fff0000 是如何得来的。
楼主之前在 U-Boot 编译教程中进行过简单的描述,但是因为实在是太简略了,所以打算写一个详细版的。

下面楼主将按照必要的顺序依次讲解。

1. CPU 地址、总线地址、映射

对于 MIPS CPU 来说,只有一种地址,即 CPU 地址。32 位 CPU 的寻址范围称为它的地址空间,也就是 4GB,从 0x00000000 到 0xffffffff。
而总线,则是用来连接外设的,外设的寄存器、RAM、ROM等,都要通过总线来访问。总线也有自己的地址空间。

CPU 地址跟总线地址是相互独立的。因此,要让 CPU 能够访问到外设,就必须要让 CPU 地址跟总线地址产生某种关联,这就是映射。
这就好比数学里面的映射。MIPS CPU 上的映射是从 CPU 上一段地址空间到总线上一段地址空间的一一映射。

有了这样的关联后,就很容易通过对 CPU 地址的操作来变成对总线上外设的操作了。

2. AR/QCA 的总线地址布局

以 AR9344 为例,如图:ar9344_1

 

 

 

 

 

可以看到 AR/QCA 的 CPU 使用了总线地址的 0x00000000 ~ 0x1fffffff 共 512MB 的地址空间。
注意到内存也是通过总线来访问的。由图可知 AR/QCA 只有最大 256MB 的内存寻址能力。

3. MIPS 的内存布局

MIPS32 (即 32 位) 的内存模型都是一致的,如图:
addrspace_1

 

 

 

 

 

 

 

(图片来自 MIPS32 74K Processor Core Family Software User’s Manual)

由于 Bootloader 跟 Linux 内核都运行在 Kernel Mode 下,所以这里也只就 Kernel Mode 进行讨论。

由图可以看到,Kernel Mode 下,CPU 的地址空间被分为了5段: kuseg kseg0 kseg1 kseg2 kseg3。
kuseg 空间为 2GB,是用于用户态程序访问用的,kseg2 kseg3 是用作内核的内存分页用的。
这里只重点讨论 kseg0 和 kseg1。kseg0 和 kseg1 都占用 512MB 的地址空间。

由 MIPS 手册可知,kseg0 和 kseg1 都映射到了总线地址上的相同区域,也就是总线地址的 0x00000000 ~ 0x1fffffff 共 512MB 的空间。
这个映射是固定映射,也就是不会经过 MMU 的转换,访问 kseg0 跟 kseg1 都会直接被映射到总线上 0x00000000 ~ 0x1fffffff 的对应位置。

由于 AR/QCA 使用的总线地址空间也是这个范围,因此通过 kseg0 或 kseg1 就都能访问到整个总线地址空间。
如图:
map_1

 

 

 

 

 

 

 

从这里可以看到,kseg0 的范围是 0x80000000 ~0x9fffffff,kseg1 的范围是 0xa0000000 ~ 0xbfffffff。
又,总线地址空间范围是 0x00000000 ~ 0x1fffffff,那么:

1. 从总线地址映射到 kseg0 的方法是:在保证总线地址有效 (即总线地址在 0x00000000 ~ 0x1fffffff 内) 的情况下,将总线地址加上 kseg0 的起始地址,即:
kseg0(addr) = 0x80000000 + addr
2. 从总线地址映射到 kseg1 的方法与从总线地址映射到 kseg0 的方法类似,即:
kseg1(addr) = 0xa0000000 + addr
3. 从 kseg0 和 kseg1 映射到总线的方法是:将 CPU 地址除以 kseg0 或 kseg1 段长度,取余,得到的就是总线地址,即:
bus(addr) = addr % 0x20000000

实际上,在 Linux 内核中,arch/mips/include/asm/addrspace.h 提供了相应的宏来进行上述的地址转换,简化后如下:

#define virt_to_bus(_virt) ((_virt) & 0x1fffffff)
#define KSEG0ADDR(_addr) ((_addr & 0x1fffffff) | 0x80000000)
#define KSEG1ADDR(_addr) ((_addr & 0x1fffffff) | 0xa0000000)
virt_to_bus 即为总 CPU 地址转换到总线地址, 与 0x1fffffff (即低 512MB 的掩码) 进行按位与操作,相当于除以 0x20000000 取余,即舍弃掉 512MB 之上的部分,只剩下低 512MB 的部分;KSEG0ADDR 与 KSEG1ADDR 都先保证输入地址是有效的,再进行转换,这里的按位或运算,在结果上等同于加法运算

虽然 kseg0 跟 kseg1 都映射在总线相同的地址空间上,但是,它们的作用却并不相同:

kseg0 经过了缓存,kseg1 没有经过缓存。

kseg0 经过了缓存,也就是说从这个段读取出来的数据,可能是缓存过的,跟总线上实际的数据可能不同;向其写入的数据,可能会被延迟写入总线。
kseg1 则没有经过缓存,对这个段的任何读写操作都将立即反映在总线上。

所以:
kseg0 主要用于需要加速的内存访问和 ROM 访问
kseg1 主要用于设备寄存器的访问

4. MIPS 上的启动地址

MIPS 的 CPU 在复位后,会从 CPU 地址的 0xbfc00000 开始执行,也就是总线地址的 0x1fc00000。
可以看出 CPU 是在 kseg1 段上开始执行的,这是因为在 CPU 复位后,缓存还没用初始化,可能并不能使用。在不能保证 kseg0 段一定能使用的情况下,那么肯定只有从 kseg1 段开始执行了。

5. SPI Flash 和映射

这里的 SPI Flash 特指 SPI 接口的 NOR Flash (当然也有 SPI NAND Flash)。

NOR Flash 有个特点,即给出一个确切的地址,那么它就能连续输出从这个地址开始的数据。这个特点跟 DRAM 类似,因此它可以被用作启动设备。
这个特性被称为 XIP (eXecute-In-Place)。

为了实现这个特性,就需要 CPU 能够通过 CPU 地址空间访问到 Flash 上的数据。
由于 Flash 是一个外设,因此对它的访问是通过总线来进行的。

这里,又用到了映射:
Flash 有自己的地址空间,即存储数据的地址。
由于 Flash 是外设,因此它的地址空间会被映射在总线上面。这又是一个映射,只不过是从总线到 Flash 的映射。

那么,通过 CPU 访问 Flash,实际上经过了两次映射:第一次是 CPU 地址到总线地址的映射,第二次是总线地址到 Flash 地址的映射。
这样,CPU 就能够直接读取 Flash 的数据了。

6. AR/QCA 的 CPU 在 SPI Flash 上的启动

以 AR9344 为例,其它的型号也都基本相同

AR9344 遵循 MIPS 的要求,CPU 复位后,从 0xbfc00000 开始执行。

那么,总线地址 0x1fc00000 对应了什么外设呢?
从第 2 节可以看出, 0x1f000000 ~ 0x1fffffff 对应的正是 SPI Flash。

但是,Flash 是从 0x1f000000 开始映射的,那么 0x1fc00000 处映射的又是什么呢?

实际上,Flash 确实是从 0x1f000000 开始映射的,总共可以映射 16MB 的 Flash 空间。
为了兼容 MIPS 要求的 0xbfc00000 的复位地址,AR9344 在 0x1fc00000 处又重新对 Flash 进行了一次映射,映射了 Flash 开头的 4MB

但是,如果 0x1fc00000 处映射了 Flash, 那么从 0x1f000000 处就只能访问 12MB 的 Flash 空间了。
因此 AR9344 专门设置了一个寄存器,用来控制是否从 0x1fc00000 处重新映射 Flash。
这样的话,当 Bootloader 完成了启动过程,就可以关闭在 0x1fc00000 的重新映射,这样就能从 0x1f000000 处访问到完整的 16MB 的 Flash 空间了。

7. 如果 Flash 容量小于 16MB,那么会怎样

上一节已经说了,从 0x1f000000 可以映射 16MB 的 Flash 空间,那么如果 Flash 容量小于 16M,会怎么样?

实际上,Flash 对于地址有个回绕功能,也就是说,如果给定的地址超过了 Flash 的地址范围,那么 Flash 会自动让地址变成 0,即又从头开始。
想当于用给出的地址除以 Flash 的容量取余数。
这样对 Flash 来说,地址总是有效的,对外界来说,就像是 Flash 的数据在循环。

例如:某个 Flash 的容量是 4MB,那么它的地址范围就是 0x000000 ~ 0x3fffff。
如果访问 0x400000,就变成了访问 0x000000;如果访问 0x7f0000,就变成了访问 0x3f0000;如果访问 0xff0000,也是变成了访问 0x3f0000。

回到 AR9344 的 16MB 映射,如果 Flash 容量小于 16MB,那么在这 16MB 上的体现就是 Flash 数据重复映射了多次
例如:Flash 是 8MB 的,那么它就在 0x1f000000 和 0x1f800000 上各映射了一次;
如果 Flash 是 4MB 的,那么它就在 0x1f000000、0x1f400000、0x1f800000、0x1fc00000 上各映射了一次;

8. OpenWrt 的 mach 文件中,ART 数据地址的来历

在上面几节说来这么多之后,对于类似于 u8 *art = KSEG1ADDR(0x1fff0000) 这样的地址就应该很好理解了:

假设 ART 位于 Flash 的最后 64KB,那么它在 Flash 中的地址就是 Flash 容量 – 64KB。

例如:
Flash 是 4MB 的,那么 ART 在 Flash 中的起始地址就是 0x400000 – 0x10000 = 0x3f0000;
Flash 是 8MB 的,那么 ART 在 Flash 中的起始地址就是 0x800000 – 0x10000 = 0x7f0000;
Flash 是 16MB 的,那么 ART 在 Flash 中的起始地址就是 0x1000000 – 0x10000 = 0xff0000;

那么,这个地址在总上的映射就是 0x1f000000 + ART 地址,即:
Flash 是 4MB 的,那么 ART 在总线中的起始地址就是 0x1f000000 + 0x3f0000 = 0x1f3f0000;
Flash 是 8MB 的,那么 ART 在总线中的起始地址就是 0x1f000000 + 0x7f0000 = 0x1f7f0000;
Flash 是 16MB 的,那么 ART 在总线中的起始地址就是 0x1f000000 + 0xff0000 = 0x1fff0000;

现在,假设 OpenWrt 并不知道 Flash 的容量:
如果在 mach 中使用 8MB Flash 的 ART 地址 0x1f7f0000,如果 Flash 是 16MB 的,那么通过 0x1f7f0000 就无法获取正确的 ART 数据。

那么解决方法是什么呢:
那就是假设 Flash 都是 16MB 的,这样的话就会使用 0x1fff0000 这个地址。
当 Flash 容量小于 16MB 时,根据上一节所说的地址回绕功能,通过 0xff0000 访问到的就是 Flash 实际最后 64KB 的内容。

这就是 mach 文件中这个地址的来历。

9. 后记

嵌入式设备开发需要掌握很多的知识,并不是只会编程就行了。例如还需要学习计算机组成原理、操作系统原理等等。
很多开发者对这些并不了解,因此对于这些文件都会有相当多的疑问。
楼主尽量将文章内容简化,以使其变得能够容易理解,并希望能够起到抛砖引玉的作用。
希望通过此文让开发者能过对嵌入式设备开发有更深入的了解,消除疑惑。

J-link V8固件升级记

STM32, 硬件相关 | Posted by 老沙
4月 11 2016

好久没为电子工程事业尽份力了!今天也稍微努把力!写写我是如何升级J-link的固件的吧!

111

 

 

 

 

 

 

J-link是什么?晕,不是电子工程师的退散吧!这是现在比较流行的arm调试工具!我手上是那个大家都比较喜闻乐见的V8版本!盗版吗!大家懂的!50元入手的!没有软件升级与维护的!说不准哪天!升级软件就封杀了!如果固件没法更新就基本一块砖!砸人防身都可以哦!
222

 

 

 

 

 

首先在通电情况下,短接a!然后拔下usb 接着短接b,然后插入usb 10秒,然后拔下usb。最后从新上电插入usb!于是你的电脑里面就有了一个无法识别新设备!

333

 

 

 

 

 

 

 

 

去atmel官网下载最新版本的SAM-BA v2.12软件,你就可以正确识别硬件为一个usb转串口设备了!

http://ishare.iask.sina.com.cn/f/34214872.html

双击运行SAM-BA v2.12

444

 

 

 

 
设置你的设备端口号,还有芯片型号!之后点击连接!

666

 

 

 

 

 

 

 

进入固件刷写窗口!选择好新固件的文件地址!然后点send file

http://ishare.iask.sina.com.cn/f/34231756.html

777

 

 

 

 

 

 
提示是否加密!选择yes!

888

 

 

 

 

 

 
烧录进行中~~~~

999

 

 

 

 

 

 
再次提示是否要加密,选择no!之后退出程序!

拔掉J-link,然后从新插入usb!

1111

 

 

 

 

 

 

 

 

又会有新设备,这个时候要去下载安装J-Link ARM V4.40驱动就有了!

注意一定要是J-Link ARM V4.40 之后的版本都会封杀你的破解!

http://download.csdn.net/detail/wm20031015/3926860  

2222

 

 

 

 

 
运行J-Link ARM V4.40提示升级,选择yes

5555

 

 

 

 

 

 

6666

 

 

 

 
提示升级成功!

从新插拔一下J-link!好了你的J-link V8又复活了!

双击J-Link ARM V4.40 程序正常运行了!

8888

 

 

 

 

 

 

^_^,我能给的也就这么多了!如果还有什么问题,或者说新的4.5.0之后的版本需要破解的话,估计就又得等等了!不过至少现在J-link V8 又可以欢快的陪我们工作一阵子了!

 

install_at91-isp

jlnk_bin_烧录

PWM变模拟信号(积分电路 )

硬件相关 | Posted by 老沙
1月 15 2016

就是简单的积分电路。频率不变,积分后的电平相当于把高电平的电压和对应的时间的面积,平均到一个周期里。基本上占空比是50%,转换的电压,就是最高电压的50%,占空比30%,模拟电压就是30%。如PWM是5V的电平,转换后的直流电压就是2.5V和1.5V.
积分电路的用途
积分电路常见用于黑白和彩色电视机的扫描电路中。

时间常数τ=RC=10000*0.1×10^-6=0.001秒
就是(1毫秒)。

积分电路的结构
积分电路的结构和电阻分压电路也很相似,并且与微分电路更相似,只是把微分电路中的电阻和电容交换位置而已。这也是一个用电容器和电阻器组成的另一种分压电路。但积分电路输入也不是正弦信号,而是脉冲信号,这也是积分电路与其它分压电路的不同之处。

积分电路的要求
在积分电路中,要求RC时间常数(电阻值乘以电容值)远远大于脉冲宽度,这一点是积分电路中电阻和电容必须满足的要求,这是微分电路和积分电路的又一个不同之处。

积分电路的作用
积分电路与微分电路在功能方面表现也是相反的:能够提取输入信号的平均值大小,即低频成份。这中电路功能与电容滤波电路是有点相似,从电路中提取高频成份去填补低频成份,以至达到电路频率大小变化平均。

积分电路的原理
积分电路和微分电路在结构上只是电阻和电容交换位置,从微分电路图中可以想象出积分电路图。积分电路中电路输入矩形脉冲信号U1加在电阻器上,经过电阻器后再在电容器上输出三角脉冲信号U2。这个电路也可以这样理解:在电阻器和电容器串联电路上输入矩形脉冲信号,用示波器查看电路波形,在电阻器前面会是矩形脉冲信号,在电容器前面会是三角脉冲信号。这主要利用电容器储能充电的特性将电路中矩形脉冲信号转变成三角脉冲信号输送到下一级电路中。三角脉冲波比矩形脉冲波相对来说比较平稳,矩形波是明显一起一落,三角波虽然有起伏,但起伏变化没有矩形那么快,这样看来积分电路就和滤波电容的性质差不多了。
对积分电路原理分析过程要根据输入脉冲信号在前沿阶段、平顶阶段和后沿阶段等几种情况来进行:
1、当输入信号矩形脉冲还没有出现时,输入信号电压为零,所以输出信号电压也为零。
2、当输入信号矩形脉冲出现时,输入信号通过电阻对电容进行充电。由于电容内部刚开始没有电荷,所以电容会呈短路状态,也就是刚开始电容所承受的电压为零,输出信号电压也为零。
3、当输入信号矩形脉冲出现后,随着电容充电电荷不断地增加,电容所承受电压也在不断升高,输出信号电压也会随之升高。流过电容的电流近似与输入脉冲信号电压大小成正比,所以输出信号电压大小近似与输入信号电压的积分正比,积分电路由此而得名。
4、当输入信号矩形脉冲消失时,电阻器的电压会突变为零,电容器就会对电阻器放电。输出电路的电压就是电容放电电压,随着放电的进行,电容的电压越来越低,输出电路的电压也随之越来越低。
5、当输入信号矩形脉冲消失后,由于积分电路要求时间常数远远大于脉冲宽度,所以放电速度比较慢,在电容还没有放完电时下一个脉冲信号就又到来。电容因为刚刚放了电而电压低于输入信号电压,这时电容又开始充电,随着充电的进行电容的电压越来越大,输出电压也就越来大。如此反复,一个脉冲又一个脉冲地循环。

arduino 更改pwm频率的方法

arduino, 硬件相关 | Posted by 老沙
1月 06 2016

我们的PWM口只能通过输出占空比来输出模拟量,但是如果要输出1-60KHz或更高的脉冲频率的话,就不好做到啦。我一直在需找解决方案,无意中找到啦,现提供给大家分享,希望能有所帮助。

源代码如下:Here are some usage examples of the function:

// Set pin 9’s PWM frequency to 3906 Hz (31250/8 = 3906)
// Note that the base frequency for pins 3, 9, 10, and 11 is 31250 Hz
setPwmFrequency(9, 8);

// Set pin 6’s PWM frequency to 62500 Hz (62500/1 = 62500)
// Note that the base frequency for pins 5 and 6 is 62500 Hz
setPwmFrequency(6, 1);

// Set pin 10’s PWM frequency to 31 Hz (31250/1024 = 31)
setPwmFrequency(10, 1024);

Please keep in mind that changing the PWM frequency changes the Atmega’s timers and disrupts the normal operation of many functions that rely on time (delay(), millis(), Servo library).

/**
* Divides a given PWM pin frequency by a divisor.
*
* The resulting frequency is equal to the base frequency divided by
* the given divisor:
*   – Base frequencies:
*      o The base frequency for pins 3, 9, 10, and 11 is 31250 Hz.
*      o The base frequency for pins 5 and 6 is 62500 Hz.
*   – Divisors:
*      o The divisors available on pins 5, 6, 9 and 10 are: 1, 8, 64,
*        256, and 1024.
*      o The divisors available on pins 3 and 11 are: 1, 8, 32, 64,
*        128, 256, and 1024.
*
* PWM frequencies are tied together in pairs of pins. If one in a
* pair is changed, the other is also changed to match:
*   – Pins 5 and 6 are paired on timer0
*   – Pins 9 and 10 are paired on timer1
*   – Pins 3 and 11 are paired on timer2
*
* Note that this function will have side effects on anything else
* that uses timers:
*   – Changes on pins 3, 5, 6, or 11 may cause the delay() and
*     millis() functions to stop working. Other timing-related
*     functions may also be affected.
*   – Changes on pins 9 or 10 will cause the Servo library to function
*     incorrectly.
*
* Thanks to macegr of the Arduino forums for his documentation of the
* PWM frequency divisors. His post can be viewed at:
*   http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1235060559/0#4
*/
void setPwmFrequency(int pin, int divisor) {
  byte mode;
  if(pin == 5 || pin == 6 || pin == 9 || pin == 10) {
    switch(divisor) {
      case 1: mode = 0x01; break;
      case 8: mode = 0x02; break;
      case 64: mode = 0x03; break;
      case 256: mode = 0x04; break;
      case 1024: mode = 0x05; break;
      default: return;
    }
    if(pin == 5 || pin == 6) {
      TCCR0B = TCCR0B & 0b11111000 | mode;
    } else {
      TCCR1B = TCCR1B & 0b11111000 | mode;
    }
  } else if(pin == 3 || pin == 11) {
    switch(divisor) {
      case 1: mode = 0x01; break;
      case 8: mode = 0x02; break;
      case 32: mode = 0x03; break;
      case 64: mode = 0x04; break;
      case 128: mode = 0x05; break;
      case 256: mode = 0x06; break;
      case 1024: mode = 0x7; break;
      default: return;
    }
    TCCR2B = TCCR2B & 0b11111000 | mode;
  }
}

提供参考网址:
http://arduino.cc/playground/Code/PwmFrequency
http://arduino.cc/playground/Main/TimerPWMCheatsheet

电脑风扇 PWM频率的资料

硬件相关 | Posted by 老沙
1月 06 2016

2.4  PWM Control Input Signal
The following requirements are measured at the PWM (control) pin of the fan cable connector:
PWM Frequency: Target frequency 25 kHz, acceptable operational range 21 kHz to 28 kHz
Maximum voltage for logic low:  VIL = 0.8 V
Absolute maximum current sourced:  Imax = 5 mA (short circuit current)
Absolute maximum voltage level:  VMax = 5.25 V (open circuit voltage)

摘自Intel的PWM specification

三大主流开源硬件对比:如何选择平台

硬件相关 | Posted by 老沙
5月 07 2015

对于初学者来说,我们推荐Arduino。它拥有庞大的社区用户、大量的示例项目和教程,并且可以轻松地与其他外部设备连接。对于初学者来说,学习使用Arduino的方法有许多。

这块板的设计初衷,就是方便与不同的传感器进行交互,而且不需要设计其他电路,所以你不需要太多电路相关的支持,就能轻松上手。如果还没有尝试过这玩意,不妨试一试(价格并不贵),相信可以得到有趣的经验。

Arduino Uno是一款令人赞赏的工具,除了拥有开源的微控制器,软件开发环境也是免费的。

Raspberry Pi只有信用卡大小,可以直接插入到电视中。许多传统电脑上的功能,例如文字处理、电子表格和游戏,都可以在Raspberry Pi中运行。

价格低廉,硬件扩展性强,BeagleBone是为喜爱嵌入式Linux系统的玩家量身打造的产品。BeagleBone还可以当做BeagleBoard或Beagleboard-xM的外接USB或网络扩展模块。

如果开发的产品需要保证尺寸较小,我们推荐Arduino。这三款平台的尺寸相似,不过Raspberry Pi的SD储存卡会让它看起来更大。Arduino的款式躲让,但让Arduino区别于其他平台的特性在于,它拥有特别的微处理器,以及一些软件。它使用Atmel公司的一款微处理器嵌入式系统,体积小,价格实惠。对于那些需要尺寸非常小巧的项目来说,你可以花费1到2美元购买Atmel的这些芯片,并使用Arduino Bootloader(一个赋予Arduino基本功能的程序),安装后,你就又拥有了一个Arduino。

各种尺寸的Arduino

BeagleBone旁边是它的大哥BeagleBoard

BeagleBoard有一个更大,性能更强的版本——BeagleBoard。如果你需要更强的扩展性,那么BeagleBoard是一个不错的选择。

Arduino Uno、BeagleBone 和 Raspberry Pi,后两者都有网络接口

如果你的项目需要连接网络,我们比较推荐BeagleBone或Raspberry Pi。这两款都是真正的Linux电脑。他们都内建以太网接口和USB,便于用来连接网络。通过USB接口,你可以连接一个无线模块,那样就可以无需网线就能接入网络。另外,Linux系统拥有很多内置组件,提供高级的网络特性。

只需将USB WiFi设备连接到BeagleBone或Raspberry Pi上,Linux系统即可支持这些外接设备

Arduino支持外设,叫做“shields”,它虽然拥有连接网络的能力,但其网络功能十分有限。如果花时间去购买扩展,其实与直接购买功能比较完善的高阶电路板一样。

如果你的项目需要接入外部感应设备,我们推荐Arduino和BeagleBone。Arduino相对于其他设备,更容易连接外部感应器。不同版本的Arduino使用的电压不同(3.3V 或者 5V),这样就可以轻易的连接到不同的外部设备。而BeagleBone只能连接3.3V的外部设备,并在某些情况下,还需要加入电阻或者其他外部电路才能连接外部设备。Arduino和BeagleBone都有模拟数字信号接口,这让你轻松的连接输出不同电压的设备。BeagleBone拥有更高的模拟数字信号的分辨率,这对于某些项目来说是最好的选择。

就如上面所说的,你必须注意你将要连接的设备,包括小型的感应器,是否拥有叫做I2C或者SPI的数字接口。这三款平台都支持这些外接设备,所以通信方面不成问题。

对于需要电池供电的项目,我们推荐Arduino。Arduino功耗是最低地。如果按照每瓦的性能来比较,BeagleBone的能耗是最高的。但是Arduino拥有更广泛的空间,因为他可以和很多不同的输入电压的设备一起工作。这样就要求Arduino需要使用不同型号的电池,并且就算电池没电也能继续运转。

如果需要支持用户界面,我推荐使用Raspberry Pi。Raspberry Pi独树一帜,因为它拥有一个HDMI输出。这意味着,你可以接入键鼠和直接接入到你的电视。在这点看来,你拥有了一台功能全备的电脑,并且拥有用户操作界面。这样使得Raspberry Pi可以用于在需要与用户交互的项目中,以低成本构建web浏览设备。事实上,只是出于娱乐性质,我们把Arduino开发工具安装在Raspberry Pi上,并在Raspberry Pi写以一个简单程序并下载到Aruduino上。它并非是一台高性能的电脑,但是它确实是一台电脑。

总结

Arduino是一个扩展性很好的平台,便于与各种设备交互。对于初学者来说,在进行一些小型项目时,它是绝佳的选择。Raspberry Pi适合用于需要用户界面和需要网络支持的项目,其性价比较高。

BeagleBone拥有Arduino良好的可扩展性,兼具Raspberry Pi快速处理器和Linux灵活的开发环境。所以,如果你想做与水培花园类似的项目,我们推荐BeagleBone。因为它的输入输功能完善,并便于接入网络,所以我们可以通过Web端监测它回传的数据。

所有这3种设备是我们数字化项目的基石。当然,还有其他平台可用,例如,我们使用Sun SPOTs监测我们的番茄花园,这三种设备已基本能满足我们所需,除非你需要更高级的功能。

PM2.5 检测仪 套件 K001-V1.0

硬件相关 | Posted by 老沙
11月 12 2014

大家好:
前一段时间,自制了一个PM2.5 检测仪,并开了电路板,反正1个和10个都一个价,一下做了40个板子
现在都出了了吧。
之前在51的板块发了个贴,里边有电路图http://bbs.mydigit.cn/read.php?tid=1058826

购买链接:http://item.taobao.com/item.htm?id=42277735427
屏是1602的
CPU:328pu

套件包括:
传感器 : GP2Y1010F x 1
屏: 1602 x 1
电路板:专用电路板 x 1
接口: 2.54mm排针 x 2 (公母各一个)
CPU: 328pu x 1
电容: 104p x 2
电容: 22p x 2
电容: 220uf x 1
电阻: 150 x 1
电阻: 10K x 1
电阻: 4.7K x 1

4 3 9 89 5 6 1

IMG_20141111_212053 IMG_20141111_212045 IMG_20141111_211737 IMG_20141105_000054

brond_pic_z

自制 PM2.5 检测仪

硬件相关 | Posted by 老沙
11月 05 2014

1 2 3 4 pm2.5_pcb

准备制作PM2.5检测仪 资料

硬件相关 | Posted by 老沙
3月 27 2014

雾霾很严重

想买个PM2.5检测仪,网上一看都太贵,从400~8000。。。。。

然后查了查原理,很简单呀,就想做个PM2.5检测仪

晚上在网上逛了逛,发现了一个性价比很高的粉尘传感器,夏普的GP2Y1010AU0F

淘宝上卖27元,一下买了三个,做好了卖个试试,呵呵,加个有AD的单片机,一个锁存器,一个数显,成本应该50元之内

传感器PDF

gp2y1010au_e

下边的一些网上的资料

=====================================

使用夏普GP2Y1010AU0F灰尘传感器检测空气质量

夏普GP2Y1010AU0F灰尘传感器价格较便宜,能检测出室内空气中的灰尘和烟尘含量.

检测原理

其原理如下图,传感器中心有个洞可以让空气自由流过,定向发射LED光,通过检测经过空气中灰尘折射过后的光线来判断灰尘的含量。

pm1

pm2

pm3

pm4

 

 

 

根据电路图, 把Arduino和传感器连接起来:

  1. Sharp pin 1 (V-LED) => 5V 串联1个150欧姆的电阻(最好在电阻一侧和GND之间再串联一个220uf的电容)
  2. Sharp pin 2 (LED-GND) => GND
  3. Sharp pin 3 (LED) => Arduino PIN 2 (开关LED)
  4. Sharp pin 4 (S-GND) => GND
  5. Sharp pin 5 (Vo) => Arduino A0 pin (空气质量数据通过电压模拟信号输出)
  6. Sharp pin 6 (Vcc) => 5V

 

  1. /*
  2. Interface to Sharp GP2Y1010AU0F Particle Sensor
  3. Program by Christopher Nafis
  4. Written April 2012
  5. http://www.sparkfun.com/datasheets/Sensors/gp2y1010au_e.pdf
  6. http://sensorapp.net/?p=479
  7. Sharp pin 1 (V-LED)   => 5V (connected to 150ohm resister)
  8. Sharp pin 2 (LED-GND) => Arduino GND pin
  9. Sharp pin 3 (LED)     => Arduino pin 2
  10. Sharp pin 4 (S-GND)   => Arduino GND pin
  11. Sharp pin 5 (Vo)      => Arduino A0 pin
  12. Sharp pin 6 (Vcc)     => 5V
  13. */
  14. #include<SPI.h>
  15. #include<stdlib.h>
  16. intdustPin=0;
  17. intledPower=2;
  18. intdelayTime=280;
  19. intdelayTime2=40;
  20. floatoffTime=9680;
  21. intdustVal=0;
  22. inti=0;
  23. floatppm=0;
  24. char s[32];
  25. floatvoltage=0;
  26. floatdustdensity=0;
  27. floatppmpercf=0;
  28. voidsetup(){
  29.  Serial.begin(9600);
  30.   pinMode(ledPower,OUTPUT);
  31.  // give the ethernet module time to boot up:
  32.   delay(1000);
  33.   i=0;
  34.   ppm=0;
  35. }
  36. voidloop(){
  37.   i=i+1;
  38.   digitalWrite(ledPower,LOW);// power on the LED
  39.   delayMicroseconds(delayTime);
  40.   dustVal=analogRead(dustPin);// read the dust value
  41.   ppm=ppm+dustVal;
  42.   delayMicroseconds(delayTime2);
  43.   digitalWrite(ledPower,HIGH);// turn the LED off
  44.   delayMicroseconds(offTime);
  45.   voltage=ppm/i*0.0049;
  46.   dustdensity=0.17*voltage-0.1;
  47.   ppmpercf=(voltage-0.0256)*120000;
  48.  if(ppmpercf<0)
  49.     ppmpercf=0;
  50.  if(dustdensity<0)
  51.     dustdensity=0;
  52.  if(dustdensity>0.5)
  53.     dustdensity=0.5;
  54.  StringdataString=””;
  55.   dataString+=dtostrf(voltage,9,4,s);
  56.   dataString+=”,”;
  57.   dataString+=dtostrf(dustdensity,5,2,s);
  58.   dataString+=”,”;
  59.   dataString+=dtostrf(ppmpercf,8,0,s);
  60.   i=0;
  61.   ppm=0;
  62.  Serial.println(dataString);
  63.   delay(1000);
  64. }

把传感器和Ardiuno连接好后,可以连续打印出传感器的输出电压值。输出电压大小和灰尘含量的曲线入下图:

pm5

pm6

pmp1

pmp2

pmp3

pmp4

pmp5