本教程使用相当简单的电子设备来增强毛绒玩具,但可能用于任何项目。
这不是一篇关于缝纫的文章,只是关于 C++ 和 MIT AI2 中的电子学和编码。
前段时间,我拜访了一家知名的商业街零售商,为一个项目购买了音效。他们拒绝了,并制作了“名单”。我不会使用零售商的名称,但我们称他们为“Make-a-Bear”,这样没人会猜到他们的真名。
如果没有挫折,你就不会对电子产品感兴趣,所以我并没有被吓倒,我开始寻找替代品,并开始制定计划。我意识到我需要一个身体,而“Team Girl”不愿意从她大量的“Make-a-Bears”中提供一名志愿者。
从另一个挫折中恢复过来,证明必要性是发明的引擎,我找到了一只旧怪物拖鞋、一件旧睡袍、一件旧衣服和一条领结。Bobbs 是由所有这些零碎组成的,但他需要生命,所以我给他塞了一个 Arduino 风格的处理器、FX 音板和用于眼睛的三色 LED。
然后事情就失控了(而且价格昂贵)。
他需要一个声音
一些发光的喇叭怎么样?
Tickley 脚?是的
倾斜传感器?是的
暗传感器?是的
通过 HC06 蓝牙模块由 Andriod 手机控制?真他妈的对
只有一个 Bobbs,但没有理由不能在您自己的项目中使用某些想法。我发现同时使用他的一种或多种能力可以获得最好的结果。例如,如果 Bobbs 被撞倒,倾斜传感器会将他的眼睛变成红色,喇叭会闪烁红色,他会咆哮并说“抱我起来”。
为糟糕的布局道歉。这里有更好的版本
我尽可能使用 Adafruit、SparkFun 和 Arduino 产品。我尝试过 Ebay 的廉价仿冒组件;从我的错误中吸取教训并购买合适的组件。他们可能会多花几英镑/美元,但你会省下很多麻烦。网站上的支持非常好。
SparkFun Pro Micro(或任何 Arduino 风格的微处理器)
5v 电池 - Bobbs 使用老式的无线电遥控汽车电源组,因为它们可以提供大量安培,但他将使用 4 节 AA 电池运行
Adafruit FX 板
Emic 2语音芯片
2通道D类3W放大器
6v电机
3 个倾斜传感器
三色 LED
4017 十进制计数器
HC-06蓝牙模块
Vero 板
电线 - 我使用的是杜邦连接器,因为它们很好地安装在插头引脚上,但它们总是分开。
电阻器
接头引脚和连接器
功率晶体管
光电二极管
太阳能板
二极管
一个可以把所有东西都放进去的盒子
安卓设备
Bobbs 的大脑(可能扩展了定义)是一个 SparkFun 处理器,这些可以在 eBay 上以几英镑/美元的价格买到。
我假设您知道如何对 Arduino 进行编程。如果没有,请学习!这是一个很棒的微处理器,你的生活会好很多。
具体参考在这里;
这是一个很好的紧凑板,有足够的引脚让我们现在很开心。它有 32k 的内存,所以我们在那里有点受限,但对于合理数量的代码仍然足够,因为 C++ 相当高效。
如果您使用的是 Arduino Create,SparkFun Pro Micro 喜欢认为它是 Arduino Leonardo。
满载的 Bobbs 使用了大量的果汁,所以我们需要相当大的东西来提供放大器。我使用了一个旧的 Nimh RC 汽车电池,该电池已被削减为 4.8v。
为了环保,Bobbs 在他的背上安装了一块 6 伏的太阳能电池板。Bobbs 电池通过太阳能充电一点。二极管可防止电池在夜间通过太阳能电池板放电。
在这种配置中,他运行了大约一天。
让我们从简单的事情开始。我们使用 2 个三色 LED、微处理器、50 欧姆电阻和一些电线。
红色腿连接到引脚 5,绿色连接到引脚 6,蓝色连接到引脚 9。负腿通过 50 欧姆电阻接地。亮度由 Arduino 使用脉冲宽度调制控制。拥有单独的引脚意味着可以创建多种颜色。
这是对代码的一些评论。
void eye 例程使用analogWrite 根据整数r、g 和b 的值向LED 发送脉冲(脉冲宽度调制)。反过来,LED 会打开。
void rollseye 使用三个 for 循环来改变 r、g 和 b 的值以产生一系列颜色
void setup 将引脚 5、6 和 9 定义为输出
void 循环是重复调用 rollseyes 例程的主要代码
他的眼睛在现实生活中比在视频中看起来更好。
// initialise variables and constants
// Arduino pins
#define redpin 5
#define greenpin 6
#define bluepin 9
void eyes(int r, int g, int b)
{
// writes to pins to change eye colours
analogWrite(redpin, r);
analogWrite(greenpin, g);
analogWrite(bluepin, b);
}
void rollseyes()
{
// loops to change eye colours
int colour;
eyes(0, 0, 0);
for (colour = 0; colour < 255; colour++)
{
// blue fades, red brightens
eyes(colour, 0, 255 - colour);
delay(10);
}
for (colour = 0; colour < 255; colour++)
{
// red fades, green brightens
eyes(255 - colour, colour, 0);
delay(10);
}
for (colour = 0; colour < 255; colour++)
{
// green fades, blue brightens
eyes(0, 255 - colour, colour);
delay(10);
}
}
void setup()
{
/* output pins */
pinMode(redpin, OUTPUT);
pinMode(greenpin, OUTPUT);
pinMode(bluepin, OUTPUT);
}
void loop()
{
rollseyes();
}
Adafruit Sound board 是个好东西,但相对昂贵,大约 20 英镑,而且它们只能容纳大约 10 个声音。检查下面的链接以获取有关它的大量信息。
如果您不采用满载的 Bobbs 路线,则该板将在没有微处理器的情况下工作,但您必须使用触发引脚播放声音。不管怎样,是时候拆开放大器和扬声器了。
您可以通过设置最多 10 个触发器或通过与软件串行库的串行通信(解决仇恨者)来运行此操作。我将在下面描述软件串行 (UART) 方法。我接受它存在问题,但没有什么会影响我们这里。
我不会重复 Adafruit 网站上的详细说明,而是简要说明;
首先,找一些声音复制到板上。Soundbible 是一个很好的起点
下载它们并在必要时转换为 OGG 或 WAV。该板不使用 MP3 格式,但转换文件很容易。我喜欢 Audacity 应用程序,因为您可以编辑文件以获得您想要的噪音。
这些文件需要命名为 T00、T01 等
接下来使用 USB 线将它们传输到板上。这就是设置完成
安装。引脚 7 (RX) 和 8 (TX) 连接到 Adafruit FX 板上的 TX 和 RX。将 UG 引脚接地以启用 UART 模式。还要连接放大器、扬声器和电源。
Bobbs 的扬声器就在他嘴的后面。
编码。Adafruit 有自己的库,我没有使用过,但希望它们很好。我为 Bobbs 写了我自己的
关于代码的一些注释;
包括软件串行库并使用引脚 7 和 8 以及 TX 和 TX 创建一个名为 FXserial 的实例。
在 void setup() 中使用 FXserial.begin 启动串行通信
播放声音是通过调用 FXserial.println("# x ");
其中 x 被替换为轨道号,因此对于轨道 0,x 为零,依此类推
#include
SoftwareSerial FXserial(7, 8); // RX | TX
void growl()
{
// Use software serial to tell Adafruit FX card
// to play a sound
FXserial.println("#03");
delay(500);
}
void fart()
{
// Use software serial to tell Adafruit FX card
// to play a sound
FXserial.println("#02");
delay(500);
}
void burp()
{
// Use software serial to tell Adafruit FX card
// to play a sound
FXserial.println("#04");
delay(500);
}
void laugh()
{
// Use software serial to tell Adafruit FX card
// to play a sound
FXserial.println("#00");
delay(500);
}
void setup() {
// Initialise Bobbs on start up// Serial communications with
// sound card
FXserial.begin(9600);
}
void loop(){
fart();
burp();
laugh();
growl();
}
作为 Adafruit 板的更便宜的替代品,带有 SD 卡的 DFplayer mini MP3 是可能的。被警告 - 他们是一个痛苦。它可以播放 MP3 文件,而 FX 板不会,而且您可以容纳更多噪音。与 Adafruit 板一样,它也可以在没有微处理器的情况下运行。
eBay 以大约 4 英镑的价格出售它们,这比 FX 板的 20 英镑和语音芯片的 60 英镑要便宜得多。这里有更多关于它的内容。
https://www.dfrobot.com/blog-277.html
我无法让库正常工作,除非我采取下面的步骤 1 和 2,否则它不会播放我想要的文件。忘记目录。
我为使其工作所遵循的步骤是;
1) 从 Sound Bible 之类的网站下载声音文件或制作一些声音文件并根据需要使用 Audacity 进行编辑。
1.5) 将它们传输到 SD 卡。将文件命名为 0001.MP3、0002.MP3 等
2)找到一个胖32文件排序器并按名称对文件进行排序。每次添加声音,清空 SD 卡,重复 1.5 和 2 点。
3) 如图所示连接 DFplayer。
4)一些代码的时间
/* New file order - clear SD, download new files, YAFS */
#include "SoftwareSerial.h"
# define Start_Byte 0x7E
# define Version_Byte 0xFF
# define Command_Length 0x06
# define End_Byte 0xEF
# define Acknowledge 0x00 //Returns info with command 0x41 [0x01: info, 0x00: no info]
SoftwareSerial MP3player(10, 9); // RX, TX
void setVolume(int volume)
{
execute_CMD(0x06, 0, volume); // Set the volume (0x00~0x30)
delay(2000);
}
void play(int file)
{
int state = LOW;
while (state == LOW)
{
state = digitalRead(busy);
}
execute_CMD(0x03, 0, file);
delay(100);
}
void execute_CMD(byte CMD, byte Par1, byte Par2)
// Execute the command and parameters
{
// Calculate the checksum (2 bytes)
word checksum = -(Version_Byte + Command_Length + CMD + Acknowledge + Par1 + Par2);
// Build the command line
byte Command_line[10] = { Start_Byte, Version_Byte, Command_Length, CMD, Acknowledge,
Par1, Par2, highByte(checksum), lowByte(checksum), End_Byte
};
//Send the command line to the module
for (byte k = 0; k < 10; k++)
{
MP3player.write( Command_line[k]);
}
delay(100);
}
void setup() {
MP3player.begin(9600);
setVolume(21);
play(34);
}
void loop() {
// play a random track between 1 and 49
track = random(1, 50;
}
是的,这很痛苦。如果您可以应付一些声音效果,请坚持使用 Adafruit。
我猜你可以连接放大器和扬声器。该放大器是 Adafruit 的另一款产品,但这只是因为它们通常可以毫无问题地工作。
如果你想要声音和语音,你需要两个通道,因为你不能有两个输入进入单声道放大器。
这是好的一点。通过语音使您的玩具栩栩如生。我很惊讶没有更多的爱好定价的语音芯片 - 一定有对它们的需求。也许是价格——它相对昂贵,大约 60 英镑。
如果您能忍受痛苦,您可以将一些语音文件录制到 MP3 上,然后使用前面提到的 DFplayer 进行语音。
它有几个声音,听起来都像斯蒂芬霍金斯。我再次使用软件序列号(我能听到磨牙的声音)。同样,我不会重复网络上已有的内容,只介绍我所做的。
安装芯片很容易;将 RX(Arduino 上的引脚 2)连接到板上的 TX,将 Arduino(TX)上的引脚 3 连接到板上的 RX 引脚。输出像往常一样进入放大器。代码可能会涉及更多 - 有关更多详细信息,请参阅网站。我下面的例子可能很简单。
#include
2 , 3); // RX | TX
void speak(String message)
{
// Send message to speech chip
emicserial.print("S");
emicserial.print(message);
emicserial.write("\n");
}
void setup() {
// Serial communications with speech chip
emicserial.begin(9600);
// Set volume for speech
emicserial.print('V16');
emicserial.print('\n');
void loop()
{
speak("Hello");
}
使用蓝牙通过 Android 手机控制您的玩具,只需一次,从 eBay 获得便宜的仿制品,令人惊讶的是,它确实有效!这次我们不仅将 C++ 与 Arduino 一起使用,而且还使用了 MIT AI2。
麻省理工学院 AI2 真是太棒了。您无需了解有关 Andriod 操作系统的任何信息 - 只需拖动组件以进行屏幕布局,然后使用块对其进行编程。
您可以根据需要使 MIT AI2 位变得复杂。为简单起见,我将解释噪音和语音,但有些人会做各种疯狂的事情。
这有点涉及,但为了保持这一点最简单,我们使用经典蓝牙而不是 BLE。我不确定HC06是否支持BLE。
让我们先从 Andriod 方面开始。
根据我关于不重复互联网上所有内容的政策,本教程很好地解释了 Arduino / Andriod 交互。
打开 MIT AI2 网站并创建一个新项目。窗口在设计器页面上打开,在屏幕左侧,您应该能够在用户界面下找到“按钮”。将 2 个按钮拖到空白屏幕上。
屏幕左侧的连接下方还有一个名为蓝牙客户端的图标。将其拖到屏幕上。
在传感器下方是加速传感器。也将 拖到屏幕上。
屏幕右侧允许自定义按钮。
在屏幕的右上角是一个按钮,上面写着“块”。单击它,我们将开始编程。我在上面的代码上放了图片。这并不理想,但教程编辑器不会让我做任何其他事情。
首先要做的是创建蓝牙连接,这是通过获取列表选择器并使元素等于 Andriod 设备中的蓝牙连接列表来完成的。见图1
用户选择连接后,我们调用蓝牙实例来联系 HC06 模块 - 图 2。
按钮是事件驱动的;在点击之前,他们不会做任何事情。单击时,Andriod 设备会向蓝牙实例发送一个字符,该实例将其发送到 HC06。忽略“设置全局重复”位。见图表 3 和 4
我还添加了加速度计,因为它很酷。摇动手机会激活这段代码并将另一个字符发送给 Bobbs - 图 5。
构建代码并将 apk 文件保存到您的计算机或使用 QR 码。您的 Andriod 设备必须打开开发者选项。
转到设置 > 关于手机 > 内部版本号。(三星可能会有所不同)
点击内部版本号七次。
返回设置,您将在菜单中找到开发人员选项条目。
将文件传输到 Andriod 设备后,安装它,并将手机与 HC 06 配对。除非 HC06 被弄乱,否则 PIN 码是 1234。
现在是阿杜诺时间。
下面的代码并不完整,因为它只是为了说明正在发生的事情。您的项目很可能不会交给另一个 Bobbs,我希望您无论如何都会根据自己的需要对其进行修改。
Andriod 设备正在向 HC06 发送字符,但由于其自身的原因,Aduino 正在检测 ASCII 码。这存储在“命令”字符串中,然后转换为整数以与 switch 函数一起使用。
#include
SoftwareSerial BTserial(14, 15); // RX | TX
void instruction()
{
// Decode instructions from BT device and
// take action
command = BTserial.read();
int commandvalue = command.toInt();
switch (commandvalue)
{
case 71: // G
growl();
break;
case 84: // T
getmessage();
break;
case 70: // F
fart();
break;
case 66: //B
burp();
delay(500);
speak("Better out than in");
break;
case 69: // E
speak("All the colours of the bow man");
rollseyes();
break;
case 83: // S
shake();
break;
case 76: // L
laugh();
break;
}
void setup() {
// Initialise Bobbs on start up
// Serial communications with BT device
BTserial.begin(9600);
}
void loop() {
// BT device instruction received?
if (BTserial.available())
{
instruction();
}
不只是泰勒斯威夫特可以摆脱它,鲍布斯也有动作。Bobbs 的设置是当 Andriod 设备摇晃时,或者当与其他交互(如高五或痒脚)一起调用时,他会摇晃。
电机使用大螺丝和木头牢固地固定在盒子上。摇晃是由偏心的重量引起的。
晶体管用于处理电流并避免损坏 Arduino。
#define motorpin 10
void motor(int turns)
{
// Active motor pin to turn on motor briefly
for (int i = 0; i < turns; i++)
{
digitalWrite(motorpin, HIGH);
delay(2);
digitalWrite(motorpin, LOW);
}
}
void setup() {
pinMode(motorpin, OUTPUT);
digitalWrite(motorpin, LOW);
}
void loop() {
motor(10);
}
Bobbs 不喜欢被人翻倒——暗示坏话和咆哮。
硬件非常简单——一个倾斜开关和一个电阻。如果 Bobbs 不直立,Arduino 引脚 21 会测量电压并跳转到倾斜动作程序。我通过先数 500 来让 Bobbs 脱敏,否则他会认为自己经常摔倒。
倾斜动作例程随机选择一个短语并闪烁眼睛和喇叭。
#define tiltpin 21
void tiltactions()
{
// Randomly select an action when Bobbs in tilted
choice = random(6);
eyes(255, 0, 0);
growl();
delay(750);
switch (choice)
{
case 0:
speak("Whats happening");
delay(750);
break;
case 1:
speak("This is not cool");
delay(750);
break;
case 2:
speak("Human I need help");
delay(750);
break;
case 3:
speak("This sucks");
delay(750);
break;
case 4:
speak("I'm going to puke");
delay(750);
break;
case 5:
speak("Make it stop");
delay(750);
break;
}
horns(1, 10, 5); // colour, repeat, speed
}
void setup() {
pinMode(tiltpin, INPUT);
}
void loop() {
// Is Bobbs tilited?
if (tilt > 500)
{
tiltcount += 1;
if (tiltcount > 500)
{
tiltactions();
delay(1000);
timethen = timenow;
}
}
else
{
tiltcount = 0;
}
}
天黑的时候,鲍布斯是个无赖。
我正在使用一个光电二极管,因为我有一个备用的,但我希望 LDR 也能正常工作。就像高五和搔痒的脚例程一样,这是另一个电压变化检测练习。当它变暗时,引脚 20 测量的值会发生变化,从而启动黑暗动作例程。
#define lightpin 20
int light = 0;
void darkactions()
{
// Randomly select an action to perform when it's dark
choice = random(5);
eyes(0, 0, 255);
switch (choice)
{
case 0:
speak("Is that the moon");
delay(1500);
FXserial.println("#06");
break;
case 1:
sleepnoise();
sleepnoise();
break;
case 2:
speak("Who turned off the lights");
delay(1500);
break;
case 3:
speak("Ooh creepy");
delay(750);
break;
case 4:
speak("It's dark");
delay(750);
break;
}
horns(3, 10, 5); // colour, repeat, speed
}
void setup() {
pinMode(lightpin, INPUT);
}
void loop() {
light = analogRead(lightpin);
// Is it dark?
if (light > 900) // dark
{
darkactions();
delay(1000);
timethen = timenow;
}
}
Bobbs 笑了,当他的脚被挠痒时,眼睛和角都亮了。
连接一块 Veroboard,以便连接备用条(如图所示)。当图形在条带上运行时,少量电流会导致引脚 19 记录值的变化。Bobbs 的每只脚都有一个传感器。
#define feetpin 19
void feet()
{
// Interactive feet
// Bobbs asks for his feet to be tickled
// user must respond within a set period of
// time to activate eyes, horns and make Bobbs laugh int feetnow = 0;
speak("Tickle my feet");
eyes (0, 0, 0); timethen = millis();
while ( millis() < timethen + 5000)
{
for (int i = 0; i < 200; i++)
{
feetnow = feetnow + analogRead(feetpin);
}
feetnow = feetnow / 200; if ( feetnow < 0)
{
FXserial.println("#00"); // play the laugh sound on the Adafruit board
eyes(255, 215, 0);
motor(100);
horns(1, 10, 5); // colour, repeat, speed
}
}
}
void setup(){
pinMode(feetpin, INPUT);
}
void loop(){
feet();
}
是的,还有击掌。
这是倾斜程序的发展,但在每只爪子上都有一个倾斜传感器。在这个设置中,Bobbs 要求一个高五,如果他得到一个就开始发出咕噜声。为了在 Arduino 板上保存引脚,我使用一个引脚来测量两个爪子传感器。举起常规的任一爪组。
#define pawpin 18
void pawthing()
{
// Interactive paws
// Bobbs asks for his hands to be shaken
// The user must respond in time to activate
// motor, eyes and horns
int paw = 0;
speak("Give me high five");
eyes (0, 0, 0);
timethen = millis();
while ( millis() < timethen + 5000)
{
paw = analogRead(pawpin);
if (paw < 650)
{
speak("Purrr");
horns(2, 5, 5);
}
eyes(255, 215, 0);
delay(500);
motor(100);
}
}
void setup() {
pinMode(pawpin, INPUT);
}
Team Girl 的“Make-a-bear”龙有发光的角。Bobbs 可以打败它,但我们需要一些电子设备。
我想在他的喇叭上安装 6 个三色 LED,但这意味着需要 18 个引脚(加上 0v),而我在 Arduino 上只有两个备用引脚。如果我们不反对同时在两个喇叭中打开相同颜色的 LED,我可以连接 LED,这样我只需要 9 个状态加上关闭。这听起来像是十年计数器的工作。
Arduino 从引脚 16 向 4017 上的时钟引脚发送一个脉冲,以更改输出引脚并打开每个喇叭中的 LED。Arduino 引脚 4 连接到复位。发送 10 个脉冲将在颜色和位置之间循环。
4017 引脚 - LED 对
0 - 关闭
1 - 红底
2 - 红色中间
3 - 红色上衣
4 - 绿底
5 - 绿色中间
6 - 绿色上衣
7 - 蓝底
8 - 蓝色中间
9 - 蓝色上衣
假设我们想要一种特定的颜色,比如绿色。如果我们非常快地跳过红色 LED,比如几毫秒,用户不会注意到它们打开,只会看到绿色 LED。然后我们重置 4017,这样蓝灯就不会激活。
这是执行此操作的子程序。
#define hornpin 16
#define hornresetpin 4
void setup{
pinMode(hornpin, OUTPUT);
pinMode(hornresetpin, OUTPUT);
digitalWrite(hornresetpin, LOW);
}
void resethorns(){
// Reset decade counter chip to turn off horn lights
digitalWrite(hornresetpin, HIGH);
delay(10);
digitalWrite(hornresetpin, LOW);
}
void horns(int col, int repeat, int speed)
{
// Sets the colour of the horn lights by
// cycling through the decade counter pins
// really quickly and stopping at the
// chosen colour
// parameters are colour, number of times to
// repeat the sequence and speed int start;
int end;
int limit;
for (int i = 0; i < repeat; i++)
{
resethorns();
switch (col)
{
case 0:
limit = 10;
break;
case 1: //red
limit = 3;
break;
case 2: //green
limit = 3;
for (int k = 0; k < 3; k++) // skip red
{
digitalWrite(hornpin, LOW);
delay(1);
digitalWrite(hornpin, HIGH);
delay(1);
}
break;
case 3: // blue
limit = 3;
for (int k = 0; k < 7; k++) // skip red and green
{
digitalWrite(hornpin, LOW);
delay(1);
digitalWrite(hornpin, HIGH);
delay(1);
}
break;
}
for (int j = 0; j < limit; j++)
{
digitalWrite(hornpin, LOW);
delay(speed);
digitalWrite(hornpin, HIGH);
delay(speed);
}
}
resethorns();
}
Bobbs 是 8 位 Atari 的忠实粉丝 - 查看他的其他教程。
不幸的是,他的大脑相当饱满。我不能添加太多代码,因为变量只剩下少数字节。他也用完了。
升级到 Arduino Mega 是一种选择。它有大量的引脚和更多的内存,但大小可能是个问题。
还有另一种可能;我们可以使用蓝牙连接将部分工作转移到 Android 设备上。MIT AI2 是一个非常强大的工具,可以连接到互联网。
RSS 提要阅读器怎么样?
语音识别?
全球定位系统?
Android 设备可以使用大量内容,具体取决于您的手机。
我正在看的是 Eliza 程序的现代版本。与玩具的对话可能不仅仅是想象的!
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
全部0条评论
快来发表一下你的评论吧 !