პროექტი №8 – RGB ნათურა

ამ პროექტში გავეცნობით PWM-ის საშუალებით ფერადი შუქდიოდების ნათების ცვლილებას სხვადასხვა ფერის სინათლის მისაღებად.

დაგვჭირდება:

შუქდიოდები: წითელი, მწვანე, ლურჯი და 3 ცალი 150-200Ω წინაღობა

 

(*მე ერთი ცალი გამოვიყენე, საერთო კათოდებსა და GND-ს შორის ჩართული, ნახატზე მოცემული შავი ფერის მავთულის მაგიერ, ანოდები კი პირდაპირ წითელ სადენებთან შევაერთე.)

სქემის აწყობა.

სტანდარტული გაფრთხილება: ყურადღებით დააკვირდით და გამორთულ არდუინოზე ააწყვეთ ქვემოთ მოყვანილი სქემა. სამივე შუქდიოდს ჩამოაფარეთ თეთრი ქაღალდის ცილიდრი, ან პინგ-პონგის გახვრეტილი ბურთი, პატარა აბაჟურის მსგავსად. რომელიც საჭიროა სამი ფერის დიფუზიური გაბნევა-შერევისათვის.

სურ. 3-4.

პროგრამული კოდი .

აკრიფეთ ქვემოთ მოყვანილი კოდი, შეამოწმეთ და ჩატვირთეთ არდუინოში.

float RGB1[3];
float RGB2[3];
float INC[3]; 
int red, green, blue;
int RedPin = 11;
int GreenPin = 10;
int BluePin = 9; 
void setup()
{
  randomSeed(analogRead(0));
  RGB1[0] = 0;
  RGB1[1] = 0;
  RGB1[2] = 0; 
  RGB2[0] = random(256);
  RGB2[1] = random(256);
  RGB2[2] = random(256);
}

void loop()
{
  randomSeed(analogRead(0));

  for (int x=0; x<3; x++) {
      INC[x] = (RGB1[x] - RGB2[x]) / 256; 
  }

  for (int x=0; x<256; x++) {
      red = int(RGB1[0]);
      green = int(RGB1[1]);
      blue = int(RGB1[2]);

      analogWrite (RedPin, red);
      analogWrite (GreenPin, green);
      analogWrite (BluePin, blue);
      delay(100);

      RGB1[0] -= INC[0];
      RGB1[1] -= INC[1];
      RGB1[2] -= INC[2];
  }

  for (int x=0; x<3; x++) {
      RGB2[x] = random(556)-300;
      RGB2[x] = constrain(RGB2[x], 0, 255);
      delay(1000);
  }

}

პროგრამის გაშვების შემდეგ მივიღებთ მდორედ ცვლად ფერად სინათლეს.

კოდის განხილვა.

ჩვენს პროექტში გამოყენებულია იგივე ძირითადი ფერები, რაც მონიტორის კონსტრუქციაში: წითელი, მწვანე და ლურჯი წერტილები: Red, Green, Blue (RGB). ამ წერტილების ანუ ჩვენს პროქტში შუქდიოდების სიკაშკაშის ცვლებით შეგვიძლია მივიღოთ RGB -ს სხვადასხვა მნიშვნელობა ანუ ფერი.

პროექტში სამი შუქდიოდის მაგიერ შეიძლება გამოიყენოთ ერთი ე.წ. RGB შუქდიოდი(უფრო კარგი ეფექტი მიიღება)  ოთხი გამომყვანით. აქედან ერთი გამომყვანი არის ან საერთო ანოდი ან საერთო კათოდი. ხოლო დანარჩენი სამი – კი შესაბამისი ფერის გამომყვანი.

თუ RGB -ს მნიშვნელობა არის 255, 0, 0 მაშინ ვღებულობთ წითელს. თუ 0, 255, 0 მაშინ მწვანეს და თუ 0, 0, 255 – ლურჯს. სიკაშკაშის ცვლილების გარეშე, სამი ძირითადი ფერის მხოლოდ ჩართვა (ON) ან გამორთვით (OFF), მიღებული ყველ შესაძლო ფერების ჩამონათვალი მოცემული ქვემოთ მოყვანილ ცხრილში და სურათზე.

წითელი მწვანე ლურჯი მიღებული ფერი
255 0 0 წითელი
0 255 0 მწვანე
0 0 255 ლურჯი
255 255 0 ყვითელი
0 255 255 ცისფერი
255 0 255 მეწამული
255 255 255 თეთრი

RGB შუქდიოების მხოლოდ ჩართვით(ON) ან გამორთვით(OFF) მიღებული ფერები.

შუქდიოდების სიკაშკაშის ცვლილების PWM მეთოდის გამოყენებით, როდესაც RGB -ს თითოეული მნიშვნელობა და შესაბამისად ფერი იცვლება 0 255 დიაპაზონში, შეგვიძლია დამატებით მივიღოთ 16777216 ფერი (256x256x256).

პროგრამული კოდი იწყება float ტიპის მასივის და integer ტიპის ცვლადების გამოცხადებით. რომლებიც გამოიყენებიან increment და RGB-სმნიშვნელობებისათვის:

float RGB1[3];
float RGB2[3];
float INC[3];

int red, green, blue;

setup ფუნქციაში გვაქვს, randomSeed(analogRead(0));

randomSeed ბრძანების საშუალებით ხდება შემთხვევითი(random), სინამდვილეში კი ფსევდო-შემთხვევითი (pseudo-random) რიცხვების გენერირება. კომპიუტერის ჩიპს არ შეუძლია ჭეშმარიტად შემთხვევითი რიცხვების გენერირება, ამისათვის ის მიმართავს თავის მახსოვრობას ან სხვადასხვა მნიშვნელობების ცხრილს და მიღებულ მნიშვნელობებს იყენებს როგორც ფსევდო-შემთხვევით მნიშნელობებს. Seed-ის გამოყენებით, (რაც აქ ნიშნავს საწყის, პირველწყაროს), ჩვენ მივუთითებთ კომპიუტერს თუ საიდან უნდა იქნეს აღებული ან ათვლილი შესაბამისი მნიშვნელობები. შვენს პროექტში randomSeed მიმართავს ანალოგურ კონტაქს ნომრით 0 (Analog Pin 0). რადგან ამ Analog Pin 0ზე არაფერი არ არის მიერთებული, მაზე ყოველთვის წარმოქმნება ელექტრო ”ხმაური”, ფლუქტუაცია, გნებავთ შიგნიდან ან გარედან ინდუცირებული ანალოგური სიგნალი. მას შემდეგ რაც მითითებულია შემთხვევითი სიგნალოს წყარო, შეიძლება ისეთი ფუნქციის შექმნა რომელიც გამოიყენებს random()-ს. შევთანხმდეთ, რომ სიმარტივისთვის, ფსევდო შემთხვევითი რიცხვის მაგიერ, გამოვიყენოთ ტერმინი შემთხვევითი რიცხვი.

ასევე გვაქვს ორი, სამ-სამ ელემეტიანი მასივი სადაც ინახება RGB-ს მნიშვნელობები. RGB1 შეიცავს RGB -ის იმ მნიშნელობებს რომლებიც განსაზღვრავენ შუქდიოდების საწყის ნათებას, ამ შემთხვევაში ყველ არის 0 ან off):

RGB1[0] = 0;
RGB1[1] = 0;
RGB1[2] = 0;

RGB2 მასივი წარმოადგენს RGB-ს შემთხვევით მნიშვნელობებს რომლებიც გამოიყენებიან შუქდიოდების სიკაშკაშის ცვლილებისათვის:

RGB2[0] = random(256);
RGB2[1] = random(256);
RGB2[2] = random(256);

აქ, მასივის ელემეტებს მიენიჭება შემთხვევითი რიხვები, 0 დან 255-ის ჩათვლით, სულ 256 მნიშვნელობა რაც ფრჩხილებშია მითითებული 256.

მაგალითისთვის თუ random() ფუნქციაში ჩავწერთ (გადავცემთ) 1000, მაშინ random(1000)დაგვირუნებს მნიშვნელობებს 0 დან 999-ის ჩათვლით. ხოლო თუ ჩავწერთ ორ პარამეტრს random(10,100)მაშინ დაგვიბრუნდება შემთხვევითი რიცხვები [10 ; 99]. ამ მაგალითებიდან ჩანს, რომ ზედა ზღვარს ყოველთვის აკლდება 1.

პროგრამის მთავარ ციკლში (loop), ვამოწმებთ RGB-ს საწყის და ბოლო მნიშნელობებს და ვარკვევთ, თუ ბიჯის(increment) რა მნიშვნელობა არის საჭირო, რომ გადავიდეთ ერთი მიშვნელობიდან მეორეზე 256 ბიჯის გავლით (PWM-ის მნიშვნელობები უნდა იყოს 0255 დიაპაზონში). ეს კეთდება შემდეგნაირად:

for (int x=0; x<3; x++) {
INC[x] = (RGB1[x] - RGB2[x]) / 256; 
}

ამ for ციკლს გამოყავს INCის (increment-ის პირველი სამი ასო) მნიშვნელობები R, G and B არხებისთვის. კაშკაშის განმსაზღვრელ ორ მნიშნელობას შორის სხვაობა იყოფა 256.

შემდეგი for ცკილი

for (int x=0; x<256; x++) {
    red = int(RGB1[0]);
    green = int(RGB1[1]);
    blue = int(RGB1[2]);

    analogWrite (RedPin, red);
    analogWrite (GreenPin, green);
    analogWrite (BluePin, blue);

    delay(100);

    RGB1[0] -= INC[0];
    RGB1[1] -= INC[1];
    RGB1[2] -= INC[2];
}

გამოითვლის წითელ, მწვანე და ლურჯი ფერის შესაბამის მნიშვნელობებს RGB1 მასივში; გადასცემს ამ მნიშვნელობებს ციფრულ 9, 10 და 11 კონტაქტებს, გამოაკლებს ინკრემეტის ბიჯს და გაიმეორებს ამ პროცეს 256-ჯერ. შედეგად შემთხვევითი ფერი მდორედ გადავა, გადაედინება სხვა შემთხვევით ფერში. ინკრემეტის ბიჯებს შორისი 100მლწმ დაყოვნება delay(100)იძლევა ფერების შენელებულ და თანაბარ ცვლილებას. ამ დაყოვნების შეცვლა შეიძლება პროგრამულად delay()– ში არგუმენტის ცვლილებთ, ან მე-6 გაკვეთილში აღწერილი პოტენციომეტრის გამოყენებით,.

შემთხვევითი ფერების 256-ჯერ შეცვლის შემდეგ, RGB1 მასივში აღმოჩნდება RGB2 მასივის ტოლი ან თითქმის ტოლი მნიშნელობები. ამის თავიდან აცილების მიზნით პროგრამის ბოლოში არის ახალი for ციკლი:

for (int x=0; x<3; x++) {
    RGB2[x] = random(556)-300;
    RGB2[x] = constrain(RGB2[x], 0, 255);
    delay(1000);
}

შემთხვევითი რიცხვები აიღება 0-556 დიაპაზონში და შემდეგ აკლდება 300. ამით შესაძლებელია გამოვრიცხოთ საწისი ფერების განმეორება, ანუ ახალი ციკლის იგივე ფერით დაწყება და მსვლელობა. 556-დან გვექნება 300 შემთხვევა, შანსი იმისა, რომ მივიღებთ უარყოფით მნიშვნელობებს და შესაბამისად თავიდან ავიცილებთ ორ ან ერთ ძირითად ფერთან მიახლოებას. მესამე სტრიქონში მოცემული ბრძანება, constrain() ფუქნციის გამოყენებით არ გაატარებს უარყოფით მნიშნელობებს PWM კონტაქტებზე.

გავიხილოთ თუ როგორ მუშაობს constrain()(შეზღუდვა, პირობის შემოღება) ფუნქცია. მოცემული ფუნქცია იყენებს სამ პარამეტრს x, a, და b, სადაც x არის შესაზღუდი სიდიდე, a არის შეზღუდვის ქვედა ზღვარი, ხოლო b წარმოადგენს ზედა ზღვარს. constrain() ფუნქცია ამოწმებს არის თუ არა x მნიშვნელობა მოქცეული [a; b] შუალედში. თუ x <a, მაშინ ფუნქცია დაგვიბრუნებს a-ს; თუ x>b, მაშინ ფუნქცია დაგვიბრუნებს b-ს. თუ x მოქცეულია [a; b] შუალედში მაშინ ფუნქცია დააბრუნებს x-ის მიმდინარე მიშვნელობას.

ჩვენს შემთხვევაში, თუ constrain(RGB2[x], 0, 255)ფუნქციის RGB2[x]არგუმენტის მნიშვნელობა მოქცეულია [0; 255] დიაპაზონში, მისი მნიშვნელობა გადაეცემა PWM კონტაქტს. ხოლო უარყოფითი მნიშვნელობები იქნება იგნორირებული.

გაგრძლება იხ. გაკვეთილი №10.

One Response to პროექტი №8 – RGB ნათურა

  1. scienceasm says:

    წიგნის თარგმანი ქვეყნდება forum.ge – ზე Hinkalino-ს მიერ.
    დამატებითი შეკითხვები თემაში
    ==========================================
    “Arduino ს ინტერფეისი”
    ==========================================
    http://forum.ge/?f=48&showtopic=34393677

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: