Arduino 电子积木实战之通用按钮模块

Arduino, 电子积木 1 Comment »

开关是非常实用的一种电路模块,其基本原理是将两根导线接通,在我们的实际应用中往往能找到很多形式的开关,比如下面这个拉线开关:

我们能够使用电子积木中的通用按钮模块,把开关的两根线分别与按钮模块的两个引脚相连接:

这样就能够很方便地连接到按钮模块上:

按钮模块通过数字传感器连接到Arduino专用传感器连接线上,就完成了电路部分的连接:

整个电路的连接如下所示:

Arduino 加 EasyDriver 驱动步进电机

Arduino, 传感器 3 Comments »

步进电机也是一种能够连续旋转的电机,但同普通的直流电机不同,我们能够对步进电机旋转的角度进行非常精确的控制。比如对于一个精度为1.8度的步进电机来讲,我们能够通过相应的控制信号,让电机的轴在需要的方向上一次转动1.8度。要实现这么精确的控制,除了步进电机本身的复杂性之后,控制电路复杂也是在所难免的,因此我们需要相应的驱动模块来对步进电机进行控制。

EasyDriver是一个简单易用的步进电机驱动模块,可以用来驱动一个双极性的两相步进电机,之前有人做了相应的实验,可以参考一下这个教程,我在译言上提供了这篇文章,看是不是有时间给翻译一下;-)

三轴加速度传感器 MMA7260

Arduino, 传感器 7 Comments »

加速度传感器是一种可以对物体运动过程中的加速度进行测量的电子设备,典型互动应用中的加速度传感器可以用来对物体的姿态或者运动方向进行检测,比 如其中WII和iPhone中的经典应用。Nokia最新推出的手机N95利用内置的加速度传感器,让用户可以通过机身的摆动进行各种操作,包括主菜单操 作、图片浏览、切歌操作甚至进行游戏的控制等,非常全面,甚至超越了苹果 iPhone的动作感应功能的应用范畴。

基于Freescale公司MMA7260的这个三轴加速度传感器,对于普通的互动应用来讲应该是一个不错的选择,可以用在自由落体探测、动作传感等场合,并且具有较高的灵敏度。

在与Arduino配合使用时的连接方式是将Arduino上的5V和GND分别与该传感器的VCC和GND引脚相连,再将该传感器的3V3引脚与EN引脚相连,然后就能够从传感器的X、Y、Z引脚读出相应的值出来了:

该传感器X、Y、Z这三个轴所对应的方向关系如下图所示:

由于重力是加在任何物体上的,因此我们这里通过六个典型位置来理解该传感器的作用。

位置1

位置2

位置3

位置4

位置5

位置6

扩展Arduino:数字输出端口

Arduino 2 Comments »

随着你对Arduino的深入理解和应用,相信很快就会遇到Arduino端口不够用的情况了。比如你可能需要在你的项目里控制更多的LED或者继 电器,但却发现12似乎是一个很难超越的数字;或者你的声音项目里需要更多的电位器,但是Arduino板上6个模拟输入接口的限制却让你捉襟见肘。

如果此时Arduino的处理能力还尚能满足你的要求,只是接口数目不够,能够采用的一种办法就是对Arduino的数字端口和模拟端口进行扩展。 下图就是一个Arduino数字输出端口扩展板,利用它原理上你可以将Arduino上的3个数字输出端口扩展成8个数字输出端口,通俗说来就是3个换8 个;-)

实验这块板最简单的办法是用三根数字连接线,分别将该扩展板上的SCK,RCK和SER引脚与传感器扩展板上的数字I/O的8、9和10号引脚相连接:

相应的测试代码如下所示:

int dataPin = 8;    // SER
int latchPin = 9;   // RCK
int clockPin = 10;  // SCK

void setup() {
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
}

void loop() {
  for (int j = 0; j < 255; j++) {
    // start transmit data
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, j);
    // end transmit data
    digitalWrite(latchPin, HIGH);
    delay(500);
  }
}

上述代码中最核心的是对函数shiftOut()的调用,它的作用往扩展板上的8个数字引脚上写一个字节,该字节的每一位分别对应扩展板上8个数字输出I/O引脚中的一个。除此之外,shiftOut()函数在调用之前需要调用digitalWrite()将RCK置低,调用完成之后再置高,这是由芯片的控制时序决定的:-) 程序运行时的效果相当于一个递增的计数器,在扩展板的8个输出端口上分别接8个LED灯,可以看到相应的累加效果:

如果读到这你以为一切就结束了的话,那可就大错特错了;-)除了单个使用之外,这一扩展板其实是可以通过相应的连接线实现级连的。也就是说,如果两块相连的话,你就可以用Arduino上的三个数字I/O端口扩展出16个数字输出端口,如果三块相连的话,你就可以用Arduino上的三个数字I/O端口扩展出24个数字输出端口来。理认上讲这样的扩展是可以一直做下去的,但受限于处理器的处理能力和电源大小、外部干扰等的影响,这样的扩展在实际应用中当然是有一定限制的,至于是多少嘛 ,那就得由实际的应用场景来决定了。

下面来看两块数字输出扩展板如果级联使用。在上述接好的电路的基础上,我们只需要再用一根数字输出扩展板连接线,将第一块数字输出扩展板上的输出端口(OUTPUT),与第二块数字输出扩展板上的输入端口(INPUT)连接起来,电路部分就算完成了:

程序部分我们对上面的程序做一点点小的修改,由于是两块数字输出扩展板,因此我们需要分别调用两次shiftOut()函数,来为两块数字输出扩展板分别设置不同的值:

int dataPin = 8;    // SER
int latchPin = 9;   // RCK
int clockPin = 10;  // SCK

void setup() {
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
}

void loop() {
  for (int j = 0; j < 255; j++) {
    // start transmit data
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, j);
    shiftOut(dataPin, clockPin, MSBFIRST, 255 - j);
    // end transmit data
    digitalWrite(latchPin, HIGH);
    delay(500);
  }
}

需要注意的是,我们为数字输出扩展板提供的数据,其实是一级一级推到不同的扩展板上的,也就是说上面的两条shiftOut()函数执行完之后,第一条shitfOut()函数所指定的值其实被写到了第二块扩展板上,而第二条shiftOut()函数所指定的值则写到了第一块扩展板上。

上述代码在运行时的效果相当于在第二块扩展板上实现了一个递增的计数器,在第一块扩展板上实现了一个递减的计数器,如果你还不是那不明白的话,那就接上16个LED好好观察一下效果吧,另外适时补充一下二进制数据的基本常识可能也是必要的;-)

Arduino USB下载线原型

Arduino, 下载线 1 Comment »

在使用Arduino的过程中,最令人头痛的估计就是bootloade毁坏,需要重新烧写bootloader了。最常见的一种情况就是,在Arduino IDE环境中下载程序的时候,较长时间没有反应,这时很多人就直接选择断开USB连接线或者电源,然后就会出现无法再上传程序的错误。其实出现这种情况时正确的做法是一直等到Arduino超时返回出错信息,直接断电的做法往往会导致bootloader毁坏。

如果bootloader毁坏,唯一的办法就是通过ISP下载线重新烧写bootloader。之前有介绍过并口ISP下载线的使用方式,但一来使用不是很方便,二来有的计算机上没有并口,所以一款USB下载线就比较有帮助了。

Arduino采用的是AVR单片机,其实已经有不少专为该芯片设计的USB下载线了,比如USBaspUSBtinyISP。手头正好有一块USBasp的空板,拿它来做Arduino USB下载线的原型还是可以的。

通常USB下载线都是10芯的,Arduino独特的6芯设计使得我们必须做一块10芯到6芯的转换板:

下面是所有部件的连接图:

标准的Arduino板上并没有防插反插座,请注意不要接反了:

下载线做好之后,首先要安装USBasp的驱动,你可以下载这个文件并解压缩到你的硬盘上,插上USBasp线之后,Windows会提醒你找到相应的硬件:

当“找到新的硬件向导”对话框出现之后,选择“否,暂时不“单选框,然后单击“下一步”按钮:

然后再选择”从列表或指定位置安装“单选框,单击“下一步”按钮:

选中“在搜索中包括这个位置“复选框,并选择USBasp驱动文件所在的目录,再单击“下一步”按钮:

如果一切正常,你将看到下面这个完成页面:

打开硬件管理器,你会发现其中多了一个USBasp设备:

Arduino官方支持的是USBtinyISP而不是USBasp,在启动Arduino集成开发环境之前,你需要先编辑Arduino安装目录hardware目录下的programmers.txt文件,在末尾加入如下两行

usbasp.name=USBasp
usbasp.protocol=usbasp

这样启动Arduino后你就能在“Tools”->“Burn Bootloader“菜单里找到”/w USBasp“一项:

下载bootloader的时间会比较久,请耐心等待,成功下载后我们能在console窗口里看到如下信息:

稍微有点遗憾的是,我只在Arduino 0011版本上成功完成了上述步骤,在最新的0012版本上没有成功。估计是0012版本采用的最新的Avrdude与USBasp不兼容导致的,要使用USBasp下载线的朋友目前只能退回到0011使用了;-(

WP Theme & Icons by N.Design Studio
Entries RSS Comments RSS Log in