“光明使者”的版本间的差异

来自Labplus盛思维基百科
跳转至: 导航搜索
(创建页面,内容为“ 300px|缩略图|右 <br /> == 概述 == 本作品可通过光线传感器驱动直流电机,使其可跟随光照前进。使用时先…”)
 
第29行: 第29行:
 
|W1控制板||x1
 
|W1控制板||x1
 
|-
 
|-
|倾斜开关||x1
+
|灵敏光线||x2
 
|-
 
|-
|RGB灯带(17颗)||x1
+
|直流电机||x2
 
|}
 
|}
 
=== <font size=3px>电子模块连接说明</font>  ===
 
=== <font size=3px>电子模块连接说明</font>  ===
第40行: 第40行:
 
!  模块 !!引脚 !! 说明
 
!  模块 !!引脚 !! 说明
 
|-
 
|-
| 倾斜开关|| W1-9/10接口||
+
| 灵敏光线(左)|| W1-A2/A3接口||
 
|-
 
|-
| RGB灯带(17颗)||W1-7/8接口 ||
+
| 灵敏光线(右)|| W1-A0/A1接口||
 
|-
 
|-
 +
| 直流电机(左)|| W1-5/6接口||
 +
|-
 +
| 直流电机(右)|| W1-2/4接口||
 
|}
 
|}
 
=== <font size=3px>Arduino程序/图形化程序</font> ===
 
=== <font size=3px>Arduino程序/图形化程序</font> ===
第50行: 第53行:
 
|-style="vertical-align:center;"
 
|-style="vertical-align:center;"
 
|[[File:点击下载.png|30px|center]]
 
|[[File:点击下载.png|30px|center]]
|[[:File:Interesting_lamp_v1.2_Release.rar|斜不胜正灯程序包]]
+
|[[:File:follw_dolly_V1.3_Release.ra|光明使者程序包]]
 
|}
 
|}
 
<br/>
 
<br/>
 
<pre style="color:blue">
 
<pre style="color:blue">
#include "Adafruit_NeoPixel.h"
+
//----2016/09/21
 +
#include<Arduino.h>
  
 +
#define Light    A0
 +
#define Light1    A2
  
#define SWITCHPIN 9
+
#define M_OUT_right_2  2 
 +
#define M_OUT_right_4  4  
  
int numpixelsPin = 7;
+
#define M_OUT_left_5    5  
#define nusec 5
+
#define M_OUT_left_6    6 
#define NUMPIXELS  20
 
  
int num;
+
unsigned int Light_sr = 0;
uint8_t r,g,b;
+
unsigned int Light_sr1 = 0;
uint16_t h;
 
  
int led = 20;
+
unsigned int potVal;
 +
unsigned int lightVal;
 +
unsigned int flag = 0;
  
int fz=0;
+
int vala,valb;
int flag=0;
+
unsigned int vala_ref;
int flag1=0;
+
unsigned int valb_ref;
 +
int sumab,sumba;
 +
void receivedata();
 +
void M_move();
 +
void M_right_move();
 +
void  M_lefe_move();
 +
void  M_stop();
 +
void around();
  
int i = 0;
+
void setup()
uint16_t cnt = 0;
+
{
Adafruit_NeoPixel pixels1 = Adafruit_NeoPixel(NUMPIXELS, numpixelsPin, NEO_GRB + NEO_KHZ800);
+
  // put your setup code here, to run once:
  
void HSV2RGB(uint16_t h, float s, float v, uint8_t * r, uint8_t * g, uint8_t *b);
+
  pinMode(M_OUT_right_2,OUTPUT);
 +
  pinMode(M_OUT_right_4,OUTPUT);
 +
  pinMode(M_OUT_left_5,OUTPUT); 
 +
  pinMode(M_OUT_left_6,OUTPUT);
 +
   
 +
  digitalWrite(M_OUT_right_2,LOW);
 +
  digitalWrite(M_OUT_right_4,LOW);
 +
 
 +
  digitalWrite(M_OUT_left_5,LOW);
 +
  digitalWrite(M_OUT_left_6,LOW);
 +
  Serial.begin(115200);
 +
}
 +
