0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

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

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

輸入指令

在這個(gè)項(xiàng)目的輸入方面,我們需要將MPU6050傳感器Arduino UNO連接。

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

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

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

安裝Arduino庫

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

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

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

上傳代碼流程

撒哈拉title title

啟動Arduino IDE。

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

打開MPU6050_DMP6文件。

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

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

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

輸出數(shù)據(jù)顯示在Arduino中。

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

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

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

處理代碼說明

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

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

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

現(xiàn)在,將下面的代碼粘貼到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);

}

上傳后代碼,窗口應(yīng)該如下所示。

輸出代碼指令

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

在界面內(nèi),一個(gè)方框根據(jù)收到的Wekinator輸入向左或向右移動。

你可以找到并下載加工草圖在Wekinator網(wǎng)站上。

下載‘Simple DTW-controlled-game’文件并在Processing中運(yùn)行后,它應(yīng)該如下例所示。

Wekinator說明

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

設(shè)置輸入值為2.

將輸出值設(shè)置為1.

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

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

單擊“下一步”,彈出“新建項(xiàng)目”窗口。

‘新項(xiàng)目’窗口,在Wekinator中包含輸出行字段。

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

‘新項(xiàng)目’窗口,帶有添加/刪除按鈕。

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

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

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

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

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

錄制完成后,根據(jù)樣本訓(xùn)練Wekinator并運(yùn)行程序。

然后方框會響應(yīng)傳感器傾斜的方向移動

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

    關(guān)注

    2553

    文章

    51523

    瀏覽量

    757354
  • Arduino
    +關(guān)注

    關(guān)注

    188

    文章

    6477

    瀏覽量

    188114
收藏 0人收藏

    評論

    相關(guān)推薦

    工業(yè)傳感器的應(yīng)用領(lǐng)域 無線傳感器網(wǎng)絡(luò)的優(yōu)勢與挑戰(zhàn)

    工業(yè)傳感器的應(yīng)用領(lǐng)域 1. 制造業(yè) 在制造業(yè)中,傳感器用于監(jiān)控生產(chǎn)線上的機(jī)器性能,包括溫度、壓力、濕度和振動等參數(shù),以確保產(chǎn)品質(zhì)量和生產(chǎn)效率。 2. 能源行業(yè) 傳感器在能源行業(yè)中用于
    的頭像 發(fā)表于 11-19 15:20 ?657次閱讀

    怎樣用THS3201實(shí)現(xiàn)輸出功率可調(diào)?

    怎樣用THS3201實(shí)現(xiàn)輸出功率可調(diào)?
    發(fā)表于 08-26 08:28

    怎樣用Arduino測試鋰電池容量

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

    基于PIR傳感器的電路圖 帶Arduino的PIR傳感器設(shè)計(jì)

    防、智能家居、自動化控制等多個(gè)領(lǐng)域。以下將詳細(xì)闡述PIR傳感器的定義、工作原理、結(jié)構(gòu)、應(yīng)用以及未來發(fā)展趨勢。
    的頭像 發(fā)表于 07-03 18:02 ?2046次閱讀
    基于PIR<b class='flag-5'>傳感器</b>的電路圖 帶<b class='flag-5'>Arduino</b>的PIR<b class='flag-5'>傳感器</b>設(shè)計(jì)

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

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

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

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

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

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

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

    全球功率系統(tǒng)和物聯(lián)網(wǎng)領(lǐng)域的半導(dǎo)體巨頭英飛凌科技股份公司,近日宣布推出一款專為Arduino用戶打造的XENSIV?傳感器擴(kuò)展板。這款多功能工具,特別為智能家居和各類消費(fèi)應(yīng)用中的智能傳感器系統(tǒng)評估而設(shè)計(jì)。
    的頭像 發(fā)表于 05-10 10:50 ?706次閱讀

    英飛凌推出用于Arduino的XENSIV傳感器擴(kuò)展板, 搭載英飛凌和Sensirion的智能家居應(yīng)用傳感器

    的XENSIVTM傳感器擴(kuò)展板,這是一款專為評估智能家居和各種消費(fèi)應(yīng)用中的智能傳感器系統(tǒng)而設(shè)計(jì)的多功能工具。這款創(chuàng)新型擴(kuò)展板將英飛凌豐富的傳感器產(chǎn)品與Sensirion的SHT35濕度和溫度
    發(fā)表于 05-07 16:35 ?870次閱讀
    英飛凌推出用于<b class='flag-5'>Arduino</b>的XENSIV<b class='flag-5'>傳感器</b>擴(kuò)展板, 搭載英飛凌和Sensirion的智能家居應(yīng)用<b class='flag-5'>傳感器</b>

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

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

    stm32f100怎樣用重映射功能?

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

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

    據(jù)麥姆斯咨詢報(bào)道,近期,英飛凌(Infineon)推出了一款支持Arduino傳感器擴(kuò)展板,用于評估智能家居和其它消費(fèi)類應(yīng)用中的智能傳感器系統(tǒng)。
    的頭像 發(fā)表于 04-10 09:05 ?2399次閱讀

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

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

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

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

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

    雷卯EMC小哥,在汽車客戶做整改中發(fā)現(xiàn),車傳感器頻繁損壞,主要的共同原因:不穩(wěn)定的電壓。
    的頭像 發(fā)表于 03-05 14:49 ?766次閱讀
    車<b class='flag-5'>用</b><b class='flag-5'>傳感器</b>頻繁損壞的原因?車<b class='flag-5'>用</b><b class='flag-5'>傳感器</b>頻繁損壞的解決方案

    電子發(fā)燒友

    中國電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會員交流學(xué)習(xí)
    • 獲取您個(gè)性化的科技前沿技術(shù)信息
    • 參加活動獲取豐厚的禮品