0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

怎样用机器学习和openFrameworks控制伺服电机

454398 来源:工程师吴畏 2019-08-02 17:52 次阅读

电路图

伺服电机Arduino之间建立以下连接:

黄色线是信号线。将其连接到Arduino上的数字引脚2。

棕色线是地线。将它连接到Arduino上的GND 。

红色线是电源线。将其连接到Arduino上的 5V 引脚。

怎样用机器学习和openFrameworks控制伺服电机

根据上面的电路图在伺服电机和Arduino UNO之间建立连接。

编程Arduino

在Arduino代码中,我们首先包含了伺服库并为伺服初始化了一些变量。

然后在设置函数中,我们将伺服连接到Arduino的引脚2并开始串行通信

在循环功能中,我们查找了输入数据,如果有任何数据可用,我们将读取它并根据此值伺服电机将移动。

// Code to control servo motor from openframeworks using wekinator

#include //including the servo library

Servo sg90; //including a variable for servo named sg90

int servo_pin = 2;

void setup() {

sg90.attach(servo_pin); //Giving the command to arduino to control pin 2 for servo

// Start the serial communication

Serial.begin(9600);

}

void loop() {

if (Serial.available()) { // If there is any data available

int inByte = Serial.read(); // Get the incoming data

sg90.write(inByte);

}

}

编程openFrameworks

在openFrameworks方面,我们有三个用于发送和的文件从Wekinator接收数据,也将帮助我们将数据发送到Arduino。

Main.cpp

Main .cpp运行应用程序并打开输出窗口。

以下代码适用于Main.cpp:

#include “ofMain.h”

#include “ofApp.h”

//========================================================================

int main( ){

ofSetupOpenGL(600, 480, OF_WINDOW); // 《-------- setup the GL context

// this kicks off the running of my app

// can be OF_WINDOW or OF_FULLSCREEN

// pass in width and height too:

ofRunApp(new ofApp());

}

OfApp.cpp

OfApp.cpp代码是Arduino和openFrameworks之间存在串行通信的地方。它也是openFrameworks和Wekinator之间的OSC通信。

#include “ofApp.h”

#include “ofxOsc.h”

//--------------------------------------------------------------

void ofApp::setup(){

sender.setup(HOST, SENDPORT);

receiver.setup(RECEIVEPORT);

ofSetFrameRate(60);

serial.listDevices();

vector deviceList = serial.getDeviceList();

// this should be set to whatever com port your serial device is connected to.

// (ie, COM4 on a pc, /dev/tty.。.. on linux, /dev/tty.。. on a mac)

// arduino users check in arduino app.。..

int baud = 9600;

serial.setup(0, baud);

//open the first device

// windows example

//serial.setup(“COM10”, baud);

// mac osx example

//serial.setup(“/dev/tty.usbserial-A4001JEC”, baud);

//linux example

//serial.setup(“/dev/ttyUSB0”, baud);

}

//--------------------------------------------------------------

void ofApp::update(){

// Sending data to the wekinator

ofxOscMessage m;

m.setAddress(string(SENDMESSAGE));

m.addFloatArg((float)mouseX);

m.addFloatArg((float)mouseY);

sender.sendMessage(m, false);

// looking for incoming messages from wekinator

while (receiver.hasWaitingMessages()) {

ofxOscMessage msg;

receiver.getNextMessage(&msg); // Get Message

if (msg.getAddress() == RECEIVEMESSAGE) {

outputData = msg.getArgAsFloat(0); // Stored it

}

}

serial.writeByte(outputData); // sending the data to arduino

}

//--------------------------------------------------------------

void ofApp::draw(){

ofSetColor(255, 0, 0);

string buf = “Sending message ” + string(SENDMESSAGE) + “ to ” + string(HOST) + “ on port ” + ofToString(SENDPORT);

ofDrawBitmapString(buf, 10, 20);

buf = “X=” + ofToString(mouseX) + “, Y=” + ofToString(mouseY);

ofDrawBitmapString(buf, 10, 50);

ofSetColor(0, 255, 0);

ofDrawRectangle(mouseX, mouseY, boxSize, boxSize);

}

//--------------------------------------------------------------

void ofApp::mouseDragged(int x, int y, int button){

mouseX = x;

mouseY = y;

}

在设置功能中,我们首先设置发送器和接收器,然后查找串口。一旦找到,它将自动连接。

在更新功能中,我们首先将滑块的X和Y值发送到Wekinator。然后,我们从接收器中查找传入的消息。当任何数据可用时,它将存储它并将其发送到Arduino。

在绘图功能中,我们制作了一个滑块,当我们拖动它时它会移动。

OfApp.h

OfApp.h文件是头文件。

#pragma once

#include “ofMain.h”

#include “ofxOsc.h”

//Defaults for OSC:

#define HOST “127.0.0.1”

#define SENDPORT 6448

#define RECEIVEPORT 12000

#define SENDMESSAGE “/wek/inputs”

#define RECEIVEMESSAGE “/wek/outputs”

class ofApp : public ofBaseApp{

public:

void setup();

void update();

void draw();

void mouseDragged(int x, int y, int button);

ofxOscSender sender;

ofxOscReceiver receiver;

ofSerial serial;

int mouseX = 0;

int mouseY = 0;

int boxSize = 30;

char outputData;

};

如何运行openFrameworks草图

使用openFrameworks中的项目生成器创建一个新项目。此项目需要‘Ofxosc’插件。

将上一节中给出的代码复制到相应的文件中并构建项目。构建项目后,您将看到如下所示的输出窗口。

openFrameworks中的输出窗口。

在Wekinator中设置项目

设置openFrameworks后,打开Wekinator并调整设置以匹配下图所示的设置。

将输入设置为2,输出设置为1.选择输出类型为“custom”,然后单击“configure”。

在Wekinator中设置输入,输出和类型字段以匹配上面显示的字段。

接下来,将最小值设置为0,将最大值设置为180,然后单击“完成”。

自定义输出类型至少为0和a最多180个。

点击“下一步”,将出现“新建项目”窗口。

按照上面列出的步骤并单击下一步后,您将进入Wekinator的New Project窗口。

将处理窗口中的绿色框拖动到屏幕左侧的中心,然后单击“随机化” ”。开始录制一秒钟,让Wekinator记录一些样本。

将绿色框拖到屏幕左侧以记录您的第一个输出。

现在将处理窗口中的绿框拖到窗口中心,然后单击“随机化”。开始录制半秒。

将绿色框移动到中心以允许Wekinator记录更多样本。

最后,将处理窗口中的绿色框拖动到右侧中心,然后单击随机化。开始录制半秒。

将绿色框移动到窗口的右侧,以允许Wekinator制作第三组样本。

为Wekinator制作了三组样本后,点击“ train”,然后点击“运行”。

现在,当您在openFrameworks窗口中拖动滑块时,它将控制并移动连接到Arduino的伺服。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 伺服电机
    +关注

    关注

    82

    文章

    1828

    浏览量

    56039
  • 机器学习
    +关注

    关注

    66

    文章

    8062

    浏览量

    130442
