chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

怎樣用Arduino和Wekinator創(chuàng)建傳感器控制接口

454398 ? 來源:工程師吳畏 ? 2019-08-02 17:31 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

輸入指令

在這個項目的輸入方面,我們需要將MPU6050傳感器Arduino UNO連接。

參考下圖,獲取有關如何將傳感器連接到Arduino的幫助。

怎樣用Arduino和Wekinator創(chuàng)建傳感器控制接口

詳細說明了MPU6050傳感器與Arduino UNO之間的連接。

安裝Arduino庫

首先,從GitHub下載I2C和MPU6050庫,以便與Arduino接口。

解壓縮或解壓縮下載文件后,導航到Arduino文件夾,復制I2C和MPU6050文件夾并將它們放在Arduino IDE庫文件夾中。

Arduino IDE庫文件夾中I2C和MPU6050文件夾的位置。

上傳代碼流程

撒哈拉title title

啟動Arduino IDE。

查找MPU6050文件夾下的示例文件。

打開MPU6050_DMP6文件。

示例下的MPU6050_DMP6文件的位置和MPU6050文件夾。

現在,上傳Arduino IDE代碼并顯示串口監(jiān)視器。

如果顯示輸出,那么這表示你‘已成功將傳感器與Arduino連接。

輸出數據顯示在Arduino中。

要將數據發(fā)送到Processing,需要對代碼進行一些更改。

首先取消注釋117代碼行并注釋100代碼行。

上傳代碼再次和它笑uld在串口監(jiān)視器中顯示為不可讀的字符。

處理代碼說明

為了從Arduino接收數據并移動3D模型,需要從bitbucket下載’toxiclibs‘庫.org。

復制zip文件中的所有文件夾并將其粘貼到Processing library文件夾中。

Processing library文件夾可以可在以下位置找到:處理文件夾》模式》 Java》庫。

現在,將下面的代碼粘貼到Processing然后上傳。

代碼是MPU6050庫中包含的示例的修改版本。

import processing.serial.*;

import processing.opengl.*;

import toxi.geom.*;

import toxi.processing.*;

import oscP5.*;

import netP5.*;

OscP5 oscP5;

NetAddress dest;

ToxiclibsSupport gfx;

Serial port; // The serial port

char[] teapotPacket = new char[14]; // InvenSense Teapot packet

int serialCount = 0; // current packet byte position

int synced = 0;

int interval = 0;

float[] q = new float[4];

Quaternion quat = new Quaternion(1, 0, 0, 0);

float[] gravity = new float[3];

float[] euler = new float[3];

float[] ypr = new float[3];

void setup() {

// 300px square viewport using OpenGL rendering

size(300, 300, OPENGL);

gfx = new ToxiclibsSupport(this);

// setup lights and antialiasing

lights();

smooth();

// display serial port list for debugging/clarity

println(Serial.list());

// get the first available port (use EITHER this OR the specific port code below)

String portName = Serial.list()[0];

// get a specific serial port (use EITHER this OR the first-available code above)

//String portName = “COM4”;

// open the serial port

port = new Serial(this, portName, 115200);

// send single character to trigger DMP init/start

// (expected by MPU6050_DMP6 example Arduino sketch)

port.write(’r‘);

/* start oscP5, sending messages at port 9000 */

oscP5 = new OscP5(this,9000);

dest = new NetAddress(“127.0.0.1”,6448);

}

void draw() {

if (millis() - interval 》 1000) {

// resend single character to trigger DMP init/start

// in case the MPU is halted/reset while applet is running

port.write(’r‘);

interval = millis();

}

// black background

background(0);

// translate everything to the middle of the viewport

pushMatrix();

translate(width / 2, height / 2);

// 3-step rotation from yaw/pitch/roll angles (gimbal lock?。?/p>

// 。..and other weirdness I haven’t figured out yet

//rotateY(-ypr[0]);

//rotateZ(-ypr[1]);

//rotateX(-ypr[2]);

// toxiclibs direct angle/axis rotation from quaternion (NO gimbal lock?。?/p>

// (axis order [1, 3, 2] and inversion [-1, +1, +1] is a consequence of

// different coordinate system orientation assumptions between Processing

// and InvenSense DMP)

float[] axis = quat.toAxisAngle();

rotate(axis[0], -axis[1], axis[3], axis[2]);

// draw main body in red

fill(255, 0, 0, 200);

box(10, 10, 200);

// draw front-facing tip in blue

fill(0, 0, 255, 200);

pushMatrix();

translate(0, 0, -120);

rotateX(PI/2);

drawCylinder(0, 20, 20, 8);

popMatrix();

// draw wings and tail fin in green

fill(0, 255, 0, 200);

beginShape(TRIANGLES);

vertex(-100, 2, 30); vertex(0, 2, -80); vertex(100, 2, 30); // wing top layer

vertex(-100, -2, 30); vertex(0, -2, -80); vertex(100, -2, 30); // wing bottom layer

vertex(-2, 0, 98); vertex(-2, -30, 98); vertex(-2, 0, 70); // tail left layer

vertex( 2, 0, 98); vertex( 2, -30, 98); vertex( 2, 0, 70); // tail right layer

endShape();

beginShape(QUADS);

vertex(-100, 2, 30); vertex(-100, -2, 30); vertex( 0, -2, -80); vertex( 0, 2, -80);

vertex( 100, 2, 30); vertex( 100, -2, 30); vertex( 0, -2, -80); vertex( 0, 2, -80);

vertex(-100, 2, 30); vertex(-100, -2, 30); vertex(100, -2, 30); vertex(100, 2, 30);

vertex(-2, 0, 98); vertex(2, 0, 98); vertex(2, -30, 98); vertex(-2, -30, 98);

vertex(-2, 0, 98); vertex(2, 0, 98); vertex(2, 0, 70); vertex(-2, 0, 70);

vertex(-2, -30, 98); vertex(2, -30, 98); vertex(2, 0, 70); vertex(-2, 0, 70);

endShape();

popMatrix();

//Send the OSC message

sendOsc();

}

