Eksperimen berdasarkan Kit Laboratorium Digital

Dalam artikel pertama tentang kit pelatihan Lab Digital NR05 , kami menguraikan prinsip-prinsip konstruksi, komposisi kit, dan papan ekspansi.



Sekarang mari kita lihat bantuan pelatihan yang termasuk dalam kit, dan menganalisis dua pengalaman sederhana dengan menggunakan kartu ekspansi yang akan membantu Anda memahami bagaimana perangkat eksternal terhubung dan bagaimana menggunakan tombol bawaan, dan memberikan contoh sketsa.

Seperti yang telah kami katakan, papan berisi kelompok konektor untuk menghubungkan berbagai modul eksternal: sensor, aktuator dan perangkat menggunakan beberapa bus pertukaran informasi standar.

Sebagai aktuator, sebuah tempat disediakan di papan tulis untuk memasang indikator LCD dua karakter kristal cair dengan cahaya latar. Pada indikator seperti itu, informasi yang cukup dapat ditampilkan baik untuk tujuan pendidikan, dan ketika menggunakan kit sebagai perangkat yang sudah selesai. Manual pelatihan ini menjelaskan cara menampilkan informasi simbolik pada tampilan, cara membuat tampilan menampilkan huruf Rusia dan Inggris secara bersamaan. Indikator ini digunakan di hampir semua proyek yang dijelaskan dalam brosur.

Pertimbangkan aktuator paling sederhana - sebuah LED. Perangkat ini mencakup LED cerah tri-warna (RGB - Merah, Hijau, Biru). Dari ketiga warna LED tersebut, dengan mengubah intensitas masing-masing, karena karakteristik mata manusia, warna apa pun dapat diperoleh. Metode mendapatkan warna ini disebut pencampuran warna aditif dan digunakan, misalnya, di televisi dan monitor. Mencampur tiga warna dalam proporsi yang sama, kita mendapatkan warna putih.



Kami menghubungkan LED ke konektor XP15 pada kartu ekspansi, yang juga diberi label "RGB_LED" menggunakan empat kabel atau adaptor. Kami menggunakan LED dengan katoda umum (umum "minus"), sehingga output LED terpanjang terhubung ke terminal GND ("Ground"), dan output LED yang tersisa terhubung ke RED / D5 (merah), BLUE / D6 (biru), HIJAU / D9 (hijau).



D5, D6 dan D9 adalah pin digital Arduino tempat Anda dapat memperoleh modulasi lebar pulsa (PWM) untuk mengontrol kecerahan LED. Manual pelatihan menyediakan teori PWM minimum yang diperlukan dan cara untuk menerapkan modulasi ini di Arduino.



Berikut adalah kode untuk program (sketsa) yang mengontrol kecerahan cahaya dari LED RGB:

Spoiler
//    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    
}



Ketika program sedang berjalan, LED dengan lancar mengubah warna yang dipancarkan dari merah ke hijau, kemudian dari hijau ke biru, dan kemudian dari biru ke merah.
Kami melengkapi program kami sedemikian rupa sehingga LCD menampilkan nilai yang sesuai dengan kecerahan setiap warna dari minimum (0) hingga maksimum (255) pada setiap saat waktu. Kode yang dimodifikasi diberikan di bawah spoiler.

Spoiler
//    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);
}



Sekarang mari kita lihat contoh menggunakan tombol yang ada di papan tulis.



Dalam kasus umum, setiap tombol terhubung ke output digital Arduino yang terpisah dan program secara berurutan mensurvei output ini untuk menentukan tombol mana yang ditekan. Untuk menyimpan kesimpulan Arduino, yang harus digunakan untuk menentukan tekan tombol di papan ekspansi set Laboratorium Digital, keyboard "analog" digunakan, terhubung ke hanya satu input analog Arduino. Metode ini sering digunakan pada peralatan rumah tangga. Program mengukur tegangan keluaran pada keluaran pembagi tegangan, yang tergantung pada tombol mana yang ditekan. Dalam manual pelatihan, teori pembagi seperti itu dan metode penerapannya di keyboard dipertimbangkan. Kerugian dari metode ini adalah bahwa tombol hanya dapat ditekan satu per satu, secara berurutan.

Unduh program yang sesuai di Arduino:

Spoiler
//           
//-----------------------------------------------------------------------
//     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;
	}



Untuk menampilkan informasi tentang tombol mana yang ditekan, indikator LCD digunakan. Jika Anda menekan tombol, maka jumlah tombol yang ditekan akan ditampilkan pada indikator.

Fungsi get_key mengembalikan bilangan bulat yang sesuai dengan jumlah tombol yang ditekan, yang dapat digunakan dalam program utama. Nilai kalibrasi, yang dengannya tegangan dari output pembagi dibandingkan, ditentukan secara eksperimental menggunakan program ini:

#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);
}


Coba muat ke Arduino dan lihat nilai apa yang ditampilkan dan bandingkan dengan yang kalibrasi. Mari kita coba menggunakan contoh-contoh di atas untuk membuat program yang mengimplementasikan kontrol tombol menggunakan LED. Kami mengatur fungsionalitas berikut:

• ketika Anda menekan tombol 1 (paling kiri), lampu merah menyala, tombol 2 - hijau, 3 - biru. Saat tombol ditekan lagi, lampu yang sesuai padam. Indikator menunjukkan warna yang aktif.
• ketika tombol 4 ditekan, warna on dan off berubah tempat
• ketika tombol 5 ditekan, semua warna padam.

Berikut adalah salah satu opsi yang memungkinkan untuk sketsa tersebut:

Spoiler
//       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;
	}



Sebagai kesimpulan, kami menyajikan video pendek yang menunjukkan percobaan yang dijelaskan.



Seperti yang Anda lihat, kemampuan papan ekspansi kit Lab Digital memungkinkan Anda mempelajari praktik bekerja dengan Arduino dan modul tambahan plug-in dengan nyaman, grafis dan cepat.

Pada artikel selanjutnya, kami akan mempertimbangkan interaksi Arduino dengan smartphone Android menggunakan teknologi Bluetooth menggunakan kartu ekspansi. Kami akan memprogram ponsel cerdas menggunakan proyek MIT App Inventor , yang dikembangkan dan didukung oleh Massachusetts Institute of Technology.

Source: https://habr.com/ru/post/id390345/


All Articles