Arduino 教程之:步进电机控制

/*
Stepper Motor Control – one revolution

步进电机控制 – 一圈

This program drives a unipolar or bipolar stepper motor.
The motor is attached to digital pins 8 – 11 of the Arduino.

这个程序驱动单极或双极步进电机。电机连接到 Arduino 的数字引脚 8 – 11。

The motor should revolve one revolution in one direction, then
one revolution in the other direction.

电机应朝一个方向旋转一圈,然后朝相反方向旋转一圈。

Created 11 Mar. 2007
Modified 30 Nov. 2009
by Tom Igoe

*/
继续阅读“Arduino 教程之:步进电机控制”

Arduino 教程之:XBee 无线通信

借助 XBee 扩展板我们可以很方便地将 XBee 模块连接到 Arduino 上,XBee 模块的工作原理也非常简单,它与 Arduino 之间其实就是通过串行接口(即 Tx 和 Rx 引脚)进行通信。对于简单的点对点通信来讲,只需要通过串行接口向 XBee 模块写数据就可以实现数据的发送;当 XBee 模块通过无线通道接收到数据时,通过读串行接口可以很方便地获得这些数据。

原理弄清楚之后,其实我们可以将 XBee 模块看成是 Arduino 的串口,通过相应的串口操作函数来实现数据的接收和发送。首先请按照 Arduino XBee 模块使用手册中的说明配置好你的两个 XBee 模块,然后将相应的跳线连接到 XBee 一端: 继续阅读“Arduino 教程之:XBee 无线通信”

Arduino 教程之:串口输入

串行通信是实现 PC 机与微控制器进行交互的最简单的办法。之前的 PC 机上一般都配有标准的 RS-232 或者 RS-422 接口来实现串行通信,但现在这种情况已经发生了一些改变,大家更倾向于使用 USB 这样一种更快速但同时也更加复杂的方式来实现串行通信。尽管在有些计算机上现在已经找不到 RS-232 或者 RS-422 接口了,但我们仍可以通过 USB/串口 或者 PCMCIA/串口 这样的转换器,在这些设备上得到传统的串口。

通过串口连接的 Arduino 在交互式设计中能够为 PC 机提供一种全新的交互方式,比如用 PC 机控制一些之前看起来非常复杂的事情,像声音和视频等。很多场合中都要求 Arduino 能够通过串口接收来自于 PC 机的命令,并完成相应的功能,这可以通过 Arduino 语言中提供的 Serial.read() 函数来实现。 继续阅读“Arduino 教程之:串口输入”

Arduino 教程之:串口输出

在许多实际应用场合中我们会要求在 Arduino 和其它设备之间实现相互通信,而最常见通常也是最简单的办法就是使用串行通信。在串行通信中,两个设备之间一个接一个地来回发送数字脉冲,它们之间必须严格遵循相应的协议以保证通信的正确性。

在 PC 机上上最常见的串行通信协议是 RS-232 串行协议,而在各种微控制器(单片机)上采用的则是 TTL 串行协议。由于这两者的电平有很大的不同,因此在实现 PC 机和微控制器的通信时,必须进行相应的转换。完成 RS-232 电平和 TTL 电平之间的转换一般采用专用芯片,如 MAX232 等,但在 Arduino 上是用相应的电平转换电路来完成的。

根据 Arduino 的原理图我们不难看出,ATmega 的 RX 和 TX 引脚一方面直接接到了数字 I/O 端口的 0 号和 1 号管脚, 另一方面又通过电平转换电路接到了串口的母头上。因此,当我们需要用 Arduino 与 PC 机通信时,可以用串口线将两者连接起来;当我们需要用 Arduino 与微控制器(如另一块 Arduino)通信时,则可以用数字 I/O 端口的 0 号和 1 号管脚。

串行通信的难点在于参数的设置,如波特率、数据位、停止位等,在 Arduino 语言可以使用 Serial.begin() 函数来简化这一任务。为了实现数据的发送,Arduino 则提供了 Serial.print() 和 Serial.println() 两个函数,它们的区别在于后者会在请求发送的数据后面加上换行符,以提高输出结果的可读性。 继续阅读“Arduino 教程之:串口输出”

Arduino 教程之:模拟输出

就像模拟输入一样,在现实的物理世界中我们经常需要输出除了 0 和 1 之外的其他数值。例如,除了想用微控制器打开或者关闭电灯之外,我们还会想控制灯光的亮度,这时就需要用到模拟输出。由于Arduino 的微控制器只能产生高电压(5V)或者低电压(0V),而不能产生变化的电压,因此必须采用脉冲宽度调制技术(PWM,Pulse Width Modulation)来模仿模拟电压。

PWM 是一种开关式稳压电源应用,它是借助微处理器的数字输出来对模拟电路进行控制的一种非常用效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。简而言之,PWM 是一种对模拟信号电平进行数字编码的方法,它通过对半导体开关器件的导通和关断进行控制,使输出端得到一系列幅值相等但宽度不相等的脉冲,而这些脉冲能够被用来代替正弦波或其它所需要的波形。

在 Arduino 数字 I/O 管脚 9、10 和 11 上,我们可以通过 analogWrite() 函数来产生模拟输出。该函数有两个参数,其中第一个参数是要产生模拟信号的引脚(9、10 或者 11);第二个参数是用于产生模拟信号的脉冲宽度,取值范围是 0 到 255。脉冲宽度的值取 0 可以产生 0V 的模拟电压,取 255 则可以产生 5V 的模拟电压。不难看出,脉冲宽度的取值变化 1,产生的模拟电压将变化 0.0196V(5/255 = 0.0196)。 继续阅读“Arduino 教程之:模拟输出”

