Arduino 音调库

在本章中,我们将使用Arduino音调库。它只是一个Arduino库,可以在任意Arduino引脚上产生指定频率(50%占空比)的方波。持续时间可以有选择的指定,否则方波会一直持续到stop()函数被调用。该引脚可以连接到压电蜂鸣器或扬声器播放音调。

警告 – 不要将引脚直接连接到任何音频输入。电压远远高于标准线路电压,并可能损坏声卡输入等。你可以使用分压器来降低电压。

必需的组件

你将需要以下组件:

  • 1 × 8欧姆扬声器
  • 1 × 1k电阻
  • 1 × Arduino UNO 板

程序

按照电路图进行连接,如下图所示。

Arduino 音调库

草图

在计算机上打开Arduino IDE软件。使用Arduino语言进行编码控制你的电路。通过单击“New”打开一个新的草图文件。

Arduino 音调库

要制作pitches.h文件,请单击串口监视器图标正下方的按钮,然后选择“New Tab”,或使用Ctrl+Shift+N。

Arduino 音调库

然后粘贴以下代码:

/************************************************* * Public Constants *************************************************/ 
#define NOTE_B0 31
#define NOTE_C1 33
#define NOTE_CS1 35
#define NOTE_D1 37
#define NOTE_DS1 39
#define NOTE_E1 41
#define NOTE_F1 44
#define NOTE_FS1 46
#define NOTE_G1 49
#define NOTE_GS1 52
#define NOTE_A1 55
#define NOTE_AS1 58
#define NOTE_B1 62
#define NOTE_C2 65
#define NOTE_CS2 69
#define NOTE_D2 73
#define NOTE_DS2 78
#define NOTE_E2 82
#define NOTE_F2 87
#define NOTE_FS2 93
#define NOTE_G2 98
#define NOTE_GS2 104
#define NOTE_A2 110
#define NOTE_AS2 117
#define NOTE_B2 123
#define NOTE_C3 131
#define NOTE_CS3 139
#define NOTE_D3 147
#define NOTE_DS3 156
#define NOTE_E3 165
#define NOTE_F3 175
#define NOTE_FS3 185
#define NOTE_G3 196
#define NOTE_GS3 208
#define NOTE_A3 220
#define NOTE_AS3 233
#define NOTE_B3 247
#define NOTE_C4 262
#define NOTE_CS4 277
#define NOTE_D4 294
#define NOTE_DS4 311
#define NOTE_E4 330
#define NOTE_F4 349
#define NOTE_FS4 370
#define NOTE_G4 392
#define NOTE_GS4 415
#define NOTE_A4 440
#define NOTE_AS4 466
#define NOTE_B4 494
#define NOTE_C5 523
#define NOTE_CS5 554
#define NOTE_D5 587
#define NOTE_DS5 622
#define NOTE_E5 659
#define NOTE_F5 698
#define NOTE_FS5 740
#define NOTE_G5 784
#define NOTE_GS5 831
#define NOTE_A5 880
#define NOTE_AS5 932
#define NOTE_B5 988
#define NOTE_C6 1047
#define NOTE_CS6 1109
#define NOTE_D6 1175
#define NOTE_DS6 1245
#define NOTE_E6 1319
#define NOTE_F6 1397
#define NOTE_FS6 1480
#define NOTE_G6 1568
#define NOTE_GS6 1661
#define NOTE_A6 1760
#define NOTE_AS6 1865
#define NOTE_B6 1976
#define NOTE_C7 2093
#define NOTE_CS7 2217
#define NOTE_D7 2349
#define NOTE_DS7 2489
#define NOTE_E7 2637
#define NOTE_F7 2794
#define NOTE_FS7 2960
#define NOTE_G7 3136
#define NOTE_GS7 3322
#define NOTE_A7 3520
#define NOTE_AS7 3729
#define NOTE_B7 3951
#define NOTE_C8 4186
#define NOTE_CS8 4435
#define NOTE_D8 4699
#define NOTE_DS8 4978 

将上面给出的代码保存为 pitches.h

Arduino代码

#include "

pitches.h"

// notes in the melody:
int melody[] ={ NOTE_C4, NOTE_G3,NOTE_G3, NOTE_GS3, NOTE_G3,0, NOTE_B3, NOTE_C4  };

// note durations: 4 = quarter note, 8 = eighth note, etc.: 
int noteDurations[] ={
   4, 8, 8, 4,4,4,4,4 
  };



