首页 / 行业
怎样用语音命令控制直流电机
2019-07-31 11:36:00
电路图
建立连接如下:
ENA L298N到Arduino 11的引脚
L298N的ENB到Arduino的10号引脚
L298N的IN1到Arduino的9号引脚
L298N的IN2到Arduino的第8针
L298N的IN3到Arduino的第7针
L298N的IN4到Arduino的第6针
将正在使用的电池电源正极连接到L298N的12V连接器,电池到L298N的GND,以及L298N的GND到GND of Arduino
最后,连接L298N两端的两个电机
如何运行程序
首先,在Arduino IDE的帖子末尾复制并粘贴Arduino代码并上传代码。
然后从Wekinator的示例页面下载草图。
下载MFCC的可执行文件(mel-frequency cepstral coefficient)。我有一个64位操作系统,所以我下载了“win64”。
下载后,将其解压缩并运行“.exe”文件。它将如下所示。现在您需要一个麦克风来为Wekinator提供输入。如果已连接外接麦克风,请确保在声音设置中选择了该麦克风。
您需要另一个草图来获取Wekinator的输出。该草图在本文末尾给出。将其粘贴到新的处理窗口并运行草图。
打开Wekinator并进行如下图所示的设置。将输入设置为13,将输出设置为1.将类型设置为“所有动态时间扭曲”,使用5种手势类型,然后单击“下一步”。
现在按住output_1前面的“+”按钮并说“前进”。
然后按住output_2前面的“+”按钮并说出“向后”。
然后按住output_3前面的“+”按钮并说出“right”。
然后按住output_4前面的“+”按钮并说“左”。
然后按住“ outpu前面的+“按钮t_5并说“停止”。
然后,单击“Train”,然后单击“Run”。确保已上载Arduino代码并且处理草图正在后台运行。现在电机应根据您的声控命令移动。尝试用你的声音进行测试,并在需要时重复上述步骤进行重新训练。
它是如何工作的?
总之,这个项目有三个部分:Wekinator,Processing和Arduino。使用机器学习,Wekinator正在告诉处理它正在收听的语音是否是预先训练好的语音命令。然后处理读取该消息并将其传递给Arduino,然后Arduino决定是否顺时针/逆时针转动电机。 Wekinator和处理之间发生的所有通信都是通过OSC(开放式声音控制)协议。处理和Arduino之间的通信是通过串口完成的。
Arduino代码
#include //Including the library that will help us in receiving and sending the values from processing
ValueReceiver《1》 receiver; /*Creating the receiver that will receive only one value.
Put the number of values to synchronize in the brackets */
/* The below variable will be synchronized in the processing
and it should be same on both sides. */
int output;
//Motor Pins
int EN_A = 11;
int IN1 = 9;
int IN2 = 8;
int IN3 = 7;
int IN4 = 6;
int EN_B = 10;
void setup()
{
/* Starting the serial communication because we are communicating with the
Processing through serial. The baudrate should be same as on the processing side. */
Serial.begin(19200);
//Initializing the motor pins as output
pinMode(EN_A, OUTPUT);
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
pinMode(EN_B, OUTPUT);
digitalWrite(EN_A, HIGH);
digitalWrite(EN_B, HIGH);
// Synchronizing the variable with the processing. The variable must be int type.
receiver.observe(output);
}
void loop()
{
// Receiving the output from the processing.
receiver.sync();
// Matching the received output to light up led‘s
if (output == 1)
{
//Forward
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
}
else if (output == 2)
{
//Backward
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, HIGH);
}
else if (output == 3)
{
//Right
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
}
else if (output == 4)
{
//Left
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
}
else if (output == 5)
{
//Stop
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
}
}
处理代码
import vsync.*; // Importing the library that will help us in sending and receiving the values from the Arduino
import processing.serial.*; // Importing the serial library
// Below libraries will connect and send, receive the values from wekinator
import oscP5.*;
import netP5.*;
// Creating the instances
OscP5 oscP5;
NetAddress dest;
ValueSender sender;
// This variable will be syncronized with the Arduino and it should be same on the Arduino side.
public int output;
void setup()
{
// Starting the serial communication, the baudrate and the com port should be same as on the Arduino side.
Serial serial = new Serial(this, “COM10”, 19200);
sender = new ValueSender(this, serial);
// Synchronizing the variable as on the Arduino side.
sender.observe(“output”);
// Starting the communication with wekinator. listen on port 12000, return messages on port 6448
oscP5 = new OscP5(this, 12000);
dest = new NetAddress(“127.0.0.1”, 6448);
}
//This is called automatically when OSC message is received
void oscEvent(OscMessage theOscMessage) {
if (theOscMessage.checkAddrPattern(“/output_1”)==true)
{
output = 1;
}
else if (theOscMessage.checkAddrPattern(“/output_2”)==true)
{
output = 2;
}
else if (theOscMessage.checkAddrPattern(“/output_3”) == true)
{
output = 3;
}
else if (theOscMessage.checkAddrPattern(“/output_4”) == true)
{
output = 4;
}
else if (theOscMessage.checkAddrPattern(“/output_5”) == true)
{
output = 5;
}
else
{
}
}
void draw()
{
// Nothing to be drawn for this example
}
最新内容
手机 |
相关内容
逆变器技术对新能源汽车市场增长的
逆变器技术对新能源汽车市场增长的重要性,市场,新能源汽车,逆变器,控制,高效率,能和,随着全球对环境保护和可持续发展的关注不断增什么是高压接触器,高压接触器的组成
什么是高压接触器,高压接触器的组成、特点、原理、分类、常见故障及预防措施,高压,分类,闭合,用于,操作,损坏,AD694ARZ高压接触器是什么是射流继电器,射流继电器的基本
什么是射流继电器,射流继电器的基本结构、技术参数、工作原理、负载分类、如何选用、操作规程及发展历程,继电器,工作原理,分类,负什么是NFC控制器,NFC控制器的组成、
什么是NFC控制器,NFC控制器的组成、特点、原理、分类、常见故障及预防措施,控制器,分类,模式,移动支付,数据,信号,NFC(Near Field Com什么是电机启动器,电机启动器的基本
什么是电机启动器,电机启动器的基本结构、优缺点、工作原理、类型、检测、操作规程及发展历程,工作原理,类型,检测,结构,启动,断开,射频连接器使用技巧与注意事项
射频连接器使用技巧与注意事项,连接器,选择,频率,类型,连接,传输,射频连接器是一种用于连接射频电路的电子元件,常用于无线通信系统电流互感器作用 电流互感器为什么
电流互感器作用 电流互感器为什么一端要接地?,作用,误差,原因,连接,测量,短路故障,电流互感器(Current Transformer,简称CT)是一种用于人形机器人风起,连接器待势乘时
人形机器人风起,连接器待势乘时,连接器,人形机器人,工作效率,性强,研发,光纤,近年来,人形机器人在人工智能领域取得了巨大的进展。随