void loop()
 +
 +
  Light_sr = analogRead(Light);
 +
  Light_sr1 = analogRead(Light1);
 +
 
 +
  Serial.print("Light_right:"); 
 +
  Serial.println(Light_sr);
 +
  Serial.print("Light_left:"); 
 +
  Serial.println(Light_sr1);
  
void setup()
+
  receivedata();
 +
}
 +
void receivedata()
 
{
 
{
   pinMode(numpixelsPin,OUTPUT);
+
   vala = analogRead(Light); //设定光传感器模拟数据读取端口
   pinMode(SWITCHPIN,INPUT);
+
   valb = analogRead(Light1);
   digitalWrite(numpixelsPin,LOW);
+
    
   pinMode(nusec,OUTPUT);
+
  sumab = (vala-valb); //左右光传感器读入数值求差
   digitalWrite(nusec,HIGH);
+
   sumba = (valb-vala); //左右光传感器读入数值求差
  // put your setup code here, to run once:
+
 
   pixels1.begin(); // This initializes the NeoPixel library.
+
   if((vala<20)&&(valb<20))  //
   for(num = 0; num < led; num++)  
+
   {
 +
    M_move();
 +
   }
 +
  else if((vala<800)&&(valb<800))  
 
   {
 
   {
     pixels1.setPixelColor(num, pixels1.Color(0,0,0)); // Moderately bright green color.
+
     if(sumab>10)
 +
    {
 +
      M_right_move();
 +
    }
 +
    else if(sumba>20)
 +
    {
 +
      M_lefe_move();
 +
    }
 +
    else
 +
    {
 +
      M_stop();    
 +
    }
 
   }
 
   }
   pixels1.show(); // This sends the updated pixel color to the hardware   
+
   else if((vala>=800)&&(valb>=800)&&(vala<=1020)&&(valb<=1020))  //
  for(num = 0; num < led; num++)  
 
 
   {
 
   {
     pixels1.setPixelColor(num, pixels1.Color(128,0,0)); // Moderately bright green color.
+
     if(sumab>10)
     pixels1.show(); // This sends the updated pixel color to the hardware
+
    {
     delay(65);
+
      M_right_move();
 +
     }
 +
    else if(sumba>10)
 +
    {
 +
      M_lefe_move();
 +
     }
 +
    else
 +
    {
 +
      M_stop();    
 +
    }   
 
   }
 
   }
   for(num = (led-1); num >= 0; num--)  
+
   else if((vala>1020)&&(valb>1020))
 
   {
 
   {
     pixels1.setPixelColor(num, pixels1.Color(0,128,0)); // Moderately bright green color.
+
     around();
    pixels1.show(); // This sends the updated pixel color to the hardware
 
    delay(65);
 
 
   }
 
   }
   for(num = 0; num < led; num++)
+
   else
 
   {
 
   {
     pixels1.setPixelColor(num, pixels1.Color(0,0,128)); // Moderately bright green color.
+
     M_stop();
    pixels1.show(); // This sends the updated pixel color to the hardware
 
    delay(65);
 
 
   }     
 
   }     
//  Serial.begin(115200);
 
 
}
 
}
 
+
void M_move()
void loop()  
+
{
 +
    digitalWrite(M_OUT_right_2, LOW);
 +
    digitalWrite(M_OUT_right_4,HIGH);   
 +
    digitalWrite(M_OUT_left_5, HIGH);
 +
    digitalWrite(M_OUT_left_6,LOW);   
 +
}
 +
void M_lefe_move()
 +
{
 +
    digitalWrite(M_OUT_right_4, LOW);
 +
    digitalWrite(M_OUT_left_5, HIGH);
 +
    digitalWrite(M_OUT_left_6,LOW); 
 +
}
 +
void M_right_move()
 +
{
 +
    digitalWrite(M_OUT_right_2, LOW);
 +
    digitalWrite(M_OUT_right_4,HIGH);
 +
    digitalWrite(M_OUT_left_5, LOW); 
 +
}
 +
void M_stop()
 