void setup()
{
   // iterate over the notes of the melody:
   
for (int thisNote = 0;

thisNote <8;

thisNote++)
{
  //to calculate the note duration, take one second
   //divided by the note type.
   // e.g. quarter note = 1000 / 4, eighth note = 1000/8, etc.
      
int noteDuration = 1000/noteDurations[thisNote];

      tone(8, melody[thisNote],noteDuration);

  // pause for the note's duration plus 30 ms:
      
  delay(noteDuration +30);

    
   }
  }
 
void loop()
{
   // no need to repeat the melody.
  }

代码说明

代码使用一个额外的文件,pitches.h。此文件包含典型音符的所有音高值。例如,NOTE_C4是中央C。NOTE_FS4是F#,等等。这个注释表最初是由Brett Hagman编写的,tone()命令是基于它工作的。当你想制作音符时会发现它很有用。

结果

你会听到保存在pitches.h文件中的音符。


Micro:bit教程06—学习蜂鸣器播放音乐

Micro:bit本身上面没有蜂鸣器。需要另外接。如果你是买了扩展板Robotbit的用户不用担心,扩展板上自带蜂鸣器。
Micro:bit上的music引脚接口默认接到P0,如果自己要外接蜂鸣器的,需要注意下。
music积木块分类里面有很多小积木,一般是控制音符和音调,另外它还内置了一些歌曲在里面,我们比较喜欢直接用里面的歌曲,经典歌曲。
Micro:bit教程06—学习蜂鸣器播放音乐
使用很简单,大家把积木拖出来试一试就可以了。
这里要说下播放旋律,最后一个下拉选项,它们之间的区别
once——播放一次,只有播完了才会继续往下执行其他的积木。
forever——永远播放,下面的积木就不执行了?
once in background——作为背景音乐播放一次,一次后就停。不会阻塞其他积木运行
forever in background——作为背景音乐永远循环播放。不会阻塞其他积木运行
以下是我们的gif:
Micro:bit教程06—学习蜂鸣器播放音乐

树莓派Python控制步进电机

步进电机控制在Python

树莓派Python控制步进电机

玩了LED,开关和蜂鸣器后,我觉得自然的下一步是用步进电机或两个。这可能构成了一个想法的一部分,我不得不创建一个自动停止动画动画“转台”,用于旋转和拍摄对象。

有大量的电机可供选择,但我决定用ULN2003控制板实验一台28BJY-48。

我选择这个设备的原因在哪里:

  • 它很便宜

  • 广泛供应海外和英国卖家

  • 使用控制板轻松获取

  • 小但比较强大

  • 运行在5V

  • 易于界面

我在eBay上从“4tronix_uk”下订了两个,第二天到了。步进电机28BJY-48数据手册中还有其他细节

与Pi接口

树莓派Python控制步进电机

电机通过预先提供的连接器连接到控制器板。控制器板有4 + 2个引脚需要连接到Pi头(P1)。

  • 5V(P1-02)

  • GND(P1-06)

  • Inp1(P1-11)

  • Inp2(P1-15)

  • Inp3(P1-16)

  • Inp4(P1-18)

上面的P1-XX参考表示我使用的Pi头引脚。这些在下面的StepPins列表中的Python示例中进行了定义,因此如果使用不同的引脚,一定要更新Python列表。如果需要,您可以使用其他GPIO引脚,只需记住更新您的Python脚本。

为了旋转步进电机,您可以按顺序为每个4个输入提供“高”和“低”电平序列。通过设置正确的高低电平顺序,电机主轴将旋转。方向可以通过反转顺序来反转。

Python脚本

树莓派Python控制步进电机

树莓派Python控制步进电机

以下是用于旋转步进电机的步进电机脚本的副本。它使用RPi.GPIO库并定义了4步和8步序列。

#!/usr/bin/python

您可以直接下载到您的Pi使用:

wget https://bitbucket.org/MattHawkinsUK/rpispy-misc/raw/master/python/stepper.py

与使用GPIO库的所有Python脚本一样,它需要使用“sudo”运行:

sudo python stepper.py

按Ctrl-C退出。

要指定不同的等待时间,您可以使用以下命令在命令行中传递几毫秒作为参数:

sudo python stepper.py
 20

其中20是毫秒数。

在此示例中,默认等待时间设置为0.01秒(10毫秒)。要更改旋转速度,您可以更改此值。我发现在电机停止工作之前,我可以将其减小到4ms。如果脚本运行太快,电机控制器不能跟上。这种性能可能因您的电机及其控制器而异。

