65.9K
CodeProject 正在变化。 阅读更多。
Home

Arduino 硬件平台简介

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.89/5 (23投票s)

2009 年 7 月 14 日

CPOL

6分钟阅读

viewsIcon

66706

downloadIcon

659

Arduino 硬件平台简介

文章 2:Arduino 与 LCD 接口
文章 3:基于 Arduino 的 MIDI 延音踏板

引言

这是我正在撰写的关于 Arduino 硬件平台 的三部分系列文章中的第一篇。如果您不熟悉 Arduino 项目,它是一个价格低廉且灵活的开源硬件平台,非常适合创建交互式项目。有几种不同的型号可供选择,每种型号都有几个数字 I/O 引脚,几个模拟输入引脚(数字和模拟引脚的数量因型号而异),易于设置和使用,拥有一个多平台(尽管有点受限)的 IDE,并使用 C/C++ 编程。开发板的原理图和设计是开源的,因此您可以自己制作,也可以从 几家分销商 购买廉价的预制型号。有大量示例项目可供参考,并且 Arduino 社区 非常活跃且乐于助人。在我的研究中,我发现如果我想连接任何输入传感器(如哇音踏板电位器、光传感器、麦克风、MIDI 输入端口、加速度计、按钮、温度计等),并让它控制任何输出设备(如 LED、字符 LCD、图形 LCD、MIDI 输出端口、扬声器等),Arduino 都非常方便,而且易于构建项目。

背景

我最近在开始我的第一个硬件项目——一个定制的 MIDI 延音踏板时,发现了 Arduino 平台。我是一名软件开发者,而不是硬件开发者。我想构建的东西在软件中实现起来很简单,但我想要构建一个便携式、独立的设备。我对电阻、电容和运算放大器有一些基本了解,但我以前从未在微控制器上进行过数字硬件项目。在我开始研究项目之前,我本以为需要围绕 PIC 微控制器构建项目并用汇编语言对其进行编程(这是我并不期待的),但当我开始研究如何实现我的项目时,我偶然发现了 Arduino 平台。

我认为该环境和 IDE 功能齐全且足够,但略有不足(例如,IDE 管理项目文件、编译源代码并将编译后的草图传输到目标 Arduino,但不支持源代码调试、函数导航和 IntelliSense)。然而,在编程环境不足的地方,硬件本身弥补了这一点。每种型号都有数字输入和输出的数量,模拟输入数量(输入和输出的数量因型号而异),可以通过 USB 或非稳压电源供电(Arduino 可以轻松地直接由 9VDC 电源或 9V 电池供电,甚至不需要稳压器将电压从 9VDC 降至 5V)。

我还发现硬件设计非常宽容(如果你接反了,你的 Arduino 很有可能不会烧坏)。

闪烁

一旦我的硬件到了(我从 NKC Electronics 订购了我的 Arduino CPU,他们还提供了售后支持),开始就变得非常轻松和顺利。Arduino 网站提供了非常容易遵循的说明,介绍 如何设置软件、如何连接硬件(只需连接 USB 线并告诉 IDE 设备在哪一个串行端口上),以及如何测试你的第一个草图以确保一切正常工作(在 Arduino 环境中,每个项目都称为草图)。此外,我发现 Arduino 网站有很多示例,并且该网站还有一个非常活跃的 留言板,开发者可以在其中提问和发布问题。另外,还有一本名为 《Getting Started with Arduino》 的书。

连接好硬件并配置好 IDE 后,第一步是加载 Blink 草图,这被认为是 Arduino 世界中的“Hello World”。IDE 附带了许多默认草图,其中一个名为 Blink

加载后,您将看到以下代码

int ledPin = 13;                // LED connected to digital pin 13

void setup()                    // run once, when the sketch starts
{
  pinMode(ledPin, OUTPUT);      // sets the digital pin as output
}

void loop()                     // run over and over again
{
  digitalWrite(ledPin, HIGH);   // sets the LED on
  delay(1000);                  // waits for a second
  digitalWrite(ledPin, LOW);    // sets the LED off
  delay(1000);                  // waits for a second
}

每个草图都有两个常见函数——setup()loop()setup() 在 Arduino 开机/重置时被调用并进行初始化,而 loop() 会被反复调用。此时,如果一切连接正确,您就可以上传第一个草图了。只需点击“Upload to I/O Board”按钮(它会编译然后上传草图)

草图传输完成后,您将看到微控制器板上的 LED 闪烁。您可以使用焊接到 Arduino 板上的 LED

……或者将 LED 连接到地线引脚和 13 号引脚。

短期使用时,您可以直接将 LED 插入 Arduino。将 LED 的短脚插入 GND,长脚插入 13 号引脚

但长期使用时,如果电路中没有插入电阻,LED 会烧坏。将 Arduino 连接到面包板,然后添加一个 1K 欧姆的电阻和 LED

节拍器

接下来,我基于 Blink 创建了一个名为 Metronome 的新草图。在 Metronome 中,我将闪烁之间的延迟设置为与节拍相关的函数