{
 
{
  if(digitalRead(SWITCHPIN))
+
   digitalWrite(M_OUT_right_4, LOW);  
  {    
+
   digitalWrite(M_OUT_left_5, LOW);   
      h += 2;
 
      if(h>360)
 
      {
 
        h=0;
 
      }
 
      HSV2RGB(h, 1.0, 1.0, &r, &g, &b);
 
     
 
        for(num = 0; num < led; num++)
 
        {
 
          pixels1.setPixelColor(num, pixels1.Color(r,g,b)); // Moderately bright green color.
 
        }
 
        pixels1.show(); // This sends the updated pixel color to the hardware
 
       
 
        digitalWrite(nusec,LOW);     //ying yue 
 
        delay(50);     
 
   }
 
  else
 
  {
 
      for(num = 0; num < led; num++)
 
      {
 
        pixels1.setPixelColor(num, pixels1.Color(r,g,b)); // Moderately bright green color.
 
      }
 
      pixels1.show(); // This sends the updated pixel color to the hardware 
 
      digitalWrite(nusec,HIGH);    //ying yue
 
      delay(50);  
 
   }   
 
 
}
 
}
 
+
void around()
void HSV2RGB(uint16_t h, float s, float v, uint8_t * r, uint8_t * g, uint8_t *b)
 
 
{
 
{
  uint8_t hi;
+
    digitalWrite(M_OUT_right_4, LOW);  
  float f, p, q, t;
+
    digitalWrite(M_OUT_left_5, HIGH);
  hi = (uint8_t)(h / 60);
+
    digitalWrite(M_OUT_left_6,LOW);
  f = (float)h/60 - hi;
+
    digitalWrite(M_OUT_right_2, HIGH);  
  p = v * (1 - s);
+
    digitalWrite(M_OUT_right_4,LOW);  
  q = v * (1 - f * s);
+
    delay(2000);
  t = v * (1 - (1 - f) * s);
+
     digitalWrite(M_OUT_right_2,LOW);  
  switch(hi)
+
     digitalWrite(M_OUT_right_4,LOW);  
  {
+
     digitalWrite(M_OUT_left_5,LOW);  
    //0: {r,g,b} = {v,t,p}
+
     digitalWrite(M_OUT_left_6,LOW);     
    case 0:
 
      *r = v * 255;
 
      *g = t * 255;
 
      *b = p * 255;
 
      break;
 
     //1: {r,g,b} = {q,v,p}
 
    case 1:
 
      *r = q * 255;
 
      *g = v * 255;
 
      *b = p * 255;
 
      break;
 
     //2: {r,g,b} = {p,v,t}
 
    case 2:
 
      *r = p * 255;
 
      *g = v * 255;
 
      *b = t * 255;
 
      break;
 
     //3: {r,g,b} = {p,q,v}
 
    case 3:
 
      *r = p * 255;
 
      *g = q * 255;
 
      *b = v *255;
 
      break;
 
     //4: {r,g,b} = {t,p,v}
 
    case 4:
 
      *r = t * 255;
 
      *g = p * 255;
 
      *b = v * 255;
 
      break;
 
    //5: {r,g,b} = {v,p,q}
 
    case 5:
 
      *r = v * 255;
 
      *g = p * 255;
 
      *b = q * 255;
 
      break;
 
     default:
 
      break;
 
  }
 
 
}
 
}
 
</pre>
 
</pre>

2018年5月29日 (二) 17:01的版本

光明使者.png

概述

本作品可通过光线传感器驱动直流电机,使其可跟随光照前进。使用时先根据制作说明将作品组装完整,然后 接上电源(9V电池或USB供电),打开主控板开关,将作品放置在水平地/桌面上即可。本作品用光线传感器作 为输入装置,直流电机作为输出装置,当光线传感器检测值高于预设阈值时,电机启动,同时根据左右测量值 的不同可实现让其左右转弯。DIY动手组装,锻炼动手能力,了解智能创意电子套件的使用,激发创新思维, 增加学习乐趣。

使用教程


组装说明

点击下载.png
  1. File:光明使者_装配.pdf
  2. File:跟随小车制作说明.rar


光明使者装配.png

电子模块清单

模块名称 数量
W1控制板 x1
灵敏光线 x2
直流电机 x2

电子模块连接说明

