称重传感器和Processing互动
processing吧
全部回复
仅看楼主
level 2
photo300 楼主
利用称重传感器的数据,当Processing读取数据时能压缩窗口绘制的弹簧,实现互动的效果。测试了一下没反应。求各位大神验证一下Processing代码是否有问题。
2019年06月27日 07点06分 1
level 3
贴代码,大家才可以帮你一起看啊
2019年06月28日 06点06分 2
OK好的
2019年07月01日 01点07分
level 2
photo300 楼主
import processing.serial.*;
Serial port; //创建串口对象
float val; //从串口接收数据
//弹簧常量
float M = 0.8; //质量
float K = 0.2; // 弹簧常量
float D = 0.92; //阻尼
float R = 150; //不动时候的位置
//弹簧变量
float ps = R; //变量位置
float vs = 0.0; //变量速度
float as = 0; //变量加速度
float f = 0; //力
void setup() {
size(640,320);
rectMode(CORNERS);
noStroke();
String arduinoPort = Serial.list()[3];
port = new Serial(this, arduinoPort, 9600);
}
void draw() {
background(102);
updateSpring();
drawSpring();
}
void drawSpring() {
//绘画基本
fill(0.2);
float baseWidth = map(val,0,255,0,height * 0.45);
rect(width/2 - baseWidth, baseWidth, width/2 + baseWidth, height);
}
void updateSpring() {
if(port.available() > 0) {
val = port.read();
f = -K * (ps-R); //力的公式
as = f / M; //加速度公式
vs = D * (vs + as); //速度公式
ps = ps + vs; //位置变化
if(abs(vs) < 0.1) {
vs = 0.0;
}
}
}
2019年07月01日 01点07分 3
level 2
photo300 楼主
下面这个是Arduino代码。
#include "HX711.h"
unsigned int Weight = 0;
void setup()
{
Init_Hx711();//初始化HX711模块连接的IO设置
Serial.begin(9600);
Serial.print("Welcome to use!\n");
Get_Maopi();//获取毛皮
}
void loop()
{
// if(Serial.available()) {
Weight = Get_Weight();//计算放在传感器上的重物重量
Serial.print(Weight);//串口显示重量
Serial.print(" g\nd");//显示单位
Serial.print("\n");//显示单位
delay(1000);//延时1s
//}
}
#include "hx711.h"
unsigned long HX711_Buffer = 0;
unsigned int Weight_Maopi = 0,Weight_Shiwu = 0;
//****************************************************
//初始化HX711
//****************************************************
void Init_Hx711()
{
pinMode(HX711_SCK, OUTPUT);
pinMode(HX711_DT, INPUT);
}
//****************************************************
//获取毛皮重量
//****************************************************
void Get_Maopi()
{
HX711_Buffer = HX711_Read();
Weight_Maopi = HX711_Buffer/100;
}
//****************************************************
//称重
//****************************************************
unsigned int Get_Weight()
{
HX711_Buffer = HX711_Read();
HX711_Buffer = HX711_Buffer/100;
Serial.print(HX711_Buffer);
Serial.print("\n");
if(HX711_Buffer > Weight_Maopi)
{
Weight_Shiwu = HX711_Buffer;
Weight_Shiwu = Weight_Shiwu - Weight_Maopi;//获取实物的AD采样数值。
Weight_Shiwu = (unsigned int)((float)Weight_Shiwu/4.05+0.05);
//计算实物的实际重量
//因为不同的传感器特性曲线不一样,因此,每一个传感器需要矫正这里的4.30这个除数。
//当发现测试出来的重量偏大时,增加该数值。
//如果测试出来的重量偏小时,减小改数值。
//该数值一般在4.0-5.0之间。因传感器不同而定。
//+0.05是为了四舍五入百分位
}
if(Weight_Shiwu > 5000 || HX711_Buffer < Weight_Maopi - 30)
{
Serial.print("Error");
}
return Weight_Shiwu;
}
//****************************************************
//读取HX711
//****************************************************
unsigned long HX711_Read(void)//增益128
{
unsigned long count;
unsigned char i;
bool Flag = 0;
digitalWrite(HX711_DT, HIGH);
delayMicroseconds(1);
digitalWrite(HX711_SCK, LOW);
delayMicroseconds(1);
count=0;
while(digitalRead(HX711_DT));
for(i=0;i<24;i++)
{
digitalWrite(HX711_SCK, HIGH);
delayMicroseconds(1);
count=count<<1;
digitalWrite(HX711_SCK, LOW);
delayMicroseconds(1);
if(digitalRead(HX711_DT))
count++;
}
digitalWrite(HX711_SCK, HIGH);
delayMicroseconds(1);
digitalWrite(HX711_SCK, LOW);
delayMicroseconds(1);
//count ^= 0x800000;
return(count);
}
#ifndef __HX711__H__
#define __HX711__H__
#include <Arduino.h>
#define HX711_SCK 2
#define HX711_DT 3
extern void Init_Hx711();
extern unsigned long HX711_Read(void);
extern unsigned int Get_Weight();
extern void Get_Maopi();
#endif
2019年07月01日 01点07分 4
level 3
分阶段调试吧,
第一步 传感器在受压后有没有数据产生,用串口看看实时反馈的数据是否正确。如果正确,进入下一步
第二步 processing那边查看串口传过去的数据是否正确被接受。如果正确,进入下一步
第三步 processing这边的弹簧行为是否设计正确。如果正确,那还不正常工作,就见鬼了。
先定位一下你的问题出现在哪一步吧
2019年07月02日 06点07分 5
我明白是什么情况了,因为Arduino的串口数据会一直打印,相应地Processing接收会让弹簧行为一直疯狂地变化伸缩。我想的是能不能Arduino一开始数据保持静止,然后在称重的情况下才显示数据变化,然后弹簧行为也跟着变化。
2019年07月03日 02点07分
level 2
photo300 楼主
复制一段简单的Arduino代码可能方便看些
#include "HX711.h"
// HX711 circuit wiring
const int LOADCELL_DOUT_PIN = 3;
const int LOADCELL_SCK_PIN = 2;
int weight = 0;
int oldweight = 0;
HX711 scale;
void setup() {
Serial.begin(57600);
scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN);
}
void loop() {
if (scale.is_ready()) {
long weight = scale.read();
// Serial.print("HX711 reading: ");
if(weight!=oldweight){
Serial.println(weight);
oldweight = weight;
}
}
delay(1000);
}
2019年07月03日 02点07分 6
level 3
串口数据一般都是一直发送的。
在processing那边你设置一个弹簧行为的阈值就好了。
接受到的数据超出阈值,你的弹簧才开始工作。
这样比较方便。
2019年07月04日 03点07分 7
level 1
问下楼主,processing可以用中文备注了?
2019年08月23日 07点08分 8
1