当前位置: 首页 > 知识库问答 >
问题:

利用加工中的距离传感器控制形状的属性

师承弼
2023-03-14

编辑:当我运行代码时,什么也没有发生。

import processing.serial.*;

int xpos, ypos, s, r, g, b;

Circle circle;
int shapeSize, distance;
String comPortString;
Serial myPort;


void setup(){
 size(displayWidth,displayHeight); //Use entire screen size.

//Open the serial port for communication with the Arduino
myPort = new Serial(this, "/dev/cu.usbmodem1411", 9600);
myPort.bufferUntil('\n'); // Trigger a SerialEvent on new line
}

void draw(){
 background(0);
 delay(50); //Delay used to refresh screen

println(distance);
}


void serialEvent(Serial cPort){
comPortString = (new String(cPort.readBytesUntil('\n')));
 if(comPortString != null) {
 comPortString=trim(comPortString);

 /* Use the distance received by the Arduino to modify the y position
 of the first square (others will follow). Should match the
 code settings on the Arduino. In this case 200 is the maximum
 distance expected. The distance is then mapped to a value
 between 1 and the height of your screen */
 distance = int(map(Integer.parseInt(comPortString),1,200,1,height));
 if(distance<0){
 /*If computer receives a negative number (-1), then the
 sensor is reporting an "out of range" error. Convert all
 of these to a distance of 0. */
 distance = 0;
 }
 }
}



void keyPressed()
{
  // N for new circle (and keep old one)
  if((key == 'N') || (key == 'n')) {
    println("n");
  circle = new Circle(1,1,1,1,1,1);
    }

    //r - change red
      if((key == 'R') || (key == 'r')) {
    float red = map(distance, 0, 700, 0, 255);

    r = int(red);
    println("r " + r);
    }

       //g - change green
      if((key == 'G') || (key == 'g')) {
    float green = map(distance, 0, 700, 0, 255);
   g = int(green);
     println("g " + g);
    }

          //b - change blue
      if((key == 'B') || (key == 'b')) {
    float blue = map(distance, 0, 700, 0, 255);
     b = int(blue);
     println("b " + b);

    }

    //S - change Size
      if((key == 'S') || (key == 's')) {
       s = distance;
        println("s " + s);
    }

    //X - change x  pos
      if((key == 'X') || (key == 'x')) {
     xpos = distance;
         println("x " + xpos);
    }

    //y - change y pos
      if((key == 'Y') || (key == 'y')) {
            ypos = distance;
      println("y " + ypos);
    }
  } 

  class Circle {

   Circle(int xpos, int ypos, int s, int r, int g, int b){
   ellipse(xpos, ypos, s, s);
   color(r, g, b);
   }
   int getX(){
     return xpos;
   }
      int getY(){
     return ypos;
   }
  } 

共有1个答案

黄淇
2023-03-14

我将把它分成步骤/任务:

  1. 连接到Arduino
  2. 从Arduino读取值
  3. 映射读取值
  4. 控制映射

你已经有了Arduino部分,但是当试图将读取值映射到屏幕上的圆圈时,事情看起来很混乱。现在,为了简单起见,让我们忽略类,而专注于简单地绘制一个具有x、y、size、r、g、b属性的椭圆。

import processing.serial.*;

int xpos,ypos,s,r,g,b;
int distance;

int propertyID = 0;//keep track of what property should be updated on distance
int PROP_XPOS = 0;
int PROP_YPOS = 1;
int PROP_S = 2;
int PROP_R = 3;
int PROP_G = 4;
int PROP_B = 5;

void setup(){
  size(400,400);
  //setup some defaults to see something on screen
  xpos = ypos = 200;
  s = 20;
  r = g = b = 127;
  //initialize arduino - search for port based on OSX name
  String[] portNames = Serial.list();
  for(int i = 0 ; i < portNames.length; i++){
    if(portNames[i].contains("usbmodem")){
      try{
        Serial arduino = new Serial(this,portNames[i],9600);
        arduino.bufferUntil('\n');
        return;
      }catch(Exception e){
        showSerialError();
      }
    }
  }
  showSerialError();
}
void showSerialError(){
  System.err.println("Error connecting to Arduino!\nPlease check the USB port");
}
void draw(){
  background(0);
  fill(r,g,b);
  ellipse(xpos,ypos,s,s);
}
void serialEvent(Serial arduino){
  String rawString = arduino.readString();//fetch raw string
  if(rawString != null){
    String trimmedString = rawString.trim();//trim the raw string
    int rawDistance = int(trimmedString);//convert to integer
    distance = (int)map(rawDistance,1,200,1,height);
    updatePropsOnDistance();//continously update circle properties
  }
}
void updatePropsOnDistance(){
  if(propertyID == PROP_XPOS) xpos = distance;
  if(propertyID == PROP_YPOS) ypos = distance;
  if(propertyID == PROP_S) s = distance;
  if(propertyID == PROP_R) r = distance;
  if(propertyID == PROP_G) g = distance;
  if(propertyID == PROP_B) b = distance;
}
void keyReleased(){//only change what proprty changes on key press
  if(key == 'x' || key == 'X') propertyID = PROP_XPOS;
  if(key == 'y' || key == 'Y') propertyID = PROP_YPOS;
  if(key == 's' || key == 'S') propertyID = PROP_S;
  if(key == 'r' || key == 'R') propertyID = PROP_R;
  if(key == 'g' || key == 'G') propertyID = PROP_G;
  if(key == 'b' || key == 'B') propertyID = PROP_B;
}
//usually a good idea to test - in this case use mouseY instead of distance sensor
void mouseDragged(){
  distance = mouseY;
  updatePropsOnDistance();
}
import processing.serial.*;

Circle circle = new Circle();

void setup(){
  size(400,400);
  //initialize arduino - search for port based on OSX name
  String[] portNames = Serial.list();
  for(int i = 0 ; i < portNames.length; i++){
    if(portNames[i].contains("usbmodem")){
      try{
        Serial arduino = new Serial(this,portNames[i],9600);
        arduino.bufferUntil('\n');
        return;
      }catch(Exception e){
        showSerialError();
      }
    }
  }
  showSerialError();
}
void showSerialError(){
  System.err.println("Error connecting to Arduino!\nPlease check the USB port");
}
void draw(){
  background(0);
  circle.draw();
}
void serialEvent(Serial arduino){
  String rawString = arduino.readString();
  if(rawString != null){
    String trimmedString = rawString.trim();
    int rawDistance = int(trimmedString);
    int distance = (int)map(rawDistance,1,200,1,height);
    circle.update(distance);
  }
}
void keyReleased(){
  circle.setUpdateProperty(key+"");//update the circle property based on what key gets pressed. the +"" is a quick way to make a String from the char
}
//usually a good idea to test - in this case use mouseY instead of distance sensor
void mouseDragged(){
  circle.update(mouseY);
}

class Circle{
  //an IntDict (integer dictionary) is an associative array where instead of accessing values by an integer index (e.g. array[0]
  //you access them by a String index (e.g. array["name"])
  IntDict properties = new IntDict();

  String updateProperty = "x";//property to update

  Circle(){
    //defaults
    properties.set("x",200);
    properties.set("y",200);
    properties.set("s",20);
    properties.set("r",127);
    properties.set("g",127);
    properties.set("b",127);
  }

  void draw(){
    fill(properties.get("r"),properties.get("g"),properties.get("b"));
    ellipse(properties.get("x"),properties.get("y"),properties.get("s"),properties.get("s"));
  }

  void setUpdateProperty(String prop){
    if(properties.hasKey(prop)) updateProperty = prop;
    else{
      println("circle does not contain property: " + prop+"\navailable properties:");
      println(properties.keyArray());
    } 
  }

  void update(int value){
    properties.set(updateProperty,value);   
  }

}

在这两个示例中,您都可以通过在Y轴上拖动鼠标来测试距离值。

关于HC-SR04传感器,你可以在Arduino游乐场找到代码,以厘米为单位获得距离。我自己还没有使用过传感器,但我注意到其他人对它有一些问题,所以检查这篇文章也是值得的。如果您想滚动自己的Arduino代码,没有问题,您可以使用HC-SR04数据表(pdf链接)获得公式:

公式:uS/58=厘米或uS/148=英寸;或:射程=高位时间*速度(340m/s)/2;我们建议使用60ms以上的测量周期,以防止触发信号对回波信号的影响。

int historySize = 25;//remember a number of past values
int[] x = new int[historySize];
int[] y = new int[historySize];

void setup(){
  size(400,400);
  background(255);
  noFill();
}
void draw(){
  //draw original trails in red
  stroke(192,0,0,127);
  ellipse(mouseX,mouseY,10,10);

  //compute moving average 
  float avgX = average(x,mouseX);
  float avgY = average(y,mouseY);

  //draw moving average in green
  stroke(0,192,0,127);
  ellipse(avgX,avgY,10,10); 
}
void mouseReleased(){
  background(255);
}
float average(int[] values,int newValue){
  //shift elements by 1, from the last to the 2nd: count backwards
  float total = 0;
  int size = values.length;
  for(int i = size-1; i > 0; i--){//count backwards
    values[i] = values[i-1];//copy previous value into current
    total += values[i];//add values to total
  }
  values[0] = newValue;//add the newest value at the start of the list
  total += values[0];//add the latest value to the total
  return (float)total/size;//return the average
}
 类似资料:
  • 更新时间:2018-09-15 11:02:51 功能说明 光和距离传感器。ltr553 是一款环境光和距离传感器,通过 I2C 进行数据交互。 硬件资源 DevelopKit 开发板上自带有 ltr553 传感器: 软件设计 根据 ltr553 的数据手册,ALS 有两个通道寄存器 0x8A、0x88,一般我们会同时读取两个通道的值,然后取其平均值,PS 值存放在寄存器 0x8D 中,直接读取就

  • 我是一个使用java和Android的新手。我设法按照一些教程让我的gps在Android2.3手机上工作,但我注意到手机的gps只在40米内准确,这相当于纬度/经度小数点后第三位的精度。

  • 检测距离远近。范围在2-200之间。 用法 Your browser does not support the video tag. 案例:无限手环 说明:测距传感器可以检测到物体是否靠近,让LED面板根据信号给到反馈 模块清单:智能电源 × 1、LED面板 × 1、测距传感器 × 1、声音传感器 × 1

  • 光环板可以连接 mbuild 的 测距传感器 模块进行编程。 1. 测距传感器(1)与障碍物的距离(cm) 报告指定测距传感器与障碍物的距离。 示例 按下光环板的按钮,如果测距传感器1与障碍物的距离小于15cm,那么光环板的LED灯环会显示红色。 2. 测距传感器(1)超出量程? 如果指定测距传感器超出量程,报告条件成立。 示例 按下光环板的按钮,如果测距传感器1超出量程,那么光环板的LED灯环会

  • 测距传感器能够通过红外波检测与障碍物之间的距离。 生活实例 iPhone使用的 Face ID 使用红外光检测面部结构作为生物特征数据 参数 尺寸:24×20mm 读值范围:2~200cm 读值精度:±5% 工作电流:33mA

  • 测距传感器能够通过红外波检测与障碍物之间的距离。 生活实例 iPhone使用的 Face ID 使用红外光检测面部结构作为生物特征数据 参数 尺寸:24×20mm 读值范围:2~200cm 读值精度:±5% 工作电流:33mA