模块 引脚 说明
灵敏光线(左) W1-A2/A3接口
灵敏光线(右) W1-A0/A1接口
直流电机(左) W1-5/6接口
直流电机(右) W1-2/4接口

Arduino程序/图形化程序


点击下载.png
光明使者程序包


//----2016/09/21
#include<Arduino.h>

#define Light     A0
#define Light1    A2

#define M_OUT_right_2   2   
#define M_OUT_right_4   4  

#define M_OUT_left_5    5  
#define M_OUT_left_6    6  

unsigned int Light_sr = 0;
unsigned int Light_sr1 = 0;

unsigned int potVal;
unsigned int lightVal;
unsigned int flag = 0;

int vala,valb;
unsigned int vala_ref;
unsigned int valb_ref;
int sumab,sumba;
void receivedata();
void M_move();
void M_right_move();
void  M_lefe_move();
void  M_stop();
void around();

void setup() 
{
  // put your setup code here, to run once:

  pinMode(M_OUT_right_2,OUTPUT);
  pinMode(M_OUT_right_4,OUTPUT);
  pinMode(M_OUT_left_5,OUTPUT);  
  pinMode(M_OUT_left_6,OUTPUT);
    
  digitalWrite(M_OUT_right_2,LOW);
  digitalWrite(M_OUT_right_4,LOW);
  
  digitalWrite(M_OUT_left_5,LOW);
  digitalWrite(M_OUT_left_6,LOW);
  Serial.begin(115200);
}
void loop() 
{  
  Light_sr = analogRead(Light);
  Light_sr1 = analogRead(Light1);
  
  Serial.print("Light_right:");  
  Serial.println(Light_sr);
  Serial.print("Light_left:");   
  Serial.println(Light_sr1);

  receivedata(); 
}
void receivedata()
{
  vala = analogRead(Light); //设定光传感器模拟数据读取端口
  valb = analogRead(Light1);
  
  sumab = (vala-valb); //左右光传感器读入数值求差
  sumba = (valb-vala); //左右光传感器读入数值求差
  
  if((vala<20)&&(valb<20))  //
  {
    M_move();
  }
  else if((vala<800)&&(valb<800))   
  {
    if(sumab>10)
    {
      M_right_move();
    }
    else if(sumba>20)
    {
      M_lefe_move();
    }
    else
    {
      M_stop();     
    }
  }
  else if((vala>=800)&&(valb>=800)&&(vala<=1020)&&(valb<=1020))  //
  {
    if(sumab>10)
    {
      M_right_move();
    }
    else if(sumba>10)
    {
      M_lefe_move();
    }
    else
    {
      M_stop();     
    }     
  }
  else if((vala>1020)&&(valb>1020))
  {
    around();
  }
  else
  {
    M_stop();
  }    
}
void M_move()
{
    digitalWrite(M_OUT_right_2, LOW); 
    digitalWrite(M_OUT_right_4,HIGH);     
    digitalWrite(M_OUT_left_5, HIGH);
    digitalWrite(M_OUT_left_6,LOW);     
}
void M_lefe_move()
{
    digitalWrite(M_OUT_right_4, LOW); 
    digitalWrite(M_OUT_left_5, HIGH);
    digitalWrite(M_OUT_left_6,LOW);   
}
void M_right_move()
{
    digitalWrite(M_OUT_right_2, LOW); 
    digitalWrite(M_OUT_right_4,HIGH);
    digitalWrite(M_OUT_left_5, LOW);   
}
void M_stop()
{
   digitalWrite(M_OUT_right_4, LOW); 
   digitalWrite(M_OUT_left_5, LOW);   
}
void around()
{
    digitalWrite(M_OUT_right_4, LOW); 
    digitalWrite(M_OUT_left_5, HIGH);
    digitalWrite(M_OUT_left_6,LOW);
    digitalWrite(M_OUT_right_2, HIGH); 
    digitalWrite(M_OUT_right_4,LOW); 
    delay(2000);
    digitalWrite(M_OUT_right_2,LOW); 
    digitalWrite(M_OUT_right_4,LOW); 
    digitalWrite(M_OUT_left_5,LOW); 
    digitalWrite(M_OUT_left_6,LOW);     
}

FAQ

版本历史记录

Version Date 新增/删除/修复