基于数字实验室套件的实验

有关Digital Lab培训套件NR05第一篇文章中,我们概述了构造原理,套件组成和扩展板。 现在,让我们看一下套件中包含的培训工具,并使用扩展卡来分析两种简单的体验,这些扩展卡将帮助您了解如何连接外部设备以及如何使用内置按钮,并提供草图示例。





正如我们已经说过的,该板包含用于连接各种外部模块的连接器组:传感器,执行器和使用某些标准信息交换总线的设备。

作为致动器,在板上提供了一个用于安装带有背光的液晶字符两行LCD指示器的位置。在此指示器上,您可以显示足够的信息以用于教育目的以及将工具包用作成品设备时。培训手册介绍了如何在显示屏上显示符号信息,如何使显示屏同时显示俄语和英语字母。手册中描述的几乎所有项目都使用该指标。

考虑最简单的执行器-LED。该套件包括三色(RGB-红色,绿色,蓝色)明亮的LED。在这种LED的三种颜色中,由于人眼的特性,通过改变每种颜色的强度,可以获得任何颜色。这种获得颜色的方法称为加色混合,例如在电视和监视器中使用。等比例混合三种颜色,我们得到白色。



我们将LED连接到扩展卡上的XP15连接器,该连接器还使用四根电线或适配器标记为“ RGB_LED”。我们使用具有公共阴极(公共“减号”)的LED,因此最长的LED输出连接到GND(“接地”)端子,其余的LED输出连接到RED / D5(红色),BLUE / D6(蓝色),绿色/ D9(绿色)。



D5,D6和D9是Arduino数字引脚,您可以在它们上获得脉冲宽度调制(PWM)以控制LED的亮度。培训手册提供了PWM理论的必要基础知识以及在Arduino中实现此调制的方式。



这是控制RGB LED发光亮度的程序(草图)的代码:

扰流板
//    RGB 
//-----------------------------------------------------------------------
//   
int redPin = 5;
int greenPin = 9;
int bluePin = 6;
//-----------------------------------------------------------------------
/*     1      Arduino
    */
void setup() 
{

}

//-----------------------------------------------------------------------
/*       setup         .*/

void loop() {
   /*    256 .    value      1.*/
   for(int value = 0 ; value <= 255; value ++) { 
    //      0
    analogWrite(redPin, 255-value);
    //  
    analogWrite(greenPin, value);
    //   
    analogWrite(bluePin, 0);
    //    30 
    delay(30);
  }

  /*    256 .    value      1.*/
  for(int value = 0 ; value <= 255; value ++) { 
    //  
    analogWrite(redPin, 0);
    //      0
    analogWrite(greenPin, 255-value);
    //  
    analogWrite(bluePin, value);
    //    30 
    delay(30);
  }

  /*    256 .    value      1.*/
  for(int value = 0 ; value <= 255; value ++) { 
    //  
    analogWrite(redPin, value);
    //  
    analogWrite(greenPin, 0);
    //      0
    analogWrite(bluePin, 255-value);
    //    30 
    delay(30);
  }

 //  loop    
}



程序运行时,LED平滑地将发射的颜色从红色变为绿色,然后从绿色变为蓝色,然后从蓝色变为红色。
我们对程序进行补充,以使LCD在每个时刻显示与每种颜色的亮度相对应的值,从最小值(0)到最大值(255)。修改后的代码在扰流器下给出。

扰流板
//    RGB 
//-----------------------------------------------------------------------
//   
int redPin = 5;
int greenPin = 9;
int bluePin = 6;
//    
int pwmRed;
int pwmGreen;
int pwmBlue;
//-----------------------------------------------------------------------
//   LiquidCrystalRus
#include <LiquidCrystalRus.h>
//  ,   LiquidCrystalRus
#include <LiquidCrystalExt.h>
#include <LineDriver.h>

//-----------------------------------------------------------------------
/*  ,      RS,EN,DB4,DB5,DB6,DB7 */
LiquidCrystalRus lcd(A1, A2, A3, 2, 4, 7);

//     1      Arduino
void setup() 
{
  //  LCD - 16 , 2 
  lcd.begin(16, 2);
  //      ()      
  lcd.print(" RED GREEN BLUE");
  
}

//-----------------------------------------------------------------------
//       setup         .