收藏 人收藏

    评论

    相关推荐

    如何使用Arduino UNO板和电位器控制伺服电机

    在本Arduino伺服电机教程中,您将学习如何使用Arduino UNO板和电位器控制伺服电机
    的头像 发表于 02-11 10:11 388次阅读
    如何使用Arduino UNO板和电位器<b class='flag-5'>控制</b><b class='flag-5'>伺服</b><b class='flag-5'>电机</b>

    伺服电机的三种控制方式 如何确定选择伺服电机控制方式?

    伺服电机的三种控制方式 如何确定选择伺服电机控制方式? 伺服
    的头像 发表于 12-26 14:02 601次阅读

    怎样验证防爆伺服电机是否过冲呢?

    怎样验证防爆伺服电机是否过冲呢? 验证防爆伺服电机是否过冲是非常重要的,因为过冲可能导致设备损坏、事故发生,甚至危及人员的生命安全。下面将详
    的头像 发表于 12-25 11:47 318次阅读

    怎样用ADAU1761设计DRC的压缩/扩展?

    请问怎样用ADAU1761设计DRC的压缩/扩展。我在SigmaStudio 4.5的模块中只找到RMS。如果ADAU1761设计DRC要怎样
    发表于 11-28 06:41

    怎样用32单片机测电压?

    怎样用32单片机测电压
    发表于 10-31 07:09

    总线伺服电机的回零控制方法

    通过总线控制伺服电机时,如何进行回零(寻参考点)控制?这里就CANOPEN伺服电机的回零
    的头像 发表于 10-23 11:42 1670次阅读
    总线<b class='flag-5'>伺服</b><b class='flag-5'>电机</b>的回零<b class='flag-5'>控制</b>方法

    PLC怎么控制伺服电机

    在回答这个问题之前,首先要清楚伺服电机的用途,相对于普通的电机来说,伺服电机主要用于精确定位,因此大家通常所说的
    发表于 09-08 11:22 759次阅读

    PLC是怎么控制伺服电机的?

    在回答这个问题之前,首先要清楚伺服电机的用途,相对于普通的电机来说,伺服电机主要用于精确定位,因此大家通常所说的
    发表于 08-09 09:25 619次阅读

    机器伺服电机的选型要点

    机器人在运行过程中,是通过伺服电机的驱动实现多自由度的运动的。如果对机器人运行的动作速度、精度有比较高的要求,实际就要求伺服
    的头像 发表于 08-03 10:31 973次阅读

    如何使用操纵杆和Arduino控制伺服电机

    在这篇文章中,我们将学习如何使用操纵杆和Arduino控制伺服电机。我们将看到有关操纵杆,其销,其结构和工作的概述。我们将从操纵杆中提取有用的数据,这些数据将成为
    的头像 发表于 07-27 11:47 1130次阅读
    如何使用操纵杆和Arduino<b class='flag-5'>控制</b><b class='flag-5'>伺服</b><b class='flag-5'>电机</b>

    如何使用单片机控制伺服电机

    伺服电机是我们常用的一种电机,在本文的案例中,将学习如何使用单片机控制伺服
    的头像 发表于 07-06 10:53 2843次阅读
    如何使用单片机<b class='flag-5'>控制</b><b class='flag-5'>伺服</b><b class='flag-5'>电机</b>?

    抓取机器人为什么都采用伺服电机

    抓取机器人需要对物体进行高精度、高速度的抓取和放置,因此需要使用高性能的伺服电机来实现精准的运动控制。相比于其他类型的电机
    的头像 发表于 06-15 09:15 383次阅读

    机器人关节伺服电机PID串级控制

    通常由电机控制器、电机驱动、电机本体(多为伺服电机)组成。
    发表于 05-06 11:06 1次下载
    <b class='flag-5'>机器</b>人关节<b class='flag-5'>伺服</b><b class='flag-5'>电机</b>PID串级<b class='flag-5'>控制</b>

    PLC如何控制伺服电机?如何设计伺服系统?

    在回答这个问题之前,首先要清楚伺服电机的用途,相对于普通的电机来说,伺服电机主要用于精确定位,因此大家通常所说的
    的头像 发表于 04-27 17:34 1126次阅读
    PLC如何<b class='flag-5'>控制</b><b class='flag-5'>伺服</b><b class='flag-5'>电机</b>?如何设计<b class='flag-5'>伺服</b>系统?

    请问怎样用一个脉冲使伺服电机旋转呢?

    请问怎样用一个脉冲(信号的一开一关)来从伺服驱动器位置控制上使伺服电机旋转呢?
    发表于 03-30 17:21