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的伺服。

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

    关注

    88

    文章

    2165

    浏览量

    60845
  • 机器学习
    +关注

    关注

    66

    文章

    8541

    浏览量

    136233
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    伺服电机控制方式简述

    伺服电机作为自动化控制系统的核心执行元件,其控制方式直接决定了设备的动态响应、定位精度和运行效率。随着工业4.0和智能制造的发展,伺服
    的头像 发表于 12-01 07:37 73次阅读
    <b class='flag-5'>伺服</b><b class='flag-5'>电机</b>的<b class='flag-5'>控制</b>方式简述

    派克Parker防爆伺服电机与普通伺服电机的区别

    Parker提供了多款不同的伺服电机,性能各有不同,针对特定易燃易爆场所使用的防爆伺服电机,与普通通用伺服
    的头像 发表于 11-20 13:36 117次阅读
    派克Parker防爆<b class='flag-5'>伺服</b><b class='flag-5'>电机</b>与普通<b class='flag-5'>伺服</b><b class='flag-5'>电机</b>的区别

    伺服电机和步进电机的核心区别

    大家在运动控制的时候是伺服电机的还是步进电机做定位控制
    的头像 发表于 10-15 14:32 1373次阅读
    <b class='flag-5'>伺服</b><b class='flag-5'>电机</b>和步进<b class='flag-5'>电机</b>的核心区别

    舵机与伺服电机的区别是什么?

    舵机与伺服电机都属于 可精确控制的驱动装置 ,但二者在定义范围、结构组成、控制方式和应用场景上存在显著差异,并非完全等同(舵机是伺服
    的头像 发表于 10-13 10:21 769次阅读

    精准控制,高效运行:永铭电容器在工业机器伺服电机驱动器中的重要角色

    随着工业自动化需求的提升,工业机器人已经广泛应用于各个生产环节,成为提升自动化水平和生产效率的重要工具。伺服电机作为工业机器人的核心部件,通过控制
    的头像 发表于 09-01 10:01 279次阅读
    精准<b class='flag-5'>控制</b>,高效运行:永铭电容器在工业<b class='flag-5'>机器</b>人<b class='flag-5'>伺服</b><b class='flag-5'>电机</b>驱动器中的重要角色

    人形机器伺服电机驱动器新动力:高性能电容器的协同作用

    PART1人形机器人心脏:伺服电机驱动器随着人工智能和机器人技术的飞速发展,人形机器人正逐步成为智能制造和未来生活的新伙伴。在这一领域,
    的头像 发表于 08-30 10:57 385次阅读
    人形<b class='flag-5'>机器</b>人<b class='flag-5'>伺服</b><b class='flag-5'>电机</b>驱动器新动力:高性能电容器的协同作用

    伺服电机中的回原点方式

    伺服电机的运行需要一个参考点,这个参考点就是原点。原点通常是由光电开关或机械开关来确定的,其位置是固定的。当伺服电机运行时,控制器会根据原点
    的头像 发表于 07-26 09:43 2746次阅读
    <b class='flag-5'>伺服</b><b class='flag-5'>电机</b>中的回原点方式

    其利天下技术·伺服电机机器人技术中的应用

    伺服电机作为机器人运动控制的核心部件,其高精度、高响应速度和高负载能力等特点,为机器人的精确运动提供了有力保障。在工业
    的头像 发表于 03-07 16:38 1587次阅读
    其利天下技术·<b class='flag-5'>伺服</b><b class='flag-5'>电机</b>在<b class='flag-5'>机器</b>人技术中的应用

    方案:双轴伺服电机驱动控制器AGV、AMR专用双伺服电机驱动控制器带

    工业机器人数控机床XY机械手双轴机器人堆垛机专用双轴伺服电机驱动控制器48V 14ARMS带有STO功能,隔离高压CAN/RS485/US
    发表于 02-15 12:14

    伺服电机实现方向改变的方法

    伺服电机是一种高精度、高响应速度的电机,广泛应用于工业自动化、机器人、航空航天等领域。在实际应用中,有时需要改变电机的旋转方向,以满足不同的
    的头像 发表于 02-12 11:07 2327次阅读

    舵机与伺服电机有的区别

          舵机和伺服电机在自动化和机器人技术领域中都是常用的执行器,它们都能够实现精确的位置控制,但二者之间存在一些基本的区别,具体如下:       一、定义与构成       1
    的头像 发表于 02-07 07:37 1743次阅读
    舵机与<b class='flag-5'>伺服</b><b class='flag-5'>电机</b>有的区别

    伺服电动缸在人形机器人中的应用

    伺服电机自身优势转变成精确速度控制、精确位置控制和精确推力控制,从而实现高精度直线运动。这种特性使其成为人形
    发表于 02-06 09:04

    电机控制器与伺服系统的关系

    在自动化控制系统中,电机控制器和伺服系统是实现精确运动控制的关键组件。电机
    的头像 发表于 01-22 09:35 1472次阅读

    伺服电机静电防护完整方案

    控制对象。伺服电机的类型多种多样,广泛应用于机器人、医学成像、实验室自动化、食品和饮料生产、金属成型等工业领域。 伺服
    的头像 发表于 01-09 14:28 1085次阅读
    <b class='flag-5'>伺服</b><b class='flag-5'>电机</b>静电防护完整方案

    伺服系统在机器人中的作用 伺服系统与传统电机对比

    位置、速度和加速度的系统,它通过接收控制信号来驱动电机,实现对机器人关节的精确控制。 精确控制伺服
    的头像 发表于 12-10 10:18 2151次阅读