/*
 * Metronome
 *
 * Based on the basic Arduino example, Blink:
 *   http://www.arduino.cc/en/Tutorial/Blink
 * Operates as a visual metronome.
 */

// Constants
const int LED_PIN = 13;                // LED connected to digital pin 13
const int TEMPO = 120;                 // Beats per minute
// Delay in milliseconds = 1 minute    60 seconds   1000 milliseconds
//                         --------- * ---------- * -----------------
//                         (X) beats   minute       second
const int DELAY = (int)((60.0 * 1000.0) / (float)TEMPO);

void setup()                            // Run once, when the sketch starts
{
    pinMode(LED_PIN, OUTPUT);           // Sets the digital pin as output
}

void loop()                             // Run over and over again
{
    PlayNote(DELAY);
}

void PlayNote(int nDuration)
{
    nDuration = (nDuration / 2);
    digitalWrite(LED_PIN, HIGH);        // Set the LED on
    delay(nDuration);                   // Wait for half the (original) duration
    digitalWrite(LED_PIN, LOW);         // Set the LED off
    delay(nDuration);                   // Wait for half the (original) duration
}

改变节拍需要更改代码、编译然后上传。为了克服这一点并使设计更灵活,我们可以添加一个电位器来控制节拍,但我不想操之过急,将推迟到稍后(将在第三篇文章中添加电位器)。

YYZ

我对简单的闪烁节拍器并不满意(而且我是一名鼓手),所以我决定创建一个更富节奏感和切分音的——YYZ。Rush 的歌曲 YYZ(来自专辑 Moving Pictures)是一首器乐曲,它以在钟声中用摩尔斯电码演奏的“YYZ”字母开头(YYZ 是乐队家乡多伦多机场的标识代码)。YYZ 草图在视觉上用摩尔斯电码播放 YYZ

/*
 * YYZ
 *
 * Based on the basic Arduino example, Blink: http://www.arduino.cc/en/Tutorial/Blink
 * Plays the opening rhythm to YYZ by Rush.
 */

const int LED_PIN = 13;         // LED connected to digital pin 13
const int TEMPO = 100;          // Beats per minute (the original song is 
                      // played at 104 BPM but that's
                                // a little too fast to watch so it has 
                 //been slowed down to 100 BPM)

// Delay in milliseconds = 1 minute    60 seconds   1000 milliseconds
//                         --------- * ---------- * -----------------
//                         (X) beats   minute       second

const int QUARTER_NOTE = (int)((60.0 * 1000.0) / (float)TEMPO);
const int EIGHTH_NOTE = QUARTER_NOTE / 2;
const int SIXTEENTH_NOTE = EIGHTH_NOTE / 2;


void setup()                            // Run once, when the sketch starts
{
    pinMode(LED_PIN, OUTPUT);           // Sets the digital pin as output
}

void loop()                             // Run over and over again
{
    // Rush: YYZ (-.--|-.--|--..)
    PlayNote(EIGHTH_NOTE);
    PlayNote(SIXTEENTH_NOTE);
    PlayNote(EIGHTH_NOTE);
    PlayNote(EIGHTH_NOTE);
    // ----
    PlayNote(EIGHTH_NOTE);
    PlayNote(SIXTEENTH_NOTE);
    PlayNote(EIGHTH_NOTE);
    PlayNote(EIGHTH_NOTE);
    // ----
    PlayNote(EIGHTH_NOTE);
    PlayNote(EIGHTH_NOTE);
    PlayNote(SIXTEENTH_NOTE);
    PlayNote(SIXTEENTH_NOTE);    
}

void PlayNote(int nDuration)
{
    nDuration = (nDuration / 2);
    digitalWrite(LED_PIN, HIGH);        // Set the LED on
    delay(nDuration);                   // Wait for half the (original) duration
    digitalWrite(LED_PIN, LOW);         // Set the LED off
    delay(nDuration);                   // Wait for half the (original) duration
}

值得注意的是:歌曲的原 tempo 是每分钟 104 拍,但我发现这个 tempo 对我的眼睛和大脑来说太快了,难以分辨节奏,所以我将 tempo 降低到每分钟 100 拍。

调试 Arduino 草图

虽然 IDE 不支持行级调试,但它支持串行调试。在 setup() 函数中,您需要添加调用

    Serial.begin(9600);

这告诉 Arduino 以什么速度传输串行数据。然后,您将在代码中添加 Serial.print()Serial.println() 语句,这些语句将发送回 IDE。要查看正在提交的串行数据,只需点击“Serial Monitor”按钮。

开启串行监控时,输出会显示在串行输出面板中

这有点老套,但它有效,而且总比没有好。

结论

本系列文章的第一篇到此结束。此时,我们才刚刚开始热身。如需进一步阅读,您应该查看 Arduino 主页Arduino 入门页面,以及用户在 Arduino 用户项目页面 上创建的一些项目。

历史

  • 2009年7月14日:初次发布
  • 2009 年 7 月 16 日:文章更新
© . All rights reserved.