版主: wanchong , wangyu , eepwwp , firedom

分享到:
共24条 1/3 1 2 3 »   

Edison教程系列+官方样例集合

    [您是本帖的第21242位阅读者]
pengrui
我是MM
普通会员

最后登陆时间:2015-10-30 14:51:20

直达楼层
1# 发表于 2014-10-19 16:15:36
Edison教程系列01 按键控制






Edison教程系列01 按键控制
作者:Angelo 来自 DFRobot
http://www.dfrobot.com.cn/community/forum.php?mod=viewthread&tid=3274

来个最简单的实验吧!按钮控制LED开关,按键按下,LED点亮。按键松开,LED熄灭。

所需元件
  •   1×  数字食人鱼红色LED发光模块

e01.jpg 

  •   1×   数字大按钮模块

e02.jpg




此帖由pengrui于2015-01-13 21:43:19最后编辑

RE: Edison教程系列+官方样例集合

pengrui
我是MM
普通会员

最后登陆时间:2015-10-30 14:51:20

2# 发表于 2014-10-19 17:03:03
  •   1×   IO 传感器扩展板 V7.1

e05.jpg 

  •   1×   英特尔® Edison for Arduino开发板(预售)


e06.jpg 

硬件连接
  • 数字大按钮 → 数字2
  • 数字食人鱼红色LED发光模块 → 数字13

e03.jpg
此帖由pengrui于2015-01-14 10:44:23最后编辑

RE: Edison教程系列+官方样例集合

pengrui
我是MM
普通会员

最后登陆时间:2015-10-30 14:51:20

3# 发表于 2014-10-20 15:13:59
输入代码
打开样例代码Button,可见:

const int buttonPin =2;     // 定义按键引脚
const int ledPin=  13;      //定义LED引脚

int buttonState =0;         //用来存储按键状态值

void setup() {
  pinMode(ledPin, OUTPUT);    //初始化LED引脚为输出状态  
  pinMode(buttonPin, INPUT);  //初始化按键引脚为输入状态   
}

void loop(){
  buttonState = digitalRead(buttonPin); //读取按键引脚的状态值

  // 检测按键是否按下,如果是的话,按键状态值为HIGH
  if (buttonState == HIGH) {     
    digitalWrite(ledPin, HIGH);  // 打开LED
  }
  else {
    digitalWrite(ledPin, LOW);   // 关闭LED
  }
}
   
    下载完代码,按下按钮,灯点亮。松开按键,灯熄灭。

硬件分析(数字输入—数字输出)

很明显,大按钮是输入设备,LED是输出设备。和前面感应灯类似,也是一个数字输入控制一个数字输出。只是形式与代码有所不同。


e04.jpg
此帖由pengrui于2015-01-14 10:46:13最后编辑

RE: Edison教程系列+官方样例集合

pengrui
我是MM
普通会员

最后登陆时间:2015-10-30 14:51:20

4# 发表于 2014-10-21 20:04:54
代码回顾
说下Arduino代码必须具备的两个组成部分:

void setup() {
  // 写入setup代码,只运行一次:
}
void loop() {
  // 写入main代码,重复运行:  
}
Arduino代码必须包含setup()和loop()这两个函数。setup英文中是“设置”的意思。所以setup()函数是用于一些初始化设置的,只在代码一开始时,运行一次。loop是“循环”的意思,只要Arduino不掉电,loop就会不停的重复运行。
由硬件分析可以看出,按键是输入设备,LED是输出设备。
pinMode(buttonPin, INPUT);
pinMode(ledPin, OUTPUT);

函数格式如下:
pinMode(pin,mode)   
这个函数是用来设置Arduino数字引脚的模式的,只用于数字引脚定义是输入(INPUT)还是输出(OUTPUT)。pin指数字引脚号,mode指引脚模式(OUTPUT/INPUT)。
通过digitalWrite()读取按键的状态:
int reading = digitalRead(buttonPin);

函数格式如下:
digitalRead(pin)
这个函数是用来读取数字引脚状态,HIGH还是LOW。一旦按下,读到HIGH,松开,读到LOW。(HIGH代表1,LOW代表0)

数字传感器只会读到两个值(HIGH和LOW)。这里要用到新的一个语句——if语句。

if语句格式如下:
(1)if(表达式){
语句;
}
(2)if(表达式){
语句;
}else{
语句;
}
表达式是指我们的判断条件,通常为一些关系式或逻辑式,也可是直接表示某一数值。如果if表达式条件为真,则执行if中的语句。表达式条件为假,则跳出if语句。格式(1)多用于一种判断中,格式(2)多用于两种判断的情况。
if (buttonState == HIGH) {      
... //如果为高,LED亮
}
else {                              
   ... //否则,LED灭
}

    If语句中,还有句设置LED状态。
    digitalWrite(ledPin,HIGH);

函数格式如下:
digitalWrite(pin,value)
这个函数的意义是:引脚pin在pinMode()的中被设置为OUTPUT模式时,其电压将被设置为相应的值,HIGH为5V(3.3V控制板上为3.3V),LOW为0V。
此帖由pengrui于2015-01-14 10:47:42最后编辑

RE: Edison教程系列+官方样例集合

pengrui
我是MM
普通会员

最后登陆时间:2015-10-30 14:51:20

5# 发表于 2014-10-23 11:56:21
Edison教程系列02 火焰报警器
作者:Angelo 来自 DFRobot 
http://www.dfrobot.com.cn/commun ... viewthread&tid=3280

在厨房安装一个火焰报警器应该是非常管用的,如果不小心忘关煤气的话,只要有一点点的火苗,就能触发火焰报警器,探测距离可达20cm。别看一个小小的报警器,讲不定就能避免一场不必要的意外发生,何乐而不为呢?

所需材料
此帖由pengrui于2015-01-14 10:49:04最后编辑

RE: Edison教程系列+官方样例集合

pengrui
我是MM
普通会员

最后登陆时间:2015-10-30 14:51:20

6# 发表于 2014-10-23 18:48:24
硬件连接
     数字蜂鸣器模块 → 数字口8
     火焰传感器  模拟口 0
205.jpg

此帖由pengrui于2015-01-14 10:50:28最后编辑

RE: Edison教程系列+官方样例集合

pengrui
我是MM
普通会员

最后登陆时间:2015-10-30 14:51:20

7# 发表于 2014-10-26 11:19:14
输入代码   
  1. float sinVal;            
  2. int toneVal;  
  3. void setup(){
  4.    pinMode(8, OUTPUT);        // 蜂鸣器引脚设置
  5.    Serial.begin(9600);        //设置波特率为9600 bps
  6. }
  7. void loop(){
  8.   int sensorValue = analogRead(0);//火焰传感器连到模拟口,并从模拟口读值
  9. Serial.println(sensorValue);
  10. delay(1);
  11.    if(sensorValue < 1023){ //  如果数据小于1023,说明有火源,蜂鸣器响   
  12.           for(int x=0; x<180; x++){
  13.             //将sin函数角度转化为弧度
  14.             sinVal = (sin(x*(3.1412/180)));
  15.             //用sin函数值产生声音的频率
  16.             toneVal = 2000+(int(sinVal*1000));
  17.             //给引脚8一个
  18.             tone(8, toneVal);
  19.             delay(2);
  20.     }   
  21.    } else {    // 如果数据大于等于1023,没有火源,关闭蜂鸣器
  22.            noTone(8);          //关闭蜂鸣器
  23.    }
  24. }
复制代码
可以试下那个打火机慢慢靠近火焰传感器,看看蜂鸣器会不会报警。

硬件分析(模拟输入—数字输出)
     火焰传感器是输入设备,用来检测火苗,蜂鸣器显然是个输出设备,中间通过控制器来建立连接并执行处理。

207.jpg 

此帖由pengrui于2015-01-14 10:51:40最后编辑

RE: Edison教程系列+官方样例集合

pengrui
我是MM
普通会员

最后登陆时间:2015-10-30 14:51:20

8# 发表于 2014-10-26 11:29:13
代码回顾

首先,定义两个变量:

float sinVal;
int toneVal;

浮点型变量sinVal用来存储正弦值,正弦波呈现一个波浪形的变化,变化比较均匀,所以我们选用正弦波的变化来作为我们声音频率的变换,toneVal从sinVal变量中获得数值,并把它转换为所需要的频率。

火焰传感器是输入设备,所以需要读取对应模拟口0的值。与读取数字口函数digitalRead(pin)类似,所以模拟口读取函数是:
analogRead(pin)
这个函数用于从模拟引脚读值,pin是指连接的模拟引脚。Arduino的模拟引脚连接到一个了10位A/D转换,输入0~5V的电压对应读到0~1023的数值,每个读到的数值对应的都是一个电压值。比如512 = 2.5V。

这里用的是sin()函数,一个数学函数,可以算出一个角度的正弦值,这个函数采用弧度单位。因为我们不想让函数值出现负数,所以设置for循环在0~179之间,也就是0~180度之间。
for(int x=0; x<180; x++){}

函数sin()用的弧度单位,不是角度单位。要通过公式3.1412/180)将角度转为弧度:
sinVal = (sin(x*(3.1412/180)));
之后,将这个值转变成相应的报警声音的频率:
toneVal = 2000+(int(sinVal*1000));

这里有个知识点——浮点型值转换为整型。
sinVal是个浮点型变量,也就是含小数点的值,而我们不希望频率出现小数点的,所以需要有一个浮点值转换为整型值得过程,也就是下面这句语句就完成了这件事:
int(sinVal*1000)

把sinVal乘以1000,转换为整型后再加上2000赋值给变量toneVal,现在toneVal就是一个适合声音频率了。
之后,我们用tone()函数把生成的这个频率给我们的蜂鸣器。
tone(8, toneVal);

下面我们来介绍一下tone相关的三个函数
(1)tone(pin,frequency)
Pin都是指连接到蜂鸣器的数字引脚,frequency是以Hz为单位的频率值。

(2)tone(pin,frequency,duration)
第二个函数,有个duration参数,它是以毫秒为单位,表示声音长度的参数。像第一个函数,如果没有指定duration,声音将一直持续直到输出一个不同频率的声音产生。

(3)noTone(pin)
noTone(pin)函数,结束该指定引脚上产生的声音。
此帖由pengrui于2015-01-14 10:57:43最后编辑

RE: Edison教程系列+官方样例集合

pengrui
我是MM
普通会员

最后登陆时间:2015-10-30 14:51:20

9# 发表于 2014-10-28 18:18:49
Edison教程系列03 灯光调节器
作者:Angelo 来自 DFRobot
http://www.dfrobot.com.cn/commun ... thread&tid=3288

所谓灯光调节器,就是可以自由控制灯的亮度,我们这里通过一个模拟角度传感器来LED灯的亮度。随着旋转角度的变化,LED亮度也发生相应改变。角度越大,LED灯也就越亮,相反,角度越小,LED灯也就越暗。这里只是用了小小的LED来做演示效果,如果想运用到我们的生活之中的话,也是同样的原理。那就先做个小型的灯光调节器吧!
模拟角度传感器还能用到很多地方,比如我们后面会接触的舵机,可以通过这个传感器来控制转动角度,又或者以后有机会接触直流电机的小伙伴,可以尝试下用角度传感器来控制转速等等,用处很多!


所需元件
  •         1×  数字食人鱼红色LED发光模块
  • e01.jpg 
  •         1×  模拟角度传感器
  • 302.jpg 

  •         1×   IO 传感器扩展板 V7.1
  • e05.jpg 

  •          1×   英特尔® Edison for Arduino开发板
  •    e06.jpg 



硬件连接

模拟角度传感器 → 模拟0
数字食人鱼红色LED发光模块  数字9

305.jpg 


输入代码
  1. //灯光调节器
  2. int potPin = 0;                   //电位器连接到模拟0
  3. int ledPin = 9;                  //LED连接到数字9

  4. void setup() {
  5.        pinMode(ledPin, OUTPUT);
  6. }

  7. void loop() {
  8.   int sensorValue = analogRead(potPin);    //读取模拟口0的值       
  9.   //通过map()把0~1023的值转换为0~255
  10. int outputValue = map(sensorValue, 0, 1023, 0, 255);   
  11. analogWrite(ledPin, outputValue);   //给LED写入对应值        
  12.   delay(2);                     
  13. }
复制代码
缓慢旋转电位器,仔细观察LED的亮度是否发生变化。


硬件分析(模拟输入—模拟输出)
在呼吸灯一节,我们已经学会了如何用数字引脚的PWM口来做模拟输出。这一节将加入互动元素,通过模拟输入来控制模拟输出。

307.jpg 


代码回顾

这里主要讲下map函数。
函数格式如下:
map(value, fromLow, fromHigh, toLow, toHigh)
map函数的作用是将一个数从一个范围映射到另外一个范围。也就是说,会将 fromLow 到 fromHigh 之间的值映射到 toLow 在 toHigh 之间的值。


map函数参数含义:
value:需要映射的值 
fromLow:当前范围值的下限 
fromHigh:当前范围值的上限 
toLow:目标范围值的下限 
toHigh:目标范围值的上限


map的神奇之处还在于,两个范围中的“下限”可以比“上限”更大或者更小,因此map()函数可以用来翻转数值的范围,可以这么写:
y = map(x, 1, 50, 50, 1); 


这个函数同样可以处理负数,请看下面这个例子:

y = map(x, 1, 50, 50, -100);


回到代码中,
    int outputValue = map(sensorValue, 0, 1023, 0, 255);
    我们是想将模拟口读到的0~1023的值,转换为PWM口的0~255。

此帖由pengrui于2015-01-14 10:52:59最后编辑

RE: Edison教程系列+官方样例集合

pengrui
我是MM
普通会员

最后登陆时间:2015-10-30 14:51:20

10# 发表于 2014-10-28 20:10:52
pengrui的原帖
Edison教程系列01 按键控制






Edison教程系列01 按键控制
作者:Angelo 来自 DFRobot
http://www.dfrobot.com.cn/community/forum.php?mod=viewthread&tid=3274

来个最简单的实验吧!按钮控制LED开关,按键按下,LED点亮。按键松开,LED熄灭。

所需元件
  •   1×  数字食人鱼红色LED发光模块

e01.jpg 

  •   1×   数字大按钮模块

e02.jpg





Edison教程系列04 触摸台灯
作者:Angelo 来自 DFRobot
http://www.dfrobot.com.cn/commun ... thread&tid=3295

不再单调的通过按钮来控制台灯的开关,改造个可触摸开关控制的台灯。在本节中,我们选用简单的LED来作为例子,原理明白之后,改造其他电器也不再遥不可及。

所需元件
401.jpg     402.jpg    403.jpg
404.jpg405.jpg

  •   1×  数字触摸开关
  •   1×   数字继电器模块
  •   1×   IO 传感器扩展板 V7.1
  •   1×   英特尔® Edison for Arduino开发板
  •   自行选择不同电压值LED(或其他输出设备)及相应电源设备



硬件连接

数字触摸开关 → 数字2
数字继电器模块 → 数字12

406.jpg 

特别说明下,继电器部分的连接,继电器可以理解为是个开关,只是这个开关的特别之处在于可以控制大电流,我们可以用来控制一些大电流的交流设备。我们这里以3V的LED来作为例子,便于理解继电器原理。为了安全起见,不建议第一次直接改造交流设备。在弄清原理之后,可以在具有一定电路知识的朋友帮助下改造!

继电器如何使用?

大致看下继电器如何使用,继电器模块是通过数字引脚控制开关的,可以把它理解为LED,控制器控制它开与关。
继电器输出部分有四个引脚,如下图所示,COM(公共脚),NO(常闭端),NC(常开端),N/A(空脚)。

407.jpg

解释下常开和常闭的区别。NO引脚(常开端)常态下和COM(公共端)断开,只有继电器至高之后,才导通。而NC引脚(常闭端)刚好相反,常态下是断开的,只有继电器至高之后,才断开。


输入代码

打开样例代码TouchControlRelay,可见

int touchPin = 2;                  //触摸开关连接到数字2
int relayPin =12;                 //继电器连接到数字12
int relayState =HIGH;             // relayState记录继电器状态
int touchState;                    //touchState记录触摸开关状态
int lastTouchState =LOW;   // lastTouchState记录触摸开关前一个状态
long lastDebounceTime= 0;
long debounceDelay =50;         //去除抖动时间
void setup() {
  pinMode(touchPin, INPUT);
  pinMode(relayPin, OUTPUT);
  digitalWrite(relayPin, relayState);
}
void loop() {
  //reading用来存储touchPin的数据
  int reading = digitalRead(touchPin);
  
  // 一旦检测到数据发生变化,记录当前时间
  if (reading != lastTouchState) {
        lastDebounceTime= millis();
  }
  
  // 等待50ms,再进行一次判断,是否和当前触摸开关状态相同
  // 如果和当前状态不相同,改变触摸开关的状态
  // 同时,如果触摸开关状态为高(也就是被按下),那么就改变继电器的状态
  if ((millis() - lastDebounceTime) >debounceDelay) {
    if (reading != touchState) {
      touchState = reading;
      if (touchState == HIGH) {
          relayState = !relayState;
      }
    }
  }
  
  digitalWrite(relayPin, relayState);
   
  // 改变触摸开关前一个状态值
  lastTouchState = reading;
}
   
下载完代码,碰下触摸开关,灯点亮。再碰下,灯熄灭


硬件分析(数字输入—数字输出)

很明显,触摸开关是输入设备,继电器是输出设备。继电器再相应的控制其他设备。
4790.jpg 
代码回顾
由硬件分析可以看出,触摸是输入设备,继电器是输出设备。
pinMode(touchPin, INPUT);
pinMode(relayPin, OUTPUT);
      通过digitalWrite()读取按键的状态:
int reading = digitalRead(touchPin);
按下在由低变高或者由高变低时,都会有个抖动的过程,时间非常的短,如下图所示:


410.jpg

为了避免由于抖动产生的错误信号,所以我们代码中有个去抖的过程。去抖的方法很简单,就是等到数据发生变化时,隔一段时间再检测一次。
一旦检测到读取的数据发生变化,通过millis()函数记下时间:
if (reading !=lastTouchState) {
      lastDebounceTime = millis();
}
millis()是一个函数,该函数是Arduino语言自有的函数,它返回值是一个时间,Arduino开始运行到执行到当前的时间,也称之为机器时间,就像一个隐形时钟,从控制器开始运行的那一刻起开始计时,以毫秒为单位。
再等待50ms,再进行一次判断,是否和当前触摸开关状态相同。如果和当前状态不相同,改变触摸开关状态。同时,如果触摸开关状态为高(也就是被按下),那么就改变继电器的状态。
if ((millis() - lastDebounceTime) > debounceDelay) {
  if (reading != touchState) {
      touchState =reading;
    if (touchState ==HIGH) {
          relayState= !relayState;
      }
    }
  }
共24条 1/3 1 2 3 »   
快速回复主题
  • 匿名不能发帖!请先 [ 登陆 注册 ]