4步序列更快,但转矩较低。握住电机主轴很容易停止旋转。8步顺序较慢,但扭矩要高得多。对于我的转盘应用,我更喜欢扭矩超速,所以我将使用8步序列。

您现在可以使用Raspberry Pi和一些Python脚本控制步进电机。添加另一个电机,你已经开始一个小机器人!

树莓派Python控制步进电机

原文始发于:树莓派Python控制步进电机

|

Arduino基础入门篇12—火焰报警器

|

    阅读本文大概需要3分钟。

|

本篇介绍火焰传感器,通过火焰传感器感知周围环境是否存在明火,控制蜂鸣器对环境火焰进行报警提示。

1. 实验材料

  • Uno R3开发板

  • 配套USB数据线

  • 面包板及配套连接线

  • 1个有源蜂鸣器

  • 1个10KΩ电阻

  • 1个火焰传感器

火焰传感器(即红外接收三极管)是一种对火焰特别敏感的传感器。其利用红外线对火焰的敏感特性,用特制的红外线接收管来检测火焰,然后将火焰的亮度转化成电平信号供控制器处理。

Arduino基础入门篇12—火焰报警器
火焰传感器

2. 实验步骤

  1. 根据原理图搭建电路。

    火焰传感器的负极(短脚)接到5V引脚,正极(长脚)连接10KΩ的电阻,电阻的另一端连接GND。传感器与电阻连接在一起并接入到开发板模拟输入A0引脚。蜂鸣器正极接开发板数字引脚8,负极接GND。

    实验原理图如下图所示:

    Arduino基础入门篇12—火焰报警器
    实验原理图

    实物连接图如下图所示:

    Arduino基础入门篇12—火焰报警器
    实物连接图
  2. 新建sketch,拷贝如下代码替换自动生成的代码并进行保存。

     1/*
    2  *  Flame
    3  *  火焰传感器检测到火焰后,控制蜂鸣器报警
    4  */

    5
    6int  beep  =  8; //定义蜂鸣器接口为数字8  接口
    7int  flameVal  =  0;   //存储火焰传感器数据
    8
    9void  setup()  {
    10    pinMode(beep,  OUTPUT);   //定义beep  为输出接口
    11 }
    12
    13void  loop()  {
    14    flameVal  =  analogRead(A0);   //读取火焰传感器的模拟值
    15    if  (flameVal  >=  200//当模拟值大于200时蜂鸣器鸣响,阈值根据实际测试进行修改
    16    { 
    17        digitalWrite(beep,  HIGH); //
    18    }
    19    else
    20    { 
    21        digitalWrite(beep,  LOW);
    22    }
    23 }
  3. 连接开发板,设置好对应端口号和开发板类型,进行程序下载。

    Arduino基础入门篇12—火焰报警器
    程序下载


3. 实验现象

当有火焰靠近时,蜂鸣器鸣响,当无火焰时,蜂鸣器停止鸣响。

5. 实验分析

通过读取火焰传感器的模拟值,根据设定的阈值进行比较,进而控制蜂鸣器鸣响。这个实验跟上一篇光控灯实验非常相似,都是通过特定传感器将光信号转换成高低变化的电平信号供控制器进行处理。

很多时候,对于输出模拟量的传感器都需要一个阈值,通过阈值比较进行实际的控制逻辑,阈值的选择需要根据实际情况进行反复调整,直到满足实际功能需求。

Arduino基础入门篇12—火焰报警器
扫码加入微信公众号:TonyCode


原文始发于微信公众号(

TonyCode

):Arduino基础入门篇12—火焰报警器

|

Arduino基础入门篇08—播放音乐

Arduino基础入门篇08—播放音乐


|

  阅读本文大概需要6分钟。

|


本篇介绍电子产品中的发声器件—蜂鸣器,通过控制蜂鸣器播放「葫芦娃」,带你回归美好童年。

1. 了解蜂鸣器

蜂鸣器是一种电子发声元器件,可以发出”beep”的声音。采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。

蜂鸣器分为有源蜂鸣器和无源蜂鸣器两种。

  • 有源蜂鸣器: 内部带有震荡源,只要一通电就会发出固定频率的声音。

Arduino基础入门篇08—播放音乐
有源蜂鸣器
  • 无源蜂鸣器:内部不带震荡源,需要使用2KHz到5KHz的脉冲信号驱动发声,声音频率可变。

Arduino基础入门篇08—播放音乐
无源蜂鸣器

从外观上来看两种蜂鸣器形状相似,有源蜂鸣器底部有密封,无源蜂鸣器底部可看到电路板。两种蜂鸣器都标注有正负极。

2. 实验材料

  • Uno R3开发板

  • 配套USB数据线

  • 面包板及配套连接线

  • 有源蜂鸣器

  • 无源蜂鸣器

3. 实验步骤

  1. 根据原理图搭建电路。

    蜂鸣器正极接开发板数字引脚8,负极接开发板GND,连接非常简单。

    电路原理图如下图所示:

    Arduino基础入门篇08—播放音乐
    电路原理图

    实物连接图如下图所示:

    Arduino基础入门篇08—播放音乐
    实物连接图
  2. 新建sketch,拷贝如下代码替换自动生成的代码并进行保存。

     1/*
    2  *  BUZZER1
    3  *  有源蜂鸣器控制
    4  */

    5
    6int  buzzer  =  8; //设置控制蜂鸣器的数字IO脚
    7void  setup()
    8
    {
    9    pinMode(buzzer,  OUTPUT);   //设置数字IO脚模式,OUTPUT为输出
    10 }
    11void  loop()
    12
    {
    13    digitalWrite(buzzer,  HIGH);   //发声音
    14    delay(300); //延时300ms
    15    digitalWrite(buzzer,  LOW);   //不发声音
    16    delay(300); //延时300ms
    17 }
  3. 连接开发板,设置好对应端口号和开发板类型,进行程序下载。

    Arduino基础入门篇08—播放音乐
    程序下载
  4. 下载后有源蜂鸣器发出声音频率固定的声音。

  5. 将有源蜂鸣器替换成无源蜂鸣器,拷贝如下代码进行保存并下载。

      
    
    1/*
      2      BUZZER2
      3      使用无源蜂鸣器播放《葫芦娃》
      4*/

      5
      6//对应音符和频率值
      7#define  NOTE_D0  -1
      8#define  NOTE_D1  294
      9#define  NOTE_D2  330
    10#define  NOTE_D3  350
    11#define  NOTE_D4  393
    12#define  NOTE_D5  441
    13#define  NOTE_D6  495
    14#define  NOTE_D7  556
    15
    16#define  NOTE_DL1  147
    17#define  NOTE_DL2  165
    18#define  NOTE_DL3  175
    19#define  NOTE_DL4  196
    20#define  NOTE_DL5  221
    21#define  NOTE_DL6  248
    22#define  NOTE_DL7  278
    23
    24#define  NOTE_DH1  589
    25#define  NOTE_DH2  661
    26#define  NOTE_DH3  700
    27#define  NOTE_DH4  786
    28#define  NOTE_DH5  882
    29#define  NOTE_DH6  990
    30#define  NOTE_DH7  112
    31
    32#define  WHOLE  1
    33#define  HALF  0.5
    34#define  QUARTER  0.25
    35#define  EIGHTH  0.25
    36#define  SIXTEENTH  0.625
    37
    38//整首曲子的音符部分
    39int  tune[]  =
    40{
    41    NOTE_DH1,  NOTE_D6,  NOTE_D5,  NOTE_D6,  NOTE_D0,
    42    NOTE_DH1,  NOTE_D6,  NOTE_D5,  NOTE_DH1,  NOTE_D6,  NOTE_D0,  NOTE_D6,
    43    NOTE_D6,  NOTE_D6,  NOTE_D5,  NOTE_D6,  NOTE_D0,  NOTE_D6,
    44    NOTE_DH1,  NOTE_D6,  NOTE_D5,  NOTE_DH1,  NOTE_D6,  NOTE_D0,
    45
    46    NOTE_D1,  NOTE_D1,  NOTE_D3,
    47    NOTE_D1,  NOTE_D1,  NOTE_D3,  NOTE_D0,
    48    NOTE_D6,  NOTE_D6,  NOTE_D6,  NOTE_D5,  NOTE_D6,
    49    NOTE_D5,  NOTE_D1,  NOTE_D3,  NOTE_D0,
    50    NOTE_DH1,  NOTE_D6,  NOTE_D6,  NOTE_D5,  NOTE_D6,
    51    NOTE_D5,  NOTE_D1,  NOTE_D2,  NOTE_D0,
    52    NOTE_D7,  NOTE_D7,  NOTE_D5,  NOTE_D3,
    53    NOTE_D5,
    54    NOTE_DH1,  NOTE_D0,  NOTE_D6,  NOTE_D6,  NOTE_D5,  NOTE_D5,  NOTE_D6,  NOTE_D6,
    55    NOTE_D0,  NOTE_D5,  NOTE_D1,  NOTE_D3,  NOTE_D0,
    56    NOTE_DH1,  NOTE_D0,  NOTE_D6,  NOTE_D6,  NOTE_D5,  NOTE_D5,  NOTE_D6,  NOTE_D6,
    57    NOTE_D0,  NOTE_D5,  NOTE_D1,  NOTE_D2,  NOTE_D0,
    58    NOTE_D3,  NOTE_D3,  NOTE_D1,  NOTE_DL6,
    59    NOTE_D1,
    60    NOTE_D3,  NOTE_D5,  NOTE_D6,  NOTE_D6,
    61    NOTE_D3,  NOTE_D5,  NOTE_D6,  NOTE_D6,
    62    NOTE_DH1,  NOTE_D0,  NOTE_D7,  NOTE_D5,
    63    NOTE_D6,
    64 };
    65
    66//曲子的节拍,即音符持续时间
    67float  duration[]  =
    68{
    69    110.50.51,
    70    0.50.50.50.510.50.5,
    71    0.510.510.50.5,
    72    0.50.50.50.511,
    73
    74    111  +  1,
    75    0.511  +  0.51,
    76    110.50.51,
    77    0.511  +  0.51,
    78    0.50.50.50.51  +  1,
    79    0.511  +  0.51,
    80    1  +  10.50.51,
    81    1  +  1  +  1  +  1,
    82    0.50.50.5  +  0.250.250.5  +  0.250.250.5  +  0.250.25,
    83    0.510.511,
    84    0.50.50.5  +  0.250.250.5  +  0.250.250.5  +  0.250.25,
    85    0.510.511,
    86    1  +  10.50.51,
    87    1  +  1  +  1  +  1,
    88    0.510.51  +  1,
    89    0.510.51  +  1,
    90    1  +  10.50.51,
    91    1  +  1  +  1  +  1
    92 };
    93
    94int  length; //定义一个变量用来表示共有多少个音符
    95int  tonePin  =  8;   //蜂鸣器的pin
    96
    97void  setup()
    98
    {
    99    pinMode(tonePin,  OUTPUT);   //设置蜂鸣器的pin为输出模式
    100    length  =  sizeof(tune)  /  sizeof(tune[0]);   //这里用了一个sizeof函数,查出数组里有多少个音符
    101 }
    102
    103void  loop()
    104
    {
    105    for  (int  x  =  0;   x  <  length;   x++)  //循环音符的次数
    106    {
    107        tone(tonePin,  tune[x]);   //依次播放tune数组元素,即每个音符
    108        delay(400  *  duration[x]);   //每个音符持续的时间,即节拍duration,400是调整时间的越大,曲子速度越慢,越小曲子速度越快
    109        noTone(tonePin); //停止当前音符,进入下一音符
    110    }
    111    delay(5000); //等待5秒后,循环重新开始
    112 }
  6. 下载完毕后,无源蜂鸣器就会播放「葫芦娃」神曲了。

4. 函数介绍

tone()

  • 描述:在指定引脚产生指定频率的方波,可用于蜂鸣器或扬声器播放音调。

  • 函数原型:

    • tone(pin, frequency)

    • tone(pin, frequency, duration)

  • 参数:

    • pin:产生音调的引脚。

    • 音调频率,单位赫兹。

    • 音调持续时间(毫秒单位),此参数可选。

  • 返回值:没有

noTone()

  • 描述:停止产生方波。

  • 函数原型: noTone(pin)

  • 参数:需要停止产生音调的引脚。

  • 返回值:没有。

noTone(pin)用来停止由tone(pin, frequency)产生的音调。

5. 程序分析

有源蜂鸣器程序比较简单,通过控制数字I/O引脚输出高低电平来让有源蜂鸣器发声。

无源蜂鸣器播放「葫芦娃」程序中,定义了跟乐理相关的知识,音符需要对应频率,拍子就是每个音符播放时间。还可以根据不同简谱来演奏出不同的曲子。

Arduino基础入门篇08—播放音乐
扫码加入微信公众号:TonyCode





原文始发于微信公众号(

TonyCode

):Arduino基础入门篇08—播放音乐

|