在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

3天內不再提示

怎樣用Arduino和Wekinator創建傳感器控制接口

454398 ? 來源:工程師吳畏 ? 2019-08-02 17:31 ? 次閱讀

輸入指令

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

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

怎樣用Arduino和Wekinator創建傳感器控制接口

詳細說明了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代碼并顯示串口監視器。

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

輸出數據顯示在Arduino中。

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

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

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

處理代碼說明

為了從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!)

// 。..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!)

// (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.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    關注

    2554

    文章

    51582

    瀏覽量

    757817
  • Arduino
    +關注

    關注

    188

    文章

    6478

    瀏覽量

    188295
收藏 人收藏

    評論

    相關推薦

    工業傳感器的應用領域 無線傳感器網絡的優勢與挑戰

    工業傳感器的應用領域 1. 制造業 在制造業中,傳感器用于監控生產線上的機器性能,包括溫度、壓力、濕度和振動等參數,以確保產品質量和生產效率。 2. 能源行業 傳感器在能源行業中用于
    的頭像 發表于 11-19 15:20 ?666次閱讀

    怎樣用THS3201實現輸出功率可調?

    怎樣用THS3201實現輸出功率可調?
    發表于 08-26 08:28

    怎樣用Arduino測試鋰電池容量

    本文詳細介紹了如何用Arduino測量鋰電池的容量。并附有電路圖和Arduino的程序代碼。
    的頭像 發表于 07-30 09:14 ?1115次閱讀
    <b class='flag-5'>怎樣用</b><b class='flag-5'>Arduino</b>測試鋰電池容量

    基于PIR傳感器的電路圖 帶Arduino的PIR傳感器設計

    防、智能家居、自動化控制等多個領域。以下將詳細闡述PIR傳感器的定義、工作原理、結構、應用以及未來發展趨勢。
    的頭像 發表于 07-03 18:02 ?2108次閱讀
    基于PIR<b class='flag-5'>傳感器</b>的電路圖 帶<b class='flag-5'>Arduino</b>的PIR<b class='flag-5'>傳感器</b>設計

    怎么表測量溫度傳感器的好壞

    表是一種常用的測量工具,可以用來測量電壓、電流、電阻等參數。然而,對于溫度傳感器的測量,萬表可能不是最佳選擇。溫度傳感器通常使用熱電偶、熱敏電阻或半導體
    的頭像 發表于 06-19 15:06 ?2961次閱讀

    振動電阻式傳感器測量模塊的傳感器接口

    振動電阻式傳感器測量模塊的傳感器接口 RM502模塊采用了高精度模擬信號驅動和采集技術,能夠驅動和測量對電阻精度要求較高的傳感器。它采用恒流驅動和實時電流測量,有效避免了環境溫度變化引
    的頭像 發表于 06-11 14:13 ?480次閱讀
    振動電阻式<b class='flag-5'>傳感器</b>測量模塊的<b class='flag-5'>傳感器</b><b class='flag-5'>接口</b>

    stm32f105主控作為傳感器信號采集,精度和抗干擾怎樣

    stm32f105主控作為傳感器信號采集,精度和抗干擾怎樣。。。。?模擬采樣的時候,外圍如何處理比較得當。。 現在做個東西,INA128U 采集壓力
    發表于 05-11 08:08

    英飛凌推出用于Arduino的XENSIVTM傳感器擴展板

    全球功率系統和物聯網領域的半導體巨頭英飛凌科技股份公司,近日宣布推出一款專為Arduino用戶打造的XENSIV?傳感器擴展板。這款多功能工具,特別為智能家居和各類消費應用中的智能傳感器系統評估而設計。
    的頭像 發表于 05-10 10:50 ?713次閱讀

    英飛凌推出用于Arduino的XENSIV傳感器擴展板, 搭載英飛凌和Sensirion的智能家居應用傳感器

    的XENSIVTM傳感器擴展板,這是一款專為評估智能家居和各種消費應用中的智能傳感器系統而設計的多功能工具。這款創新型擴展板將英飛凌豐富的傳感器產品與Sensirion的SHT35濕度和溫度
    發表于 05-07 16:35 ?880次閱讀
    英飛凌推出用于<b class='flag-5'>Arduino</b>的XENSIV<b class='flag-5'>傳感器</b>擴展板, 搭載英飛凌和Sensirion的智能家居應用<b class='flag-5'>傳感器</b>

    怎樣用STM8L的PB3/TIM2_TRIG的引腳測量脈寬?

    怎樣用STM8L的PB3/TIM2_TRIG的引腳測量脈寬?
    發表于 05-07 06:55

    stm32f100怎樣用重映射功能?

    的是stm32f100c8t6b芯片,現在想用將PB1映射為TIM1_CH3N,在調用GPIO_PinAFConfig(GPIOB,GPIO_PinSource1,GPIO_AF_TIM1)時, GPIO_PinAFConfig和GPIO_AF_TIM1都沒定義,stm32f100
    發表于 05-07 06:06

    英飛凌和盛思銳合作推出一款支持Arduino傳感器擴展板

    據麥姆斯咨詢報道,近期,英飛凌(Infineon)推出了一款支持Arduino傳感器擴展板,用于評估智能家居和其它消費類應用中的智能傳感器系統。
    的頭像 發表于 04-10 09:05 ?2413次閱讀

    STM32F412G-DISCO怎樣用MX生成fatfs的代碼?

    STM32F412G-DISCO怎樣用MX生成fatfs的代碼? SD卡例程能跑,但mx生成的代碼不能正常運行,我生成代碼后是不是還要配置一些東西?(我生成后只寫了測試代碼) 問題解決了,雖然我不知道我為什么不能直接使用mx生成的代碼去操作sd卡,但我通過復制粘貼例程的代碼完成了測試。
    發表于 03-12 08:15

    ?車傳感器頻繁損壞的原因及解決方案

    1.車傳感器頻繁損壞的原因?雷卯EMC小哥,在汽車客戶做整改中發現,車傳感器頻繁損壞,主要的共同原因:不穩定的電壓。在車輛工作過程中,電壓波動是無法避免的。這些波動可能源自發動機的
    的頭像 發表于 03-06 08:02 ?1265次閱讀
    ?車<b class='flag-5'>用</b><b class='flag-5'>傳感器</b>頻繁損壞的原因及解決方案

    傳感器頻繁損壞的原因?車傳感器頻繁損壞的解決方案

    雷卯EMC小哥,在汽車客戶做整改中發現,車傳感器頻繁損壞,主要的共同原因:不穩定的電壓。
    的頭像 發表于 03-05 14:49 ?778次閱讀
    車<b class='flag-5'>用</b><b class='flag-5'>傳感器</b>頻繁損壞的原因?車<b class='flag-5'>用</b><b class='flag-5'>傳感器</b>頻繁損壞的解決方案
    主站蜘蛛池模板: 国产一区二区在线观看免费 | 亚洲一区在线观看视频 | 午夜影视啪啪免费体验区深夜 | 亚洲欧洲精品成人久久曰影片 | 欧洲精品不卡1卡2卡三卡四卡 | 91国内在线观看 | 日本亚洲天堂网 | 亚洲综合激情六月婷婷在线观看 | 在线观看亚洲人成网站 | 伊人精品久久久大香线蕉99 | 天堂在线链接 | 91极品视频在线观看 | 国产午夜视频高清 | 国产精品天天操 | ww欧洲ww欧洲视频 | 男女爱爱是免费看 | 人人艹人人草 | 天天色官网 | 你懂的视频在线观看资源 | baoyu污污网站入口免费 | www色午夜| 亚洲日本在线观看视频 | 欧美一区视频 | 欧美1| 天天操人人 | 五月天婷婷在线视频 | 99久久综合精品免费 | 在线观看你懂的网址 | 综合第一页 | 四虎影院在线免费播放 | 国内真实实拍伦视频在线观看 | jiucao在线观看精品 | 四虎国产精品视频免费看 | 曰本aaaaa毛片午夜网站 | 日日艹| 欧美三级成人 | 1024你懂的国产在线播放 | 99热最新| 2018天天干天天操 | 5x性区m免费毛片视频看看 | 亚洲国产精品婷婷久久 |