我使用的是陀螺仪/加速计传感器(https://www.sparkfun.com/products/13284)用Arduino来记录旋转。我总共使用了八个这样的传感器。我还使用多路复用器来帮助多个传感器(https://learn.adafruit.com/adafruit-tca9548a-1-to-8-i2c-multiplexer-breakout/overview).在我的Arduino接收到数据后,我用它来处理所有旋转传感器的二维图像。
我目前遇到了一个严重滞后的问题(旋转动画停止,然后多次重新启动)。我正在使用视觉界面处理和串行通信将数据从Arduino(带有附加传感器)发送到正在运行处理的计算机。
目前,我的代码读取传感器,然后发送一个带有字母前缀的值,稍后由处理代码解析。例如,如果它读取“传感器的x1值”,它会发送“S”后跟关联的x1值。在处理端,它首先检查“S”是否存在,如果存在,则将以下值读入动画显示的适当变量中。
附件是Arduino代码(.ino文件)和加工草图(.pde文件)。为了加快数据处理速度,我尝试读取动画每帧四分之一的数据。因此,在每次从Arduino发送数据时都会运行的“serialEvent”方法中,有一些条件,如“if(frameCount%4==0){read first quarter of data}”、“if(frameCount%4==1){read second quarter of data}”等。这也不起作用,但您将在下面的代码中看到它。
任何帮助!
ARDUINO代码:
#include<Wire.h>
#include "Wire.h"
#define TCAADDR 0x70
extern "C" {
#include "utility/twi.h" // from Wire library, so we can do bus scanning
#include <LSM9DS1_Registers.h>
#include <LSM9DS1_Types.h>
#include <SparkFunLSM9DS1.h>
#include <SPI.h>
LSM9DS1 imu;
#define LSM9DS1_AG 0x6B // Would be 0x6A if SDO_AG is LOW
#define PRINT_CALCULATED
}
const int MPU_addr = 104; // I2C address of the MPU-6050
int16_t AcX, AcY, AcZ, Tmp, GyX, GyY, GyZ;
void tcaselect(uint8_t i) {
if (i > 7) return;
Wire.beginTransmission(TCAADDR);
Wire.write(1 << i);
Wire.endTransmission();
}
void setup() {
Serial.begin(9600);
Wire.begin();
tcaselect(0);
setter();
tcaselect(1);
setter();
tcaselect(2);
setter();
tcaselect(3);
setter();
tcaselect(4);
setter();
tcaselect(5);
setter();
tcaselect(6);
setter();
tcaselect(7);
setter();
Serial.println("done");
}
void loop() {
tcaselect(0);
looperZero();
tcaselect(1);
looperOne();
tcaselect(2);
looperTwo();
tcaselect(3);
looperThree();
tcaselect(4);
looperFour();
tcaselect(5);
looperFive();
tcaselect(6);
looperSix();
tcaselect(7);
looperSeven();
}
void setter() {
Serial.begin(9600);
imu.settings.device.commInterface = IMU_MODE_I2C;
imu.settings.device.agAddress = LSM9DS1_AG;
imu.begin();
}
void looperZero() {
imu.readAccel();
Serial.print("A");
Serial.println(imu.calcAccel(imu.ax), 2);
//delay(10);
Serial.print("B");
Serial.println(imu.calcAccel(imu.ay), 2);
//delay(10);
Serial.print("C");
Serial.println(imu.calcAccel(imu.az), 2);
//delay(10);
//
// imu.readGyro(); // Update gyroscope data
// Serial.print("a");
// Serial.println(imu.calcGyro(imu.gx)); // Print x-axis rotation in DPS
// Serial.print("b");
// Serial.println(imu.calcGyro(imu.gy)); // Print y-axis rotation in DPS
// Serial.print("c");
// Serial.println(imu.calcGyro(imu.gz)); // Print z-axis rotation in DPS
}
void looperOne() {
imu.readAccel();
Serial.print("D");
Serial.println(imu.calcAccel(imu.ax), 2);
//delay(10);
Serial.print("E");
Serial.println(imu.calcAccel(imu.ay), 2);
//delay(10);
Serial.print("F");
Serial.println(imu.calcAccel(imu.az), 2);
//delay(10);
//
// imu.readGyro(); // Update gyroscope data
// Serial.print("d");
// Serial.println(imu.calcGyro(imu.gx)); // Print x-axis rotation in DPS
// Serial.print("e");
// Serial.println(imu.calcGyro(imu.gy)); // Print y-axis rotation in DPS
// Serial.print("f");
// Serial.println(imu.calcGyro(imu.gz)); // Print z-axis rotation in DPS
}
void looperTwo() {
imu.readAccel();
Serial.print("G");
Serial.println(imu.calcAccel(imu.ax), 2);
//delay(10);
Serial.print("H");
Serial.println(imu.calcAccel(imu.ay), 2);
//delay(10);
Serial.print("I");
Serial.println(imu.calcAccel(imu.az), 2);
//delay(10);
// imu.readGyro(); // Update gyroscope data
// Serial.print("g");
// Serial.println(imu.calcGyro(imu.gx)); // Print x-axis rotation in DPS
// Serial.print("h");
// Serial.println(imu.calcGyro(imu.gy)); // Print y-axis rotation in DPS
// Serial.print("i");
// Serial.println(imu.calcGyro(imu.gz)); // Print z-axis rotation in DPS
//
}
void looperThree() {
imu.readAccel();
Serial.print("J");
Serial.println(imu.calcAccel(imu.ax), 2);
//delay(10);
Serial.print("K");
Serial.println(imu.calcAccel(imu.ay), 2);
//delay(10);
Serial.print("L");
Serial.println(imu.calcAccel(imu.az), 2);
//delay(10);
// imu.readGyro(); // Update gyroscope data
// Serial.print("j");
// Serial.println(imu.calcGyro(imu.gx)); // Print x-axis rotation in DPS
// Serial.print("k");
// Serial.println(imu.calcGyro(imu.gy)); // Print y-axis rotation in DPS
// Serial.print("l");
// Serial.println(imu.calcGyro(imu.gz)); // Print z-axis rotation in DPS
//
}
void looperFour() {
imu.readAccel();
Serial.print("M");
Serial.println(imu.calcAccel(imu.ax), 2);
//delay(10);
Serial.print("N");
Serial.println(imu.calcAccel(imu.ay), 2);
//delay(10);
Serial.print("O");
Serial.println(imu.calcAccel(imu.az), 2);
//delay(10);
//
// imu.readGyro(); // Update gyroscope data
// Serial.print("m");
// Serial.println(imu.calcGyro(imu.gx)); // Print x-axis rotation in DPS
// Serial.print("n");
// Serial.println(imu.calcGyro(imu.gy)); // Print y-axis rotation in DPS
// Serial.print("o");
// Serial.println(imu.calcGyro(imu.gz)); // Print z-axis rotation in DPS
}
void looperFive() {
imu.readAccel();
Serial.print("P");
Serial.println(imu.calcAccel(imu.ax), 2);
//delay(10);
Serial.print("Q");
Serial.println(imu.calcAccel(imu.ay), 2);
//delay(10);
Serial.print("R");
Serial.println(imu.calcAccel(imu.az), 2);
//delay(10);
//
// imu.readGyro(); // Update gyroscope data
// Serial.print("p");
// Serial.println(imu.calcGyro(imu.gx)); // Print x-axis rotation in DPS
// Serial.print("q");
// Serial.println(imu.calcGyro(imu.gy)); // Print y-axis rotation in DPS
// Serial.print("r");
// Serial.println(imu.calcGyro(imu.gz)); // Print z-axis rotation in DPS
}
void looperSix() {
imu.readAccel();
Serial.print("S");
Serial.println(imu.calcAccel(imu.ax), 2);
//delay(10);
Serial.print("T");
Serial.println(imu.calcAccel(imu.ay), 2);
//delay(10);
Serial.print("U");
Serial.println(imu.calcAccel(imu.az), 2);
//delay(10);
//
// imu.readGyro(); // Update gyroscope data
// Serial.print("s");
// Serial.println(imu.calcGyro(imu.gx)); // Print x-axis rotation in DPS
// Serial.print("t");
// Serial.println(imu.calcGyro(imu.gy)); // Print y-axis rotation in DPS
// Serial.print("u");
// Serial.println(imu.calcGyro(imu.gz)); // Print z-axis rotation in DPS
}
void looperSeven() {
imu.readAccel();
Serial.print("V");
Serial.println(imu.calcAccel(imu.ax), 2);
//delay(10);
Serial.print("W");
Serial.println(imu.calcAccel(imu.ay), 2);
//delay(10);
Serial.print("X");
Serial.println(imu.calcAccel(imu.az), 2);
//delay(10);
//
// imu.readGyro(); // Update gyroscope data
// Serial.print("v");
// Serial.println(imu.calcGyro(imu.gx)); // Print x-axis rotation in DPS
// Serial.print("w");
// Serial.println(imu.calcGyro(imu.gy)); // Print y-axis rotation in DPS
// Serial.print("x");
// Serial.println(imu.calcGyro(imu.gz)); // Print z-axis rotation in DPS
delay(50);
}
处理代码序列事件:
void serialEvent(Serial port) {
String inData = port.readStringUntil('\n');
inData = trim(inData); // cut off white space (carriage return)
//println(inData);
if (frameCount % 4 == 0) {
if (inData.charAt(0) == 'S') { //S
inData = inData.substring(1);
rightHipX1 = float(inData);
}
if (inData.charAt(0) == 'T') { //T
inData = inData.substring(1);
rightHipY1 = float(inData);
}
if (inData.charAt(0) == 'U') {
inData = inData.substring(1); //U
rightHipZ1 = float(inData);
}
if (inData.charAt(0) == 'V') { //V
inData = inData.substring(1);
rightHipX2 = float(inData);
}
if (inData.charAt(0) == 'W') { //W
inData = inData.substring(1);
rightHipY2 = float(inData);
}
if (inData.charAt(0) == 'X') { //X
inData = inData.substring(1);
rightHipZ2 = float(inData);
}
}
if (frameCount % 4 == 1)
{
if (inData.charAt(0) == 'M') {
inData = inData.substring(1);
rightLegX1 = float(inData);
}
if (inData.charAt(0) == 'N') {
inData = inData.substring(1);
rightLegY1 = float(inData);
}
if (inData.charAt(0) == 'O') {
inData = inData.substring(1);
rightLegZ1 = float(inData);
}
if (inData.charAt(0) == 'P') {
inData = inData.substring(1);
rightLegX2 = float(inData);
}
if (inData.charAt(0) == 'Q') {
inData = inData.substring(1);
rightLegY2 = float(inData);
}
if (inData.charAt(0) == 'R') {
inData = inData.substring(1);
rightLegZ2 = float(inData);
}
}
if (frameCount % 4 == 2)
{
if (inData.charAt(0) == 'D') {
inData = inData.substring(1);
leftHipX1 = float(inData);
}
if (inData.charAt(0) == 'E') {
inData = inData.substring(1);
leftHipY1 = float(inData);
}
if (inData.charAt(0) == 'F') {
inData = inData.substring(1);
leftHipZ1 = float(inData);
}
if (inData.charAt(0) == 'A') {
inData = inData.substring(1);
leftHipX2 = float(inData);
}
if (inData.charAt(0) == 'B') {
inData = inData.substring(1);
leftHipY2 = float(inData);
}
if (inData.charAt(0) == 'C') {
inData = inData.substring(1);
leftHipZ2 = float(inData);
}
}
if (frameCount % 4 == 3)
{
if (inData.charAt(0) == 'G') {
inData = inData.substring(1);
leftLegX1 = float(inData);
}
if (inData.charAt(0) == 'H') {
inData = inData.substring(1);
leftLegY1 = float(inData);
}
if (inData.charAt(0) == 'I') {
inData = inData.substring(1);
leftLegZ1 = float(inData);
}
if (inData.charAt(0) == 'J') {
inData = inData.substring(1);
leftLegX2 = float(inData);
}
if (inData.charAt(0) == 'K') {
inData = inData.substring(1);
leftLegY2 = float(inData);
}
if (inData.charAt(0) == 'L') {
inData = inData.substring(1);
leftLegZ2 = float(inData);
}
}
}
然后导入数据后,它就全部用于旋转我的处理草图的视觉元素。
您的多路复用器板的实际芯片是TCA954A。数据表显示最大频率为400kHz。您的吞吐量将取决于*以位为单位的数据包大小(读/写命令、地址和数据:每轴2个字节)*i2c设备的数量
如果你进行计算,你可能会发现你无法充分发挥传感器的潜力。最重要的是,I2C总线比SPI慢,因为有控制数据交换。最快的速度是使用DMA的SPI流。完整时钟仅用于数据,并直接写入MCU内存(通常为阵列)。你可以在一条SPI总线上加几个从机,你只需要为每个从机选择一个芯片引脚(CS)。维基百科上有一个很好的图表。
我已经成功地将Arduino草图连接到加工草图上,但我仍然无法确定如何让Arduino在加工过程中控制对象。 使用倾斜传感器,目的是当倾斜传感器以一种方式倾斜时,它将以这种方式移动对象进行处理,然后当它以另一种方式倾斜时,它将以另一种方式移动对象。 有人能帮忙吗? 这是我的Arduino代码: 这是我的处理代码:
这是如何使用公共类frome的一个后续步骤。其他处理选项卡中的java文件?;使用来自的Usage类中的示例。java文件-有完整的文档吗?-处理2。x和3。x论坛,我有这个: /tmp/Sketch/Foo.java 这个例子运行得很好,但是如果我取消注释import peasy。组织 行,则编译失败: 当然,我确实在下安装了PeasyCam,如果我导入peasy.*它工作得很好 来自草图。 我
我正在从事一个项目,该项目使用处理从文件中读取数据,然后使用串行将这些数据发送到arduino Uno板,然后将这些值提供给arduino braccio braccio。ServoMovement()函数,根据它们移动机械臂。然而,每当我运行代码时,我总是在函数中输入错误的值,并且手臂以一种奇怪的方式移动,我测试了相同的代码,并试图点亮一个led,但出于某种原因,它工作正常。 Arduino代码
本研究基于以下环节。geomerative库文档可以从以下链接中看到。 有时错误发生在加载草图时。大多数情况下,它加载正常,但当你稍微拖动点时,它会抛出一个错误。错误代码有时是指曲线的控制点被鼠标位置更新的点,但是因为错误经常发生在草图加载的时候,我认为这不是一个与更新的位置有关的问题。 错误代码如下;
我的Arduino代码: 我的处理代码: 我已经非常努力地去理解处理,但是我仍然不明白如何根据arduino发送的数据绘制图形。我认为我的问题主要是线部分。我不知道如何画一条连接上一个点和新点的线。 但总的来说,这个问题甚至不起作用......问题在哪里:(?
我一直在尝试为我的Arduino串行数据创建一个示波器。在Arduino串行绘图仪中,我可以获得合适频率的良好波形,但当我尝试将数据发送到处理时,它无法接收来自Arduino的所有数据。有办法解决这个问题吗? 阿杜伊诺 加工 谢谢