void serialEvent(Serial port) {

interval = millis();

while (port.available() 》 0) {

int ch = port.read();

if (synced == 0 && ch != ‘$’) return; // initial synchronization - also used to resync/realign if needed

synced = 1;

print ((char)ch);

if ((serialCount == 1 && ch != 2)

|| (serialCount == 12 && ch != ‘ ’)

|| (serialCount == 13 && ch != ‘ ’)) {

serialCount = 0;

synced = 0;

return;

}

if (serialCount 》 0 || ch == ‘$’) {

teapotPacket[serialCount++] = (char)ch;

if (serialCount == 14) {

serialCount = 0; // restart packet byte position

// get quaternion from data packet

q[0] = ((teapotPacket[2] 《《 8) | teapotPacket[3]) / 16384.0f;

q[1] = ((teapotPacket[4] 《《 8) | teapotPacket[5]) / 16384.0f;

q[2] = ((teapotPacket[6] 《《 8) | teapotPacket[7]) / 16384.0f;

q[3] = ((teapotPacket[8] 《《 8) | teapotPacket[9]) / 16384.0f;

for (int i = 0; i 《 4; i++) if (q[i] 》= 2) q[i] = -4 + q[i];

// set our toxilibs quaternion to new data

quat.set(q[0], q[1], q[2], q[3]);

// below calculations unnecessary for orientation only using toxilibs

// calculate gravity vector

gravity[0] = 2 * (q[1]*q[3] - q[0]*q[2]);

gravity[1] = 2 * (q[0]*q[1] + q[2]*q[3]);

gravity[2] = q[0]*q[0] - q[1]*q[1] - q[2]*q[2] + q[3]*q[3];

// calculate Euler angles

euler[0] = atan2(2*q[1]*q[2] - 2*q[0]*q[3], 2*q[0]*q[0] + 2*q[1]*q[1] - 1);

euler[1] = -asin(2*q[1]*q[3] + 2*q[0]*q[2]);

euler[2] = atan2(2*q[2]*q[3] - 2*q[0]*q[1], 2*q[0]*q[0] + 2*q[3]*q[3] - 1);

// calculate yaw/pitch/roll angles

ypr[0] = atan2(2*q[1]*q[2] - 2*q[0]*q[3], 2*q[0]*q[0] + 2*q[1]*q[1] - 1);

ypr[1] = atan(gravity[0] / sqrt(gravity[1]*gravity[1] + gravity[2]*gravity[2]));

ypr[2] = atan(gravity[1] / sqrt(gravity[0]*gravity[0] + gravity[2]*gravity[2]));

// output various components for debugging

//println(“q: ” + round(q[0]*100.0f)/100.0f + “ ” + round(q[1]*100.0f)/100.0f + “ ” + round(q[2]*100.0f)/100.0f + “ ” + round(q[3]*100.0f)/100.0f);

//println(“euler: ” + euler[0]*180.0f/PI + “ ” + euler[1]*180.0f/PI + “ ” + euler[2]*180.0f/PI);

println(“ypr: ” + ypr[0]*180.0f/PI + “ ” + ypr[1]*180.0f/PI + “ ” + ypr[2]*180.0f/PI);

}

}

}

}

