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

    文章

    2259

    浏览量

    62802
  • 机器学习
    +关注

    关注

    67

    文章

    8595

    浏览量

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    伺服电机:精准控制的动力核心

    一种分类方式是按照用途划分,主要分为驱动电机控制电机两类;控制电机包括步进电机
    的头像 发表于 07-30 08:40 576次阅读

    探索Terasic伺服电机套件:从基础到实战设计

    探索Terasic伺服电机套件:从基础到实战设计 在电子工程领域,伺服电机控制是一个关键的技术方向,它广泛应用于
    的头像 发表于 07-01 14:15 267次阅读

    Parallax Servo Controller(#28023)Rev B:强大的16通道伺服控制

    Parallax Servo Controller(#28023)Rev B:强大的16通道伺服控制器 在机器人设计领域,随着机器人规模的增大,对
    的头像 发表于 06-12 15:05 326次阅读

    OMRON Accurax G5伺服电机:高精度运动控制的理想之选

    OMRON Accurax G5伺服电机:高精度运动控制的理想之选 在工业自动化领域,伺服电机作为关键的动力设备,对于实现精确的运动
    的头像 发表于 06-10 14:50 328次阅读

    欧姆龙Sigma-II旋转伺服电机:运动控制的理想之选

    欧姆龙Sigma-II旋转伺服电机:运动控制的理想之选 在运动控制领域,伺服电机的性能直接影响着
    的头像 发表于 06-10 14:40 431次阅读

    基于MCU主控芯片的高性能伺服电机方案

    在工业自动化设备中,伺服电机系统是实现精密运动控制的关键环节。无论是工业机器人还是数控加工中心,都离不开稳定、高效的驱动控制核心——而MCU
    的头像 发表于 04-28 15:32 433次阅读
    基于MCU主控芯片的高性能<b class='flag-5'>伺服</b><b class='flag-5'>电机</b>方案

    伺服电机胶解决方案

    在工业机器人、数控机床和新能源汽车的驱动系统中,伺服电机承担着精准执行每一个动作指令的任务。工程师们在调试和运行中,常常会面对一些难以捉摸的问题:信号偶尔失真、绝缘性能下降、元件松动——问题不大,却
    的头像 发表于 04-02 17:40 371次阅读
    <b class='flag-5'>伺服</b><b class='flag-5'>电机</b><b class='flag-5'>用</b>胶解决方案

    在 VisionFive 2 上实现机器伺服控制

    control 在本演示中,PCA9685用于控制机器伺服伺服的核心是直流电机。通过电位器和齿轮,当输入不同的PWM(脉宽调制)信
    发表于 03-05 07:09

    PLC怎么控制多台交流伺服电机达到同步工作

    在现代工业自动化控制系统中,多台交流伺服电机的同步控制是实现高精度运动控制的关键技术之一。PLC(可编程逻辑
    的头像 发表于 02-27 17:04 1795次阅读
    PLC怎么<b class='flag-5'>控制</b>多台交流<b class='flag-5'>伺服</b><b class='flag-5'>电机</b>达到同步工作

    三菱FX3U PLC控制伺服电机的高速脉冲模式解析

    三菱FX3U做为一款入门级PLC,应用很广泛,其实学习PLC就几点,开关量的输入、输出,就是我们平常所说的IO、伺服(或者步进电机)的控制、Modbus通信、模拟量输入输出,掌握了这些
    的头像 发表于 01-27 15:51 3643次阅读
    三菱FX3U PLC<b class='flag-5'>控制</b><b class='flag-5'>伺服</b><b class='flag-5'>电机</b>的高速脉冲模式解析

    伺服电机控制方式简述

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

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

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

    伺服电机控制系统的高宽带电流环参数设计

    上回我们介绍了EtherCAT是如何利用SSC产生的sync信号,与电机控制系统完成同步的,如此我们即可保证整个控制系统的同步性能伺服控制
    的头像 发表于 11-17 09:53 8401次阅读
    <b class='flag-5'>伺服</b><b class='flag-5'>电机</b><b class='flag-5'>控制</b>系统的高宽带电流环参数设计

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

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

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

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