Arduino 教程之:模拟输入

Arduino 的优势在于对数字信号的识别和处理,但我们所生活的真实世界并不是数字(Digital)化的,简单到只要用 0 和 1 就能够表示所有的现象。例如温度这一我们已经司空见惯的概念,它只能在一个范围之内连续变化,而不可能发生像从 0 到 1 这样的瞬时跳变,类似这样的物理量被人们称为是模拟(Analog)的。Arduino 是无法理解这些模拟量的,它们必须在经过模数转换后变成数字量后,才能被 Arduino 进一步处理。

像温度这样的数据必须先被转换成微处理器能够处理的形式(比如电压),才能被 Arduino 处理,这一任务通常由各类传感器(Sensor)来完成的。例如,电路中的温度传感器能够将温度值转换成 0V 到 5V 间的某个电压,比如 0.3V、3.27V、4.99V 等。由于传感器表达的是模拟信号,它不会像数字信号那样只有简单的高电平和低电平,而有可能是在这两者之间的任何一个数值。至于到底有多少可能的值则取决于模数转换的精度,精度越高能够得到的值就会越多。

Arduino 所采用的 ATmega8 微处理器一共有 6 个模数转换器(ADC,Analog to Digital Converter),每一个模数转换器的精度都是 10bit,也就是说能够读取 1024(2^10 = 1024)个状态。在 Arduino 的每一个模拟输入管脚上,电压的变化范畴是从 0V 到 5V,因此 Arduino 能够感知到的最小电压变化是4.8毫伏(5/1024 = 4.8mV)。 继续阅读“Arduino 教程之:模拟输入”

Arduino 教程之:数字输入

在数字电路中开关(Switch)是一种基本的输入形式,它的作用是保持电路的连接或者断开。Arduino 从数字 I/O 管脚上只能读出高电平(5V)或者低电平(0V),因此我们首先面临到的一个问题就是如何将开关的 开/断 状态转变成 Arduino 能够读取的 高/低 电平。解决的办法是通过上/下拉电阻,按照电路的不同通常又可以分为正逻辑(Positive Logic)和负逻辑(Inverted Logic)两种。 继续阅读“Arduino 教程之:数字输入”

Arduino 教程之:数字输出

Arduino 的数字 I/O 被分成两个部分,其中每个部分都包含有 6 个可用的 I/O 管脚,即管脚 2 到管脚 7 和管脚 8 到管脚 13。除了管脚 13 上接了一个 1K 的电阻之外,其他各个管脚都直接连接到 ATmega 上。我们可以利用一个 6 位的数字跑马灯,来对 Arduino 数字 I/O 的输出功能进行验证,以下是相应的原理图:

tutorial-1-schematic1

电路中在每个 I/O 管脚上加的那个 1K 电阻被称为限流电阻,由于发光二极管在电路中没有等效电阻值,使用限流电阻可以使元件上通过的电流不至于过大,能够起到保护的作用。 继续阅读“Arduino 教程之:数字输出”

Arduino 语言注释

常量:

  • HIGH | LOW    表示数字 IO 口的电平,HIGH 表示高电平(1),LOW 表示低电平(0)。
  • INPUT | OUTPUT    表示数字 IO 口的方向,INPUT 表示输入(高阻态),OUTPUT 表示输出(AVR 能提供 5V 电压 40mA 电流)。
  • true | false    true 表示真(1),false 表示假(0)。

结构

  • void setup()    初始化变量,管脚模式,调用库函数等。
  • void loop()    连续执行函数内的语句。

数字 I/O

  • pinMode(pin, mode)    数字 IO 口输入输出模式定义函数,pin 表示为 0~13, mode 表示为 INPUT 或 OUTPUT。
  • digitalWrite(pin, value)    数字 IO 口输出电平定义函数,pin 表示为 0~13,value 表示为 HIGH 或 LOW。比如定义 HIGH 可以驱动 LED。
  • int digitalRead(pin)    数字 IO 口读取输入电平函数,pin 表示为 0~13,value 表示为 HIGH 或 LOW。比如可以读取数字传感器。

模拟 I/O

  • int analogRead(pin)    模拟 IO 口读取函数,pin 表示为 0~5(Arduino Diecimila 为 0~5,Arduino nano 为 0~7)。比如可以读取模拟传感器(10 位 AD,0~5V 表示为 0~1023)。
  • analogWrite(pin, value) – PWM    数字 IO 口 PWM 输出函数,Arduino 数字 IO 口标注了 PWM 的 IO 口可使用该函数,pin 表示 3, 5, 6, 9, 10, 11,value 表示为 0~255。比如可用于电机 PWM 调速或音乐播放。 继续阅读“Arduino 语言注释”

Arduino 教程之:呼吸灯附代码

今天整理出来一段呼吸灯代码,我自己习惯称作 呼吸灯,不知道其他朋友是不是也认同?LED 与 Arduino 控制板的连接非常简单,LED 正极连接支持 PWM 输出的 Pin11 引脚,负极连接 GND 引脚。


int ledPin = 11;
int val;

void setup()
{
  pinMode(ledPin, OUTPUT);
}

void loop()
{
  for(val=0;val<255;val++)
  {
    analogWrite(ledPin, val);
    delay(15);
  }
  for(val=255;val>0;val--)
  {
    analogWrite(ledPin, val);
    delay(15);
  }
}