void drawCylinder(float topRadius, float bottomRadius, float tall, int sides) {

float angle = 0;

float angleIncrement = TWO_PI / sides;

beginShape(QUAD_STRIP);

for (int i = 0; i 《 sides + 1; ++i) {

vertex(topRadius*cos(angle), 0, topRadius*sin(angle));

vertex(bottomRadius*cos(angle), tall, bottomRadius*sin(angle));

angle += angleIncrement;

}

endShape();

// If it is not a cone, draw the circular top cap

if (topRadius != 0) {

angle = 0;

beginShape(TRIANGLE_FAN);

// Center point

vertex(0, 0, 0);

for (int i = 0; i 《 sides + 1; i++) {

vertex(topRadius * cos(angle), 0, topRadius * sin(angle));

angle += angleIncrement;

}

endShape();

}

// If it is not a cone, draw the circular bottom cap

if (bottomRadius != 0) {

angle = 0;

beginShape(TRIANGLE_FAN);

// Center point

vertex(0, tall, 0);

for (int i = 0; i 《 sides + 1; i++) {

vertex(bottomRadius * cos(angle), tall, bottomRadius * sin(angle));

angle += angleIncrement;

}

endShape();

}

}

void sendOsc() {

OscMessage msg = new OscMessage(“/wek/inputs”);

msg.add((float)ypr[2]); // x-axis

msg.add((float)ypr[1]); // y -axis

oscP5.send(msg, dest);

}

上傳后代碼,窗口應該如下所示。

輸出代碼指令

就輸出過程而言,一個簡單的界面將被設置為從Wekinator接收一個DTW輸出。

在界面內,一個方框根據收到的Wekinator輸入向左或向右移動。

你可以找到并下載加工草圖在Wekinator網站上。

下載‘Simple DTW-controlled-game’文件并在Processing中運行后,它應該如下例所示。

Wekinator說明

啟動Wekinator軟件并按照以下步驟操作:

設置輸入值為2.

將輸出值設置為1.

將輸出類型保留為默認設置“所有動態(tài)時間扭曲”并指定3種手勢類型。

‘創(chuàng)建新項目’窗口,顯示Wekinator中的輸入,輸出和手勢類型字段。

單擊“下一步”,彈出“新建項目”窗口。

‘新項目’窗口,在Wekinator中包含輸出行字段。

然后,單擊輸出1行上的“加號”按鈕并向左傾斜傳感器。輸出將沿該方向移動框。

‘新項目’窗口,帶有添加/刪除按鈕。

現在,單擊輸出2行上的“加號”按鈕,然后向右傾斜傳感器。輸出將相應地移動框。

‘New Project’窗口,在Wekinator中用輸出2行中的添加/刪除按鈕。

最后,單擊輸出3行中的加號按鈕并向后傾斜傳感器。輸出將導致框跳轉。

‘New Project’窗口,帶有在Wekinator中圈出的添加/刪除按鈕。

‘新建項目’窗口,輸出3行中的添加/刪除按鈕被圈起來。

錄制完成后,根據樣本訓練Wekinator并運行程序。

然后方框會響應傳感器傾斜的方向移動

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯系本站處理。 舉報投訴
  • 傳感器
    +關注

    關注

    2576

    文章

    54778

    瀏覽量

    789113
  • Arduino
    +關注

    關注

    190

    文章

    6523

    瀏覽量

    196459
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    MAX9924–MAX9927:可變磁阻傳感器接口的卓越之選

    MAX9924–MAX9927:可變磁阻傳感器接口的卓越之選 在汽車電子領域,精確的位置和速度傳感對于發(fā)動機、變速等關鍵系統的正常運行至關重要??勺兇抛瑁╒R)
    的頭像 發(fā)表于 01-14 14:40 ?91次閱讀

    MAX9921:雙路2線霍爾效應傳感器接口的卓越之選

    MAX9921:雙路2線霍爾效應傳感器接口的卓越之選 在電子工程師的日常設計工作中,傳感器接口的選擇至關重要,它直接影響著整個系統的性能和穩(wěn)定性。今天,我們就來深入探討一款備受關注的產
    的頭像 發(fā)表于 01-14 14:20 ?119次閱讀

    BLDC無位置傳感器控制方式介紹

    BLDC根據轉子的位置進行換向控制,而轉子位置要靠位置傳感器獲取,那么這期就為大家介紹BLDC的無位置傳感器控制方式。
    的頭像 發(fā)表于 12-30 07:55 ?9365次閱讀
    BLDC無位置<b class='flag-5'>傳感器</b><b class='flag-5'>控制</b>方式介紹

    分享1-Wire接口數字溫度傳感器IC型號

    如今,隨著測溫應用環(huán)境的升級和拓展,精準的溫度測量與控制已成為各種環(huán)境數據采集的關鍵,傳統模擬溫度傳感器已經無法滿足市場的要求,而1-Wire接口數字溫度傳感器IC的出現,極大地簡化了
    的頭像 發(fā)表于 12-02 16:34 ?584次閱讀
    分享1-Wire<b class='flag-5'>接口</b>數字溫度<b class='flag-5'>傳感器</b>IC型號

    ?基于TE Connectivity LUMAWISE運動傳感器的智能照明控制技術解析

    。LUMAWISE傳感器適合用于Zhaga-D4i生態(tài)系統,可用作獨立控制器件,也可與Zhaga-D4i光電管或通信節(jié)點搭配使用,以提高控制水平。該傳感器是一款可插拔器件,設有標準Zh
    的頭像 發(fā)表于 11-07 17:03 ?680次閱讀
    ?基于TE Connectivity LUMAWISE運動<b class='flag-5'>傳感器</b>的智能照明<b class='flag-5'>控制</b>技術解析

    STMicroelectronics AIS25BA MEMS運動傳感器深度解析與應用指南

    汽車非安全應用的需求,例如寬帶有源噪聲控制 (ANC) 和振動監(jiān)測。AIS25BA具有用戶可選的±3.85g至±7.7g滿量程范圍、傳感器數據TDM接口以及器件配置
    的頭像 發(fā)表于 10-29 10:17 ?441次閱讀
    STMicroelectronics AIS25BA MEMS運動<b class='flag-5'>傳感器</b>深度解析與應用指南

    溫度傳感器一般走哪些協議和接口

    溫度傳感器常用的通信協議和接口可根據應用場景(如工業(yè)控制、智能家居、物聯網等)和傳輸需求(距離、速度、功耗等)分為有線和無線兩大類,具體協議和接口的選擇需結合
    的頭像 發(fā)表于 09-23 17:22 ?1176次閱讀

    怎樣正確使用霍爾傳感器

    霍爾電流傳感器憑借著自身的優(yōu)勢,成為最主要、應用最廣的電流測量手段之一 銀河
    的頭像 發(fā)表于 09-08 13:26 ?979次閱讀
    <b class='flag-5'>怎樣</b>正確使用霍爾<b class='flag-5'>傳感器</b>

    #紅外傳感器有哪幾種?怎么怎樣才能選對?

    傳感器
    iczoom
    發(fā)布于 :2025年09月02日 10:52:41

    什么是照度傳感器和接近傳感器

    近年來,照度傳感器和接近傳感器在我們身邊各類設備中的應用越來越廣泛。除了單獨使用照度傳感器和接近傳感器外,將這些傳感器組合使用的情況也在不斷
    的頭像 發(fā)表于 08-22 14:46 ?2695次閱讀
    什么是照度<b class='flag-5'>傳感器</b>和接近<b class='flag-5'>傳感器</b>

    使用位置傳感器進行無刷電機控制

    刷直流電機或場定向控制 (FOC) 無刷交流電機,確實可以實現無需任何旋轉角度傳感器即可工作。但實際情況是,工業(yè)和人形機器人、自主移動機器人和直線電機運輸系統等終端設備,旋轉角度傳感器或線性位置
    的頭像 發(fā)表于 08-07 14:25 ?5766次閱讀
    使用位置<b class='flag-5'>傳感器</b>進行無刷電機<b class='flag-5'>控制</b>

    傳感器有哪些類型?有哪些接口

    傳感器的類型和接口種類繁多,以下是一些常見的分類和接口方式: 傳感器類型 溫度傳感器:用于測量溫度,常見的有熱電偶、熱電阻、數字溫度
    的頭像 發(fā)表于 05-22 09:33 ?1.4w次閱讀

    示波器測量傳感器的放大電路及供電

    傳感器放大電路的測量傳感器信號一般都比較小,示波器直接測量可能難以檢測,但傳感器的主板上面都有信號放大部分,找到這個放大器的輸出端,示波器就可以測量這個被放大后的信號。
    的頭像 發(fā)表于 05-19 13:24 ?717次閱讀
    <b class='flag-5'>用</b>示波器測量<b class='flag-5'>傳感器</b>的放大電路及供電

    ADUCM356集成化學傳感器接口的精密模擬微控制器技術手冊

    ADuCM356是一款片內系統,可控制和測量電化學傳感器和生物傳感器。ADuCM356是一款基于Arm^?^ Cortex ^?^ -M3處理的超低功耗混合信號微
    的頭像 發(fā)表于 05-08 09:55 ?891次閱讀
    ADUCM356集成化學<b class='flag-5'>傳感器</b><b class='flag-5'>接口</b>的精密模擬微<b class='flag-5'>控制器</b>技術手冊

    干簧管傳感器屬于什么傳感器

    干簧管傳感器,又稱磁簧開關傳感器或磁敏開關,是一種基于干簧管(Reed Switch)原理工作的傳感器。作為一種重要的磁傳感器,干簧管傳感器
    的頭像 發(fā)表于 01-30 15:33 ?2652次閱讀