大数跨境
0
0

谁说植物的情感无声?这只机器瞄可以替它表达!

谁说植物的情感无声?这只机器瞄可以替它表达! DF创客社区
2017-07-12
1
导读:通过将电子宠物与智能花盆相结合,让植物有情感~
欢迎来到服“造”的世界


作者:稀饭

资料来源:www.dfrobot.com.cn


项目

通过将电子宠物与智能花盆相结合,不仅给机器人本身赋予了生命的特征,同时也能将植物无声的情感通过机器人来表达,以猫为原型,试图用猫的动作来表现植物的状态,并使用户与植物之间有更多交互的方式。


 
核心功能介绍:

一、喂水     当土壤湿度传感器检测到植物缺水时,NEKO会用realsense自己找人,并把水盆“叼”到用户面前,同时会通过耳朵和尾巴等肢体语言向用户传达缺水的信息,让主人用水壶倒水。

二、追光     平时NEKO会自己在桌面上有阳光的地方呆着,用户可以用专门的小手电来逗他,他会追着光照的地方跑去。

三、充电      NEKO有一个自己的小房子,每天晚上会自己回去充电。并且如果某天光照不足,小房子里装有紫外线灯,会自动给植物补充光照。


 

传感器及控制器清单


  • 模拟光线传感器*4

  • 防跌落传感器*4


  • 切诺基平台*1

  • 舵机*5

  • 迷你水泵*1

  • 人体红外传感器*1

  • 磁力传感器*1

  • 土壤湿度传感器*1

  • Intel®RealSense (SR300) *1


模型制作


建模:
 
先来个立方体

 
细节加点再

 

然后把东西塞进去

 
切割打印

 
拼粘上腻子

 
喷漆上光油

 
半组装(组装传感器)

 
传感器调试

 
传感器+驱动系统调试

 
整机测试

 
组装

追光程序


光敏传感器位置(目前只用了三个,第四个用于降低误差,没有写入)

 

程序如下:

//pin脚

int lgSP1=2;    //1号光敏

int lgSP2=3;    //2号光敏

int lgSP3=4;    //3号光敏

 

//小车控制pin脚

int speedPin_M1 = 5;     //M1 Speed Control

int speedPin_M2 = 6;     //M2 Speed Control

int directionPin_M1 = 4;     //M1 Direction Control

int directionPin_M2 = 7;     //M1 Direction Control

 

//光敏读数

int lgS1;

int lgS2;

int lgS3;

int LR;

int FB;

 

//环境光初始值

int lgS10=0;

int lgS20=0;

int lgS30=0;

 

//其他参数

int threshold=100;//阙值

int thresholdLR=200;

int thresholdFBMin=100;

int thresholdFBMax=300;

int state=1;

int advanceSpeed=200;

int backSpeed=150;

int turnSpeed=250;

int moveState=0;//状态参数

int period=30000;

unsigned long time0;

unsigned long time1;

 

//*********************主程序*************************

void setup() {

  // put your setup code here, to run once:

  pinMode(lgSP1,INPUT);

  pinMode(lgSP2,INPUT);

  pinMode(lgSP3,INPUT);

 

  //环境光初始化

  for(int i=0;i<20;i++){

    lgS10=analogRead(lgSP1)+lgS10;

    lgS20=analogRead(lgSP2)+lgS20;

    lgS30=analogRead(lgSP3)+lgS30;

    delay(10);

  }

  lgS10=lgS10/10;

  lgS20=lgS20/10;

  lgS30=lgS30/10;

 

  //设置通信

  Serial.begin(9600);

}

 

void loop() {

  carStop();

   

  if(lgS1<threshold&&lgS2<threshold&&lgS3<threshold){//隔一段时间常态下更新光值

    resetLight();

  }

   

  //读取环境光值

  lgS1=analogRead(lgSP1)-lgS10;

  lgS2=analogRead(lgSP2)-lgS20;

  lgS3=analogRead(lgSP3)-lgS30;

 

  printLR();

  printFB();

  Serial.println("    无光");

 

  while(lgS1>threshold||lgS2>threshold||lgS3>threshold){//环境光值变化大于阙值

    delay(100);

 

    

    lgS1=analogRead(lgSP1)-lgS10;      //测量值减初始值

    lgS2=analogRead(lgSP2)-lgS20;

    LR=lgS1-lgS2;                      //左右光值差

 

    //print0();printLR();printFB();

 

    if(abs(LR)>thresholdLR){//左右光值差大于阙值

      swerve();

      moveState=1;          //行驶状态参数

    }else{

      carStop();

      moveState=0;

      printLR();

      Serial.println("    左右正常");

    }

     

    lgS1=analogRead(lgSP1)-lgS10;

    lgS3=analogRead(lgSP3)-lgS30;

    FB=lgS1-lgS3;

 

    if(abs(FB)>thresholdFBMin&&abs(FB)<thresholdFBMax){//前后光值差大于阙值

      walk();

    }else if(moveState==1){ 

      Serial.println("    转弯中");

    }else

      carStop();

      printFB();

      Serial.println("    前后正常");

    }

  }

   

//*********************函数*************************

//-----------------环境光初始函数-----------------

void resetLight(){

  if(state==1){

    time0= millis();

    state=0;

  }

  time1=millis()-time0;//间隔一段时间

//  Serial.print("time0=");

//  Serial.print(time0);

//  Serial.print("time1=");

//  Serial.print(time1);

//  Serial.println();

  if(time1>period){//间隔一段时间后初始环境光

      for(int i=0;i<10;i++){

      lgS10=analogRead(lgSP1)+lgS10;

      lgS20=analogRead(lgSP2)+lgS20;

      lgS30=analogRead(lgSP3)+lgS30;

      delay(10);

      }

      lgS10=lgS10/10;

      lgS20=lgS20/10;

      lgS30=lgS30/10;

      state=1;

      print0();

      Serial.println(" success");

    }

}

//-----------------打印函数-----------------

void print0(){

  Serial.print("lgS10=");

  Serial.print(lgS10);

  Serial.print(" ");

  Serial.print("lgS20=");

  Serial.print(lgS20);

  Serial.print(" ");

  Serial.print("lgS30=");

  Serial.print(lgS30);

}

void printLR(){

  Serial.print("lgS1=");

  Serial.print(lgS1);

  Serial.print(" ");

  Serial.print("lgS2=");

  Serial.print(lgS2);

  Serial.print(" ");

  Serial.print("LR=");

  Serial.print(LR);

}

void printFB(){

  Serial.print("lgS1=");

  Serial.print(lgS1);

  Serial.print(" ");

  Serial.print("lgS3=");

  Serial.print(lgS3);

  Serial.print(" ");

  Serial.print("FB=");

  Serial.print(FB);

}

 

//-----------------光判断函数-----------------

void swerve(){//转向判断函数

  if(LR>10){

    printLR();

    Serial.println("  左转");

    carTurnRight(turnSpeed,turnSpeed);

    }else if(LR<-10){

    printLR();

    Serial.println("  右转");

    carTurnLeft(turnSpeed,turnSpeed);

  }

}

 

void walk(){//前进判断函数

  if(FB>0){

    printFB();

    Serial.println("  前进");

    carAdvance(advanceSpeed,advanceSpeed);

//    isCliff=analogRead(distLPin);

//    isCliff=analogRead(distRPin);

  }else if(FB<0){

    printFB();

    Serial.println("  后退");

    carBack(backSpeed,backSpeed);

  }

}

 

//-----------------车运动函数-----------------

void carStop(){                 //  Motor Stop

  digitalWrite(speedPin_M2,0); 

  digitalWrite(directionPin_M2,LOW);    

  digitalWrite(speedPin_M1,0);   

  digitalWrite(directionPin_M1,LOW);    

}   

 

void carAdvance(int leftSpeed,int rightSpeed){         //Move FORkward

  analogWrite (speedPin_M2,leftSpeed);              //PWM Speed Control

  digitalWrite(directionPin_M2,LOW);    

  analogWrite (speedPin_M1,rightSpeed);    

  digitalWrite(directionPin_M1,HIGH);

 

void carBack(int leftSpeed,int rightSpeed){       //Move BACKrward

  analogWrite (speedPin_M2,leftSpeed);

  digitalWrite(directionPin_M2,HIGH);   

  analogWrite (speedPin_M1,rightSpeed);    

  digitalWrite(directionPin_M1,LOW);

}

 

void carTurnLeft(int leftSpeed,int rightSpeed){      //Turn Left

  analogWrite (speedPin_M2,leftSpeed);

  digitalWrite(directionPin_M2,HIGH);    

  analogWrite (speedPin_M1,rightSpeed);    

  digitalWrite(directionPin_M1,HIGH);

}

void carTurnRight(int leftSpeed,int rightSpeed){      //Turn Right

  analogWrite (speedPin_M2,leftSpeed);

  digitalWrite(directionPin_M2,LOW);    

  analogWrite (speedPin_M1,rightSpeed);    

  digitalWrite(directionPin_M1,LOW);

}


主程序:
 
 
 
 


总结:

目前正在进一步完善初稿的程序和debug,有些传感器还没写入代码里,模型正在进一步缩小以更贴近初始尺寸,多舵机使用是一定要注意电压问题!这是从植物开始的生物义肢,希望大家可以喜欢我们的项目。


视频:



*欢迎转发朋友圈。如需转载,请注明出处和原作者。


更多项目干货戳这里

气温指示项链

智能穿戴—能将日记可视化的连衣裙

萌妹纸的体感猫耳朵 | 3D打印银河护卫队萌宠Groot 

金刚狼爪制作集合   |  台湾创客的桌面神器 | 调酒机器人

雾霾自救  VR黑科技  |  OTTO  |  宠物机器人

3D打印笔  |  智能手环  |  树莓派拍立得

互动纸艺装置  HIFI终极音箱




点击“阅读原文”,下载源代码


【声明】内容源于网络
0
0
DF创客社区
我们是专注于创新和开源硬件开发的公司——DFRobot成立的创客社区,无论你是资深创客还是小白,这里都有你的一席之地。一个人玩自己的项目,你只是寂寞宅;一群人看你玩项目,你就是技术牛!快来分享你的项目吧!
内容 1282
粉丝 0
DF创客社区 我们是专注于创新和开源硬件开发的公司——DFRobot成立的创客社区,无论你是资深创客还是小白,这里都有你的一席之地。一个人玩自己的项目,你只是寂寞宅;一群人看你玩项目,你就是技术牛!快来分享你的项目吧!
总阅读1.9k
粉丝0
内容1.3k