【问题标题】:Image displaying using Arduino- Processing connection and ADXL345 sensor使用 Arduino-Processing 连接和 ADXL345 传感器显示图像
【发布时间】:2023-01-30 20:22:54
【问题描述】:

我正在从事一个艺术项目,其中包括一个 ADXL345 传感器(加速度计)、Arduino Uno R3 板、Arduino IDE 2.0.3 和 Processing 4.1.2。 我希望每次从与 Arduino 草图的串行通信中接收到的传感器值时,Processing 都随机且连续地显示图像,go x>5, x<-5, y.5, y.-5, z>1 , z<-1。

更新: 一位朋友帮我写了几行代码,现在当我移动传感器时显示图像。

挑战: 我现在想做的是一次运行处理草图,让包含图像的窗口弹出、关闭、打开新窗口并显示我文件夹中的新随机图像。为了让这个过程自行重复,所以我不必每次都手动运行草图。

这些是我在 Arduino 和 Processing 中使用的代码。

阿杜诺

void setup() {
  // initialize serial communication at 9600 baud rate
  Serial.begin(9600);
}

void loop() {
  // send x, y, and z values over serial
  int x = analogRead(A0);
  int y = analogRead(A1);
  int z = digitalRead(2);
  Serial.print(x);
  Serial.print(",");
  Serial.print(y);
  Serial.print(",");
  Serial.println(z);
  delay(1000);
}

& 加工

import processing.serial.*;
Serial mySerial;
PImage fragment;
int rand;

void setup() {
  size(1000, 500);
  rand = int(random(0,133)); 
  takerandomimage("C:/Users/user/Documents/Processing/Trial_300123/frag_" + nf(rand, 3) + ".jpg");
  String portName = Serial.list()[0];
  mySerial = new Serial(this, portName, 9600);
  println("Serial port connected: " + portName);
  loop();
}

void takerandomimage(String fn) {
   fragment = loadImage(fn); 
   println(fragment);
}

void draw() {
  background(255); //clears the screen
  if (fragment.width>0 && fragment.height > 0){ //check if image has been loaded
    String data = mySerial.readStringUntil('\n');
    if (data != null && data != "\n" && data != " " && data != "\r" && data != "\t") {
      println("Data received: " + data);
      String[] values = data.split(" ",0);
      int counter = 0;
      int x = 0;
      int y = 0;
      int z = 0;
      for(String w :values){
         System.out.println(w); 
         if (counter == 1)
         x = int(w);
        if ( counter == 4)
         y = int(w);
        if ( counter == 7)
         z = int(w);
        counter++;
        }
        println(x);
        println(y);
        println(z);
      if (x < 0 || y > 0 || z > 0) {
          takerandomimage("C:/Users/user/Documents/Processing/Trial_300123/frag_" + nf(rand, 3) + ".jpg");
          image(fragment, 0,0);
          delay(1000);
        }
      }
    }
  }

谢谢!!

【问题讨论】:

    标签: image processing accelerometer arduino-uno arduino-ide


    【解决方案1】:

    您的代码(和问题)有很多正确的地方(+1):

    • 您的问题提到了使用的 Arduino/Processing 版本、Arduino 板、传感器,还包括针对该问题的最少代码
    • 检查数据是否不是null
    • 检查拆分数组的长度是否正确等。

    你是如此接近!

    有一个问题会导致解析失败:

    • 您的处理代码假定您在一行中有 x、y、z 值:String data = mySerial.readStringUntil(' ');
    • 您的 Arduino 代码打印多行而不是一行(例如 Serial.println(x); 而不是 Serial.print(x))
    • 仔细检查,您会在串行监视器中看到 x、y、z 值(以及两个“,”符号)分别在不同的行上(而不是全部在一行上)

    我怀疑其意图是仅在最后一行使用 println():

    void setup() {
      // initialize serial communication at 9600 baud rate
      Serial.begin(9600);
    }
    
    void loop() {
      // send x, y, and z values over serial
      int x = analogRead(A0);
      int y = analogRead(A1);
      int z = digitalRead(2);
      Serial.print(x);
      Serial.print(",");
      Serial.print(y);
      Serial.print(",");
      Serial.println(z);
      delay(1000);
    }
    

    (上面应该在一行上打印 3 个由“,”分隔的值。仔细检查 z 是否应该是 digitalRead(2)(返回 1 或 0)在 Arduino 上的引脚 2 上读取或analogRead(A2)(返回 0 到 1023)读取模拟引脚 A2。)

    【讨论】:

    • 非常感谢您的回复!我试图实施这些更改。我只在 Arduino 的 z 值上使用了 println,但是没有任何改变。我认为数字阅读是正确的。也许您还有其他想法?祝福你! :)
    • 我自己没有使用过 ADXL345,但快速浏览一下Adafruit,我发现了一些差异。看起来传感器与使用引脚 A4(SDA(数据))和 A5(SCL(时钟))的 I2C 协议一起使用;此外,我看到示例使用了您的代码未使用的 Adafruit_Sensor 和 Adafruit_ADXL345 库。也许我看错了东西?
    • @LiviaTice 您能否在上面的代码更改前后用串行监视器的几行输出更新您的问题以进行比较?另外,只是为了检查我是否理解你想要实现的目标,你想在每次有运动时切换到不同的图像(例如,有人摇动加速度计)?这是正确的还是我遗漏了一些细微差别?
    • 再一次问好!感谢您的回复。我和一个朋友在一些线路上工作,现在它正在工作。我更新了情况和代码。我想问你的是,你是否知道如何让一个窗口弹出、关闭和打开一个新窗口,重复这个过程而不必每次都运行草图?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-30
    • 1970-01-01
    • 2014-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多