void loop() {
   /*    256 .    value      1.*/
   for(int value = 0 ; value <= 255; value ++) { 
    pwmGreen = value;
    pwmRed = 255 - value;
    //      0
    analogWrite(redPin, pwmRed);
    //  
    analogWrite(greenPin, pwmGreen);
    //   
    analogWrite(bluePin, 0);
    //    30 
    delay(30);
    Display();
  }

  /*    256 .    value      1.*/
  for(int value = 0 ; value <= 255; value ++) { 
    pwmBlue = value;
    pwmGreen = 255 - value;
    //  
    analogWrite(redPin, 0);
    //      0
    analogWrite(greenPin, pwmGreen);
    //  
    analogWrite(bluePin, pwmBlue);
    //    30 
    delay(30);
    Display();
  }

  /*    256 .    value      1.*/
  for(int value = 0 ; value <= 255; value ++) { 
    pwmRed = value;
    pwmBlue = 255 - value;
    //  
    analogWrite(redPin, pwmRed);
    //  
    analogWrite(greenPin, 0);
    //      0
    analogWrite(bluePin, pwmBlue);
    //    30 
    delay(30);
    Display();
  }

 //  loop    
}

//      ,  
void Display(){
 lcd.setCursor(0,1);
 lcd.print("                ");
 lcd.setCursor(1,1);
 lcd.print(pwmRed);
 lcd.setCursor(6,1);
 lcd.print(pwmGreen);
 lcd.setCursor(11,1);
 lcd.print(pwmBlue);
}



现在,让我们看一下使用内置在板上的按钮的示例。



在一般情况下,每个按钮都连接到单独的Arduino数字输出,并且程序会顺序轮询这些输出以确定是否按下了哪个按钮。为了保存Arduino的结论,必须使用Arduino的结论来确定数字实验室设备扩展板中的按钮按下情况,使用了一个“模拟”键盘,该键盘仅连接到一个Arduino模拟输入。此方法通常用于家用电器。该程序将测量分压器输出端的输出电压,具体取决于按下哪个按钮。在培训手册中,考虑了这种分频器的原理及其在键盘中的应用方法。这种方法的缺点是,一次只能依次按下一个按钮。

在Arduino中下载适当的程序:

扰流板
//           
//-----------------------------------------------------------------------
//     LiquidCrystal
#include <LiquidCrystal.h>

//      
#define NUM_KEYS 5
//      ( )
int  adcKeyVal[NUM_KEYS] = {30, 150, 360, 535, 760};
//-----------------------------------------------------------------------
//  ,      RS,EN,DB4,DB5,DB6,DB7
LiquidCrystal lcd(A1, A2, A3, 2, 4, 7);

//-----------------------------------------------------------------------
//     1      Arduino
void setup() 
{
  //  LCD   -16   2 
  lcd.begin(16, 2);
  //      ()      

  //     Keyboard
  lcd.print("Keyboard");  
 
  //    2000 = 2 
  delay(2000); 
}

//-----------------------------------------------------------------------
//       setup         .

void loop() {
  //     key
  int key;
  
  //       ,      get_key
  key = get_key();
 
  //      
  lcd.clear();
  //      ()     
 
  //     . -      
  lcd.print(key); 
  
  //    100 = 0,1 
  delay(100);
 //  loop    
}

//-----------------------------------------------------------------------
//          
//     ,    
//     ,    
int get_key()
	{
	  int input = analogRead(A6);
	  int k;
	  for(k = 0; k < NUM_KEYS; k++) 
	    if(input < adcKeyVal[k]) 
	      return k + 1;     
	  return 0;
	}



要显示有关按下哪个按钮的信息,请使用LCD指示器。如果您按按钮,则所按按钮的编号将显示在指示器上。

get_key函数返回一个与按下按钮的编号相对应的整数,该整数可以在主程序中使用。可使用以下程序通过实验确定与分压器输出的电压进行比较的校准值:

#include <LiquidCrystal.h>
LiquidCrystal lcd(A1, A2, A3, 2, 4, 7);
void setup() 
{
  lcd.begin(16, 2);
  lcd.print("Press keys");  
  delay(2000); 
}
void loop() {
  
  int input = analogRead(A6);
  lcd.clear();
  lcd.print(input); 
  delay(100);
}


尝试将其加载到Arduino中,查看显示的值并将其与校准值进行比较。现在让我们尝试使用以上示例来创建一个使用按钮实现LED控制的程序。让我们设置以下功能:

•当您按下按钮1(最左侧)时,红色的灯点亮,按钮2上的绿色– 3 –蓝色。再次按下该按钮时,相应的灯熄灭。指示灯显示哪些颜色点亮。
•按下按钮4时,打开和关闭的颜色会改变位置
•按下按钮5时,所有颜色都会消失。

这是此类草图的可能选项之一:

扰流板
//       RGB-
//-----------------------------------------------------------------------
//     LiquidCrystal
#include <LiquidCrystal.h>

//      
#define NUM_KEYS 5
//      ( )
int  adcKeyVal[NUM_KEYS] = {30, 150, 360, 535, 760};
#define redLED 5
#define greenLED 9
#define blueLED 6
//-----------------------------------------------------------------------
//  ,      RS,EN,DB4,DB5,DB6,DB7
LiquidCrystal lcd(A1, A2, A3, 2, 4, 7);
int redLEDstate = 0;
int greenLEDstate = 0;
int blueLEDstate = 0;
int flag = 0;

//-----------------------------------------------------------------------
//     1      Arduino
void setup() 
{
  pinMode(redLED, OUTPUT);
  pinMode(greenLED, OUTPUT);
  pinMode(blueLED, OUTPUT);
  //  LCD   -16   2 
  lcd.begin(16, 2);
  //      ()      

  //     
  lcd.print("Try Keys + LEDs");  
 
  //    1000 = 1 
  delay(1000); 
  //    
  lcd.clear();
}

//-----------------------------------------------------------------------
//       setup         .

void loop() {
  //     key
  int key;
  //       ,      get_key
  key = get_key();
  //   ,      
  // C   flag     ,      
     if(key == 1 && flag == 0) {                                              
        digitalWrite(redLED, !digitalRead(redLED));
        flag = 1;
      }
     if(key == 2 && flag == 0) {  //   : if(key == 2 && !flag)                                            
        digitalWrite(greenLED, !digitalRead(greenLED));
        flag = 1;
      }
    if(key == 3 && !flag)  {                                              
        digitalWrite(blueLED, !digitalRead(blueLED));
        flag = 1;
      }
    if(key == 4 && !flag)  {                                              
        digitalWrite(redLED, !digitalRead(redLED));
        digitalWrite(greenLED, !digitalRead(greenLED));
        digitalWrite(blueLED, !digitalRead(blueLED));
        flag = 1;
      }
    if(key == 5 && !flag){                                              
        digitalWrite(redLED, LOW);
        digitalWrite(greenLED, LOW);
        digitalWrite(blueLED, LOW);
        flag = 1;
      }
    //      ,    
    if(!key && flag) //  if(key == 0 && flag == 1)
      {
        flag = 0;
      }        
   //        ,   
   if (digitalRead(redLED)) { //  if (digitalRead(redLED) == 1)
         lcd.setCursor(0,0);
         lcd.print("Red");
        }
        else {
         lcd.setCursor(0,0);
         lcd.print("   ");
        }
   if (digitalRead(greenLED)) {
         lcd.setCursor(5,0);
         lcd.print("Green");
        }
        else {
         lcd.setCursor(5,0);
         lcd.print("     ");
        }
    if (digitalRead(blueLED)) { 
         lcd.setCursor(11,0);
         lcd.print("Blue");
        }
        else {
         lcd.setCursor(11,0);
         lcd.print("    ");
        }

 //  loop    
}

//-----------------------------------------------------------------------
//          
//     ,    
//     ,    
int get_key()
	{
	  int input = analogRead(A6);
	  int k;
	  for(k = 0; k < NUM_KEYS; k++) 
	    if(input < adcKeyVal[k]) 
	      return k + 1;     
	  return 0;
	}



总之,我们提供了一个简短的视频,演示了所描述的实验。



如您所见,Digital Lab套件扩展板的功能使您可以方便,图形化地快速学习使用Arduino和插件附加模块的实践。

在下一篇文章中,我们将考虑使用扩展卡通过蓝牙技术将Arduino与Android智能手机进行交互。我们将使用麻省理工学院开发和支持MIT App Inventor项目对智能手机进行编程

Source: https://habr.com/ru/post/zh-CN390345/


All Articles