level 1
akarebel
楼主
下面这是《震动泡泡》的优酷视频,我们就是做这个的
http://v.youku.com/v_show/id_XMzM3ODc4MDcy.html?from=s1.8-1-1.2
我们现在遇到的问题就是摇动振动传感器 arduino板上的灯闪但是震动泡泡图像不动,不知道是什么问题 连线没问题 是不是代码出了问题 哪个大神给看看![[委屈]](/static/emoticons/u59d4u5c48.png)
这是arduino和processing的代码
Arduino程序:
//震动传感器的输出带宽很窄,在使用Arduino读取时,使用Arduino外部中断功能
//数字接口2:振动,水银,干簧管 数字输入传感器。
#define SensorLED 13
#define SensorINPUT 2
//中断次数计数器初始化为0
unsigned char state = 0;
void setup()
{
pinMode(SensorLED, OUTPUT);//设置LED为输出
pinMode(SensorINPUT, INPUT);
Serial.begin(9600);//设置串行通信的波特率
attachInterrupt(0, blink, FALLING);//D2口为外部中断0,当有下降沿触发的时候调用blink函数
}
void loop()
{
//如果中断次数不为0
if(state!=0)
{
//如果震动传感器引发中断
Serial.print(1,Serial);//向Processing发送标志值1
digitalWrite(SensorLED,LOW);//灯亮
delay(500);//延时500,
//中断计数器清零
state = 0;//把震动引发的第一次中断后的若干个中断屏蔽掉
}
//如果震动传感器不动,没有引发中断
else
{
Serial.print(0,Serial); //向Processing发送标志值0
digitalWrite(SensorLED,HIGH);//灯灭
delay(20); //每隔20ms,向Processing发送一次标志值0
}
}
//如果振动传感器引发中断,将自动调用中断服务程序
void blink()//数字输入传感器下降沿触发中断服务函数
{
state++;//中断计数器加1
}
Processing程序:
import processing.serial.*;//导入serial通信库
Serial duankou;//创建对象duankou
int data;//变量data作为接受到的数据
//修改这四个变量numBalls、spring、friction和gravity
//观察画布里的泡泡震动景象的变化
int numBalls =13;//定义泡泡的数量
float spring = 0.8;//泡泡之间撞击后的弹性系数
float friction = -0.9;//泡泡与墙壁之间撞击后的弹性系数
float gravity = 0.4;//泡泡运动时的重力系数
Ball[] balls = new Ball[numBalls];
//初始化程序
void setup()
{
size(700, 250);//设置画布尺寸,可以再修改变大,试试
noStroke();
smooth();
//设定通讯端口为COM7,波特率为9600
duankou = new Serial(this,"COM7",9600);
//呼叫构造器,初始化Ball对象
for (int i = 0; i < numBalls; i++) {
balls[i] = new Ball(random(width), random(height), random(20, 40), i, balls);}
}
//主程序
void draw()
{
if(duankou.available()>0)
{
//把Arduino传来的字节存入变量data
data=duankou.read();
//把Arduino传来的字节显示在控制台中
println(data);
//如果震动传感器引发了中断,Arduino上传标志值1
if(data==1) {
//调用构造器,初始化Ball对象
for (int i = 0; i < numBalls; i++) {
balls[i] = new Ball(random(width), random(height), random(20, 40), i, balls);
}
}
}
background(128);//画布用灰色背景刷新
for (int i = 0; i < numBalls; i++) {
balls[i].collide();//调用Ball对象的collide函数
balls[i].move();//调用Ball对象的move函数
balls[i].display();//调用Ball对象的display函数
}
}
//对象名称为Ball
class Ball {
//定义对象用到的局域变量
float x, y;
float diameter;
float vx = 0;
float vy = 0;
int id;
Ball[] others;
//定义构造器,给Ball对象变量赋初值
Ball(float xin, float yin, float din, int idin, Ball[] oin) {
x = xin;
y = yin;
diameter = din;
id = idin;
others = oin;
}
//定义Ball对象的collide函数
//判断泡泡之间撞击条件,并修正撞击后,泡泡的运动参数
void collide() {
for (int i = id + 1; i < numBalls; i++) {
float dx = others[i].x - x;
float dy = others[i].y - y;
float distance = sqrt(dx*dx + dy*dy);
float minDist = others[i].diameter/2 + diameter/2;
if (distance < minDist) {
float angle = atan2(dy, dx);
float targetX = x + cos(angle) * minDist;
float targetY = y + sin(angle) * minDist;
float ax = (targetX - others[i].x) * spring;
float ay = (targetY - others[i].y) * spring;
vx -= ax;
vy -= ay;
others[i].vx += ax;
others[i].vy += ay;
}
}
}
//定义Ball对象的move函数
//判断泡泡与墙体之间撞击条件,并修正撞击后,泡泡的运动参数
//根据泡泡的运动参数,计算泡泡运动轨迹中各点的坐标值
void move() {
vy += gravity;
x += vx;
y += vy;
if (x + diameter/2 > width) {
x = width - diameter/2;
vx *= friction;
}
else if (x - diameter/2 < 0) {
x = diameter/2;
vx *= friction;
}
if (y + diameter/2 > height) {
y = height - diameter/2;
vy *= friction;
}
else if (y - diameter/2 < 0) {
y = diameter/2;
vy *= friction;
}
}
//定义Ball对象的dispaly函数
//以泡泡运动轨迹中各点的坐标值为圆心画圆
//显示泡泡们的动画效果
void display() {
//fill(255, 204);
fill(255,255,0,100);
ellipse(x, y, diameter, diameter);
}
}
2015年05月06日 05点05分
1
http://v.youku.com/v_show/id_XMzM3ODc4MDcy.html?from=s1.8-1-1.2
我们现在遇到的问题就是摇动振动传感器 arduino板上的灯闪但是震动泡泡图像不动,不知道是什么问题 连线没问题 是不是代码出了问题 哪个大神给看看
这是arduino和processing的代码
Arduino程序:
//震动传感器的输出带宽很窄,在使用Arduino读取时,使用Arduino外部中断功能
//数字接口2:振动,水银,干簧管 数字输入传感器。
#define SensorLED 13
#define SensorINPUT 2
//中断次数计数器初始化为0
unsigned char state = 0;
void setup()
{
pinMode(SensorLED, OUTPUT);//设置LED为输出
pinMode(SensorINPUT, INPUT);
Serial.begin(9600);//设置串行通信的波特率
attachInterrupt(0, blink, FALLING);//D2口为外部中断0,当有下降沿触发的时候调用blink函数
}
void loop()
{
//如果中断次数不为0
if(state!=0)
{
//如果震动传感器引发中断
Serial.print(1,Serial);//向Processing发送标志值1
digitalWrite(SensorLED,LOW);//灯亮
delay(500);//延时500,
//中断计数器清零
state = 0;//把震动引发的第一次中断后的若干个中断屏蔽掉
}
//如果震动传感器不动,没有引发中断
else
{
Serial.print(0,Serial); //向Processing发送标志值0
digitalWrite(SensorLED,HIGH);//灯灭
delay(20); //每隔20ms,向Processing发送一次标志值0
}
}
//如果振动传感器引发中断,将自动调用中断服务程序
void blink()//数字输入传感器下降沿触发中断服务函数
{
state++;//中断计数器加1
}
Processing程序:
import processing.serial.*;//导入serial通信库
Serial duankou;//创建对象duankou
int data;//变量data作为接受到的数据
//修改这四个变量numBalls、spring、friction和gravity
//观察画布里的泡泡震动景象的变化
int numBalls =13;//定义泡泡的数量
float spring = 0.8;//泡泡之间撞击后的弹性系数
float friction = -0.9;//泡泡与墙壁之间撞击后的弹性系数
float gravity = 0.4;//泡泡运动时的重力系数
Ball[] balls = new Ball[numBalls];
//初始化程序
void setup()
{
size(700, 250);//设置画布尺寸,可以再修改变大,试试
noStroke();
smooth();
//设定通讯端口为COM7,波特率为9600
duankou = new Serial(this,"COM7",9600);
//呼叫构造器,初始化Ball对象
for (int i = 0; i < numBalls; i++) {
balls[i] = new Ball(random(width), random(height), random(20, 40), i, balls);}
}
//主程序
void draw()
{
if(duankou.available()>0)
{
//把Arduino传来的字节存入变量data
data=duankou.read();
//把Arduino传来的字节显示在控制台中
println(data);
//如果震动传感器引发了中断,Arduino上传标志值1
if(data==1) {
//调用构造器,初始化Ball对象
for (int i = 0; i < numBalls; i++) {
balls[i] = new Ball(random(width), random(height), random(20, 40), i, balls);
}
}
}
background(128);//画布用灰色背景刷新
for (int i = 0; i < numBalls; i++) {
balls[i].collide();//调用Ball对象的collide函数
balls[i].move();//调用Ball对象的move函数
balls[i].display();//调用Ball对象的display函数
}
}
//对象名称为Ball
class Ball {
//定义对象用到的局域变量
float x, y;
float diameter;
float vx = 0;
float vy = 0;
int id;
Ball[] others;
//定义构造器,给Ball对象变量赋初值
Ball(float xin, float yin, float din, int idin, Ball[] oin) {
x = xin;
y = yin;
diameter = din;
id = idin;
others = oin;
}
//定义Ball对象的collide函数
//判断泡泡之间撞击条件,并修正撞击后,泡泡的运动参数
void collide() {
for (int i = id + 1; i < numBalls; i++) {
float dx = others[i].x - x;
float dy = others[i].y - y;
float distance = sqrt(dx*dx + dy*dy);
float minDist = others[i].diameter/2 + diameter/2;
if (distance < minDist) {
float angle = atan2(dy, dx);
float targetX = x + cos(angle) * minDist;
float targetY = y + sin(angle) * minDist;
float ax = (targetX - others[i].x) * spring;
float ay = (targetY - others[i].y) * spring;
vx -= ax;
vy -= ay;
others[i].vx += ax;
others[i].vy += ay;
}
}
}
//定义Ball对象的move函数
//判断泡泡与墙体之间撞击条件,并修正撞击后,泡泡的运动参数
//根据泡泡的运动参数,计算泡泡运动轨迹中各点的坐标值
void move() {
vy += gravity;
x += vx;
y += vy;
if (x + diameter/2 > width) {
x = width - diameter/2;
vx *= friction;
}
else if (x - diameter/2 < 0) {
x = diameter/2;
vx *= friction;
}
if (y + diameter/2 > height) {
y = height - diameter/2;
vy *= friction;
}
else if (y - diameter/2 < 0) {
y = diameter/2;
vy *= friction;
}
}
//定义Ball对象的dispaly函数
//以泡泡运动轨迹中各点的坐标值为圆心画圆
//显示泡泡们的动画效果
void display() {
//fill(255, 204);
fill(255,255,0,100);
ellipse(x, y, diameter, diameter);
}
}