Atmel Studio + avrdude პროგრამატორი

December 20, 2012

როდესაც Atmel Studio – სთან თავსებადი პროგრამატორი არ გაქვს, საკმაოდ დისკომფორტს გიქმნის მიკროკონტროლერის პროგრამირების პროცესი. მაგ. წერ პროგრამას Atmel Studio-ში აკომპილირებ, შემდეგ ცალკე უნდა გახსნა პროგრამა პროგრამატორი მიუთითო კონტროლერი, მიაბა .hex ფაილი და ჩატვირთო მიკროკონტროლერში (მოცემული პროცესი დეტალურადაა აღწერილი წინა სტატიაში).  პროცესი საკმაოდ მარტივდება პროგრამა პროგრამატორის Atmel Studio -ზე მიბმით. შედეგათ ვწერთ პროგრამას და Atmel Studio-თივე ვაპროგრამებთ მიკროკონტროლერს.  მივყვეთ თანმიმდევრობით და Atmel Studio-ს მივაბათ avrdude პროგრამატორი.

ვინდოუსზე avrdude-ს დაინსტალირებისთვის ვიწერთ WinAVRIDE-ს, რასაც თავისთავად მოყვება avrdude. windows-ზე avrdude-თი პროგრამირების დროს, არის შემდეგი პრობლემა,  avrdude ვერ ხედავს პროგრამატორს რადგან არ აქვს პორტებთან წვდომა, ამიტომ საჭიროა giveio.sys -ის დაინსტალირება. დაინსტალირება შეიძლება მარტივათ cmd-დან C:\WinAVR-20100110\bin\install_giveio.bat ფაილის გაშვებით.  შემდეგი პრობლემა arvdude-ზე რაც შემემთხვა ეს იყო, რომ მინდოდა atmega328 -ის დაპროგრამირება მაგრამ avrdude აპროგრამებს atmega328P (Pico. power) ხოლო atmega328-ს არ აპროგრამებს, რადგან განსხვავებული ID აქვს. სინამდვილეში პრობლემა ადვილათ მოგვარებადია, რადგამ განსხვავება atmega328-სა და atmega328P-ს შორის არის მხოლოდ ის რომ atmega328P უფრო ენერგო ეკონომიურია, დანარჩენი თითქმის ერთიდაიგივეა. იმისთვის რომ ჩვენთვის სასურველი კონტროლერი დაემატოს პროგრამირებად კონტროლერების სიაში საჭიროა შევცვალოთ C:\WinAVR-20100110\bin\avrdude.conf ფაილი, მარტივად დავაკოპიროთ atmega328P-ის პროგრამირების პარამეტრები, ჩავამატოთ და შევცვალოთ დასახელებები atmega328P- ს ნაცვლათ atmega328, m328p-ს ნაცვლათ m328, “signature = 0x1e 0x95 0x0F” ის ნაცვდათ “signature =  0x1e 0x95 0x14”. ამის შემდეგ უპრობლემოთ დავაპროგრამებთ. ( მსგავსი თემა avrfreak-ზე )

პროგრამატორის AtmelStudio-თან დასაკავშირებლათ, შევდივართ AtmelStudio-ში შემდეგ Tools>External Tools> გაიხსნება External Tools ფანჯარა, მოცემულ ფანჯარას ვავსებთ შემდეგნაირად:
ვამატებთ ორ მოწყობილობას პირველი როგორც Debug და მეორე Release.
1) ვავსებთ პროგრამატორის დასახელებას, როგორც გვინდა რომ გამოჩნდეს
Title: STK200 Debug

2) პროგრამა პროგრამატორი
Command: avrdude.exe

3) პროგრამირების ბრძანება
Argument: -c stk200 -P lpt1 -p t2313 -U flash:w:$(ProjectDir)Debug\$(ItemFileName).hex:i

მოცემული ბრძანება ეკუთვნის პროგრამატორის კონკრეტულ ტიპს stk200 და ATtiny2313 კონტროლერს, სხვა შემთხვევაში საჭიროა აღნიშნული დასახელებების შეცვლა, avrdude-ს მიერ მხარდაჭერილი პროგრამატორების ჩამონათვალი შეგვიძლია გავიგოთ CMD-ში avrdude -c asdf ბრძანებით, ხოლო მიკროკონტროლერების ჩამონათვალი avrdude -c avrisp ბრძანებით.  avrdude-სთან მუშაობისათვის და მატებითი ინფორმაციისთვის გადახედეთ ტუტორიალს Starting out with avrdude.

Release-სთვის მონაცემები მსგავსია, განსხვავებაა მხილოდ Argument-ში
ანუ Debug -ის ნაცვლად წერია Release
Arguments: -c stk200 -P lpt1 -p t2313-U flash:w:$(ProjectDir)Release\$(ItemFileName).hex:i

lsadfkjhalsjkdfa

სურ.1 მონაცემები Debug-ისთვის

a;slkdh;laksdf

სურ.2 მონაცემები Release-სთვის

ამის შემდეგ შედარებით გამარტივებულია პროგრამირების პროცესი. მაგ. თუ პროექტი არის Debug რეჟიმში, პროგრამირება მოხდება შესაბამისად Tools>STK200 Debug, ხოლო თუ Release რეჟიმშია Tools>STK200 Release.


Fuse ბიტები AVR მიკროკონტროლერში

December 19, 2012

როგორ ვიცით avr მიკროკონტროლერებში მეხსიერების სამი ელემენტია: პროგრამული მეხსიერება ე.წ. ფლეშ მეხსიერება, ოპერატიული მეხსიერება SRAM და მუდმივ მონაცემთა მეხსიერება EEPROM. მაგრამ გარდა ამისა კიდევ არის მეხსიერების ძალზე მცირე ნაწილი (სულ რამოდენიმე ბაიტი), რომელიც მიკროკონტროლერის პროგრამირებისთვის და მუშაობისთვის ძირითადი საკვანძო ფუნქციების კონფიგურაციისთვის გამოიყენება. მგალითად როდესაც მიკროკონტროლერთან პირველათ გიწევს შეხება, შეიძლება არც იცოდე და არც გაინტერესებდეს Fuse ბიტები, რადგან  Fuse ბიტების ყოველგვარი ცვლილების გარეშე კონტროლერს დააპროგრამებ და იმუშავებს კიდეც უპრობლემოთ. მაგრამ მუშაობისას შეინიშნება ერთი შეხედვით გარკვეული უცნაურობები, მაგ. იმისდა მიუხედავთ, რომ მიკროკონტროლერის მაქსიმალური ტაქტური სიხშირე არის 20MHz-მდე და მიერთებული გაქვს მაგალითად 8MHz-ის კვარცული  რეზონატორი, კონტროლერი მუშაობს მაინც 1MHz სიხშირით და იმპულსების პერიოდიც არ არის სტაბილური. ალბათ უკვე მიხვდით რომ სწორედ ამ შემთვევაში ვჭირდება Fuse ბიტების კონფიგურაცია, ანუ მიკროკონტროლერის დაპროგრამების წინ პირველ რიგში გადავაპროგრამებთ Fuse ბიტებს, სასურველი ტაქტური სიხშირის თუ გენერატორის ტიპის მითითებისთვის. დამწყებები ხშირად ერიდებიან Fuse ბიტების პროგრამირებას და გარკვეული შიშიც კი აქვთ (ზოგი ქირურგიულ ოპერაციასაც კი ადარებს), რასაც მართლაც აქვს გარკვეული საფუძველი, რადგან არასწორი კონფიგურაციის შემთხვევაში შეიძლება მთლიანათ დაკარგოთ მიკროკონტროლერზე წვდომა, ასე მოვკალი attiny ერთ ერთი პროგრამირების დროს სადღაც შეცდომით დავაყენე კონფიგურაცია და პროგრამატორი ვეღარ ხედავდა. გაცოცხლების შანსი არის რათქმა უნდა, უბრალოთ  ISP (In-System programmer) პროგრამატორი ვერ ხედავს, თორე პარალელური პროგრამატორით შეიძლება გადაკონფიგურირება, რისი აწყობაც ბევრს დაეზარება 1 დოლარიანი მიკროკონტროლერის გულისთვის. ქვემოთ ნაჩვენებია ძირითადი Fuse პიტები. (კონფიგურაციის პროცესს განვიხილავთ ATtiny2313-ის მაგალითზე, სხვა კონტროლერების კონფიგურაციის ბიტები მსგავსია, შეიძლება იყო მცირე განსხვავება.)

Bit Low High Extended
7 CKDIV8
Divide clock by 8
DWEN
debugWIRE Enable
6 CKOUT
Clock output
EESAVE
EEPROM memory is preserved through chip erase
5 SUT1
Select start-up time
SPIEN
Enable Serial programming and Data Downloading
4 SUT0
Select start-up time
WDTON
Watchdog Timer Always On
3 CKSEL3
Select Clock Source
BODLEVEL2
Brown-out Detector trigger level
2 CKSEL2
Select Clock Source
BODLEVEL1
Brown-out Detector trigger level
1 CKSEL1
Select Clock Source
BODLEVEL0
Brown-out Detector trigger level
0 CKSEL0
Select Clock Source
RSTDISBL
External reset disable
SELFPRGEN
Self Programming Enable

აუცილებელია დავიმახსოვროთ რომ კომფიგურაციის ბიტში 0 -ის ჩაწერა ნიშნავს რომ მოცემული ფუნქცია ნება დართულია, ხოლო 1-ის ჩაწერით ხდება ბიტის წაშლა.        High ბიტებს რომლებიც წითლათ არის ნაჩვენები უკეთესი იქნება თუ არ შევეხებით,  მგალითად SPIEN ბიტის გასუფთავებით (ერთიანის ჩაწერით) გავაკეთებთ იმას რომ  მიმდევრობითი ISP პროგრამირებისთვის მიკროკონტროლერი მიუწვდომელი გახდება და გადაპროგრამებას ვეღარ შევძლებთ პარალელური პროგრამატორის გარეშე, RSTDISBL ბიტის დაპროგრამებით (ანუ 0-ის ჩაწერით) მიკროკონტროლერის RESET პინს აღარ ექნება რესეტის ფუნქცია და ასევე შეუძლებელი გახდება პროგრამირება, ასევე DWEN ბიტის დაპროგრამებით (0-ის ჩაწერით) უქმდება DebugWire-ის ფუნქცია, რაც თავის მხრივ შეთავსებულია RESET პინთან და მივიღებთ იგივე შედეგს რაც RSTDISBL პინის დაპროგრამებით. ყავისფერათ ნაჩვენები ბიტების კონფიგურაცია შეიძლება, მაგრამ აუცილებელია სიბრთხილე, რომელიმე მოცემული ბიტის არამიზანმიმართული კონფიგურაციის შემთხვეაში, მიკროკონტროლერს ექნება გარკვეული პრობლემები მუშაობის დროს. მაგალითად EESAVE ბიტის დაპროგრამებით (0-ის ჩაწერით) მიუწვდომელი გახდება EEPROM-ის პროგრამირება, რაც რათქმაუნდა არარის სასურველი და აუცილებლობაც ნაკლებია, რომ როდისმე დაგჭირდეს მოდემული ფუქცია. SELFPRGEN ბიტის დაპროგრამებით (0-ის ჩაწერით) შესაძლებელი ხდება მიკროკონტროლერისთვის თვითპროგრამირების ფუნქციის ამოქმედება, ანუ გარკვეული ბრძანებებით შესაძლებელია ავტომატურად მოხდეს პროგრამულ მეხსიერებიდან კოდის ატვირთვა და ჩამოტვირთვა. WDTON ბიტი გამოიყენება Watchdog ტაიმერის ჩასართავად, მოცემული ბიტის დაყენების შემდეგ (0-ის ჩაწერით), Watchdog ტაიმერი იქნება მუდმივად ჩართული და გარკვეული პროგრამული კოდის არარსებობის შემთხვევაში, მიკროკონტროლერის დარესეტება (ჩამოიყრა) მოხდება მუდმივათ რაიმე პერიოდით. BODLEVEL  ბიტები შედარებით უწყინარია, მოცემული სამი ბიტით ხდება მითითება თუ კვების ძაბვის (Vcc) რომელ დონეზე მოხდეს Brown_out რესეტი.

BODLEVEL2..0 VCC
111 Brown-out დეტექტორი გაუქმებულია
110 1.8ვ
101 2.7ვ
100 4.3ვ

ყველაზე ხშირად გამოიყენება Low ბიტების კონფიგურაცია, რადგან სწორედ მოცემული ბიტებით ხდება მიკროკოტროლერისთვის მითითება თუ როგორი ტიპის გენერატორი გამოიყენოს ტაქტური იმპულსებისთვის და რა სიხშირეზე იმუშაოს. მაგალითად CKDIV8 ბიტის გაწმენდით (1-ის ჩაწერით), საშუალება გვეძლევა ვამუშაოთ კონტროლერი 1MHz -ზე მეტი  ტაქტური სიხშირით. ATtiny2313-ის შემთხვევაში, თავდაპირველათ შიდა გენერატორი (როდესაც ჯერ არ არის გადაპროგრამირებული Fuse ბიტები) მუშაობს 8MHz ტაქტურ სიხშირეზე. ამასთან ერთად ასევე დაპროგრამებულია  CKDIV8 ბიტი, რითაც ხდება ტაქტური სიხშირის გაყოფა 8ჯერ. შედეგათ ვიღებთ მიკროკონტროლერის ტაქტურ სიხშირეს 1MHz-ს. ამიტომ თუ გვინდა რომ კონტროლერი ვამუშაოთ 1MHz-ზე მეტი ტაქტური იმპულსებით, პირველრიგში სწორედ მოცემული ბიტი უნდა გავწმინდოთ (ჩავწეროთ 1-იანი).

SUT (Select start-up time) ბიტებით ხდება მიკროკონტროლერის ჩატვირთვის დრიოს შერჩევა.

CKOUT ბიტის დაყენებით საშუალება ვეძლევა კონტროლერის ერთ-ერთ პინზე გამოვიყვანოთ ტაქტური იმპულსები.

Fuse ბიტებიდან ველაზე ხშირად კომფიგურირებადი CKSEL ბიტებია, სწორედ მოცემული ბიტებით ხდება ტაქტური იმპულსების გენერატორის სიხშირის განსაზღვრა და გარე ტაქტური იმპულსების გენერატორისთვის, კვარცული ან კერამიკული რეზონატორის თუ RC გენერატორის მითითება.

 გენერატორს ტიპი და ტაქტური სიხშირე CKSEL3..0
გარე ტაქტური პიმულსების წყარო 0000
4MHz-იანი შიდა RC გენერატორი 0010
8MHz-იანი შიდა RC გენერატორი 0100
Watchdog გენერატორი 128kHz 0110
გარე კვარცული გენერატორი / კერამიკული რეზონატორი 1000 – 1111
რეზერვირებული 0001/0011/0101/0111

დასასრულს ავღნიშნოთ, რომ კონფიგურაცია ყოველთვის კარგი იქნება თუ დატაშიტის მიხედვით მოხდება, გარდა ამისა არსებობს Fuse ბიტების რამოდემიმე კალკულატორი მაგლითად AVR Fuse Calculator რაც საკმაოდ კარგი დამახმარე საშუალებაა სხვადასხვა ტიპის პროგრამა პროგრამატორების გამოყენების დროს (მაგ. PonyProg, avrdude).

დამხმარე რესურსები

1. Fuse-биты – это не страшно.

2. Connecting External Crystal Oscillator to Atmega

3. Starting out with avrdude

4. ATtiny2313 Datasheet


პროექტი №14 – სინათლის სენსორი.

December 16, 2012

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

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

პიეზო დინამიკი  (ან პიეზო დისკი) soiwoekw

ორკონტაქტიანი ტერმინალი             sfjwerf;;wre

ფოტო წინაღობა (1kΩ10kΩ)             lksjslkfj;werf

10kΩ წინაღობა                   lskjfwlekf

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

როგორც ყოველთვის, გამოვაძროთ არდუინოდან USB კაბელი და ავაწყოთ ქვემოთ მოყვანილი სქემა.

ewjf;welkf;qwkf

სურ. 4-4. სქემა მე-14-ე პროექტისთვის – სინათლის სენსორი

ფრ–ს პოლარობა არ აქვს, ამიტომ სქემაში მისი ჩართვა უბრალო წინაღობის მსგავსია.

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

// Project 14 - სინათლის სენსორი
// პიეზო ელემენტი მიერთებულია მერვე გამომყვანზე (Pin 8)
int piezoPin = 8;
// ფრ მიერთებული №0 ანალოგურ გამომყვანზე (Aalog Pin 0)
int ldrPin = 0; 
int ldrValue = 0; // ფრ–დან მიღებული საწყისი სიდიდე
void setup() {
 // ცარიელია
}
void loop() {
  // ფრ–დან რაღაც მნიშვნელობის მიღება 
  ldrValue = analogRead(ldrPin); 
  // პიეზო ელემენტი გამოსცემს 1000ჰც სიხშირის ტონს
  tone(piezoPin,1000); 
  delay(25); // დალოდება 25 მილიწამით
  noTone(piezoPin); // ტონის შეწყვეტა
  delay(ldrValue); //ldrValue–ს ტოლი მილიწამით დაყოვნება
} 

არდუინოში ჩატვირთვის და პროგრამის გაშვების შემდეგ გავიგონებთ მოკლე ხმოვან სიგნალებს. ამ სიგნალებს შორის დაყოვნება მით მეტია რაც უფრო ნაკლები სინათლე ეცემა ფრ–ს და პირიქით: დაყოვნება ნაკლებია რაც მეტია სინათლის ნაკადი. შეგიძლიათ ფრ ამოძრაოთ სხვადასხვა მიმართულებით მასზე მირჩილული გრძელი მავთულების საშუალებით.

ამ გაკვეთლის პროგრამული კოდი საკმაოდ მარტივია და ადვილად გასარჩევი. ამიტომ პრდაპირ

გადავიდეთ სქემის განხილვაზე და ძალიან მოკლედ გავეცნოთ ფოტო რეზისტორის მუშაობას და დამატებითი წინაღობის დანიშნულებას.

სქემის განხილვა.

ფოტო რეზიტორებს ამზადებენ კადმიუმ–სულფატის ფოტომგძნობიარე შენაერთისაგან ( CdS: Cadmium-Sulfide) და მათ აქვთ სხვადასხვა წინაღობა.

oiegjtwejf[we

სხვა და სხვა კონსტრუქციისის ფოტო რეზიტორები.

კონსტრუქციულად ფრ–ის გამომყვანები მიერთებული ელექტროდებთან, მათ შორის ზიგზაგურად დატანილია ფოტომგძნობიარე მასალა და ზემოდან დაცულია გამჭვირვალე პლასტიკით.

ფოტომგძნობიარე მასალზე სინათლის მოხვედრის შედეგად მისი წინაღობა ეცემა და მასში გამავალი დენის სიდიდე მატულობს.

დამატებითი წინაღობის დანიშნულების გასარკვევად განვიხილოთ ორი რეზისტორისაგა შედგენილი უმარტივესი ძაბის დამყოფი. მისი საშუალებით შესაძლებელია სქემის რომელიმე ნაწილში შეცირებული ძაბვის მიწოდება

ამ გაკვეთილში გამოყენებულია მუდმივი 10kΩ სიდიდის წინაღობა და ცვლადი წინაღობა ფრ–ის სახით. ძაბვის დამყოფის სტანდარტული სქემა მოცემული ქვემოთ.

pgjsd[fjvsv

როგორც ნახაზიდან ჩანს, შემავალი ძაბვა(Vin) მოდებულია ორივე წინაღობაზე. ერთ რომელიმე წინაღობაზე მოსული, ანუ დაყოფილი ძაბვა კი იქნება ნაკლები და მას პირობითად დავარქვათ გამომავალი ძაბვა (Vout). ამ გამომავალი ძაბვის გამოსათვლელი ფორმულა ასეთია:
Vout = (R2/(R2+R1))x Vin

მაგ. თუ R1=R2=100Ω (ანუ =0.1kΩ) და შემავალი ძაბვა Vin=5ვ, მაშინ გამომავალი ძაბვა იქნება:

Vout= (0.1/(0.1+0.1))X5 = 2.5

თუ R1=R2=470Ω მაშინ:

 

Vout= (0.47/(0.47+0.47))X5 = 2.5ვ

იმ შემთხვევაში თუ R1=1kΩ და R2=500Ω მაშინ:

Vout= (0.5/(0.5+1))X5 = 1.66ვ

თუ R1=1kΩ და R2=2kΩ მაშინ

Vout= (2/(2+1))X5 = 3.33ვ

ძაბვის გამყოფისათვის მნიშვნელოვანია წინაღობების სიდიდე, მაგრამ გაცილებით მნიშვნელოვანია მათ შორის თანაფარდობა.

რადგან ჩვენს სქემაში გამოყენებულია მუდმივი 10kΩ წინაღობა და ფრ რომლის წინაღობა იცვლება 10kΩდან (სრული დაბნელება) 1kΩ–მდე (მაქსიმალური განათება), მაშინ გამომავალი ძაბვა და მისი შესაბამისი განათებულობის მნიშვნელობები მოცემულია ქვემოთ მოყვანილ ცხრილში.

R1

R2 (ფრ)

გამომავალი ძაბვა Vout

განათებულობა

10kΩ

100kΩ

4.54

სიბნელე

10kΩ

73kΩ

4.39

25%

10kΩ

45kΩ

4.09

50%

10kΩ

28kΩ

3.68

75%

10kΩ

10kΩ

2.5

მაქს. სიკაშკაშე


პროექტი № 13 – კაკუნის პეზო სენსორი

December 15, 2012

როგორც უკვე ვიცით, პიეზო კრისტალზე ძაბვის მოდების დროს კრისტალი იცვლის ზომას და შედეგად კრისტალი გამოცემს ბგერით ტალღას. ასევე პიეზო კრიტალზე მექანიკური ზემოქმედების შედეგად კი წამოიქმნება ძაბვა. სწორედ ამ ბოლო თვისებას გამოვიყენებთ წინამდებარე პროექტში.

დაგვჭირდება

პიეზო დინამიკი     dporgkpsorkg

ორკონტაქტიანი ტერმინალი  'zkjsdv'kjav

შუქდიოდი  osidhugwoueirg

1Mწინაღობა   fuhgpsiug

* შეგიძლიათ პიეზო ელემენტის გამომყვანებს მიარჩილოთ 22 awg მავთული(იხ. გაკვეთლი 1, სურ. 2-8.) და ჩართოთ დაფაში, ან არდუინოში.

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

opdisfvpejfv

სურ. 4-3. სქემა მე-13-ე პროექტისთვის – კანუნის პიეზო სენსორი

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

// Project 13 - კაკუნის პიეზო სენსორი
int ledPin = 9; // შუქდიოდი მე-9 გამომყვანზე
int piezoPin = 5; // პიეზო მიერთებულია მე-5 ანალოგურ გამომყვანზე
int threshold = 120; 
// სესორის საწყისი მინიშვნელობა 120 მის გააქტიურებამდე
int sensorValue = 0; // ცვლადი რომელიც ინახავს სენსსორიდან 
// მიღებული სიგნალის სიდიდეს 
float ledValue = 0; // შუქდიოდის ნათების სიდიდე.

void setup() {
   // ledPin განსაზღვრულია როგორ გამომავალი კონტაქტი
   pinMode(ledPin, OUTPUT);
   //პროგრამის გაშვებისას შუქდიოდი აინთება ორჯერ   
   digitalWrite(ledPin, HIGH); 
   delay(150); 
   digitalWrite(ledPin, LOW); 
   delay(150);
   digitalWrite(ledPin, HIGH); 
   delay(150); 
   digitalWrite(ledPin, LOW); 
   delay(150);
}

void loop() {
   sensorValue = analogRead(piezoPin);//სესორის მიშვნელობის მიღება
   if (sensorValue >= threshold) { 
      // თუ კაკუნია რეგისტრირებული, შუქდიოდი აინთოს მაქსიმუმადე
      ledValue = 255;
   }
   // ნათების სიდიდის გადაცემა შუქდიოზე
   analogWrite(ledPin, int(ledValue) );
   ledValue = ledValue - 0.05; // შუქდიოდი ჩაქრეს ნელა
   if (ledValue <= 0) { ledValue = 0;} 
   //ledValue ნულზე ნაკლები არ უნდა იყოს 
}

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

არდუონო დააფიქსირებს კაკუნს ან კრისტალზე მოდებულ დაწოლას. შუქდიოდი განათდება და დაიწყებს ნელა ჩაქრობას.

სხვა და სხვა ტიპის პიეზო ელემენტისათვის შეიძლება საჭირო გახდეს threshold-თვისგანსხვავებული საწყისი მნიშვნელობის მინიჭება. მისი დაბალი მნიშვნელობა ნიშნავს მეტ მგძნობიაროას, ხოლო მეტი მნიშვნელობა დაბალს.

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

ზემოთ მოყვანილ კოდში ახალი არაფერია.

აქ გამოცხადებულია ცვლადები და მოცემულია კომენტარები:

int ledPin = 9; // შუქდიოდი მე-9 გამომყვანზე 
// პიეზო მიერთებულია მე-5 ანალოგურ გამომყვანზე
int piezoPin = 5; 
// სესორის საწყისი მინიშვნელობა მის გააქტიურებამდე
int threshold = 120; 
// ცვლადი რომელიც ინახავს სენსსორიდან მიღებული
// სიგნალის სიდიდეს
int sensorValue = 0; 
float ledValue = 0; //შუქდიოდის ნათების სიდიდე. 

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

void setup() {
   pinMode(ledPin, OUTPUT);
   digitalWrite(ledPin, HIGH); 
   delay(150); 
   digitalWrite(ledPin, LOW); 
   delay(150);
   digitalWrite(ledPin, HIGH); 
   delay(150); 
   digitalWrite(ledPin, LOW); 
   delay(150);
}

პროგრამის მთავარ ციკლში ხდება მეხუთე ანალოგური კონტაქტიდან, რომელზეც პიეზო ელემენტია მიერთებული, მნიშვნელობის წაკითხვა.

sensorValue = analogRead(piezoPin);

შემდეგ, პროგრამული კოდი ამოწმებს არის თუა არა მიღებული სიგნალის სიდიდე მეტი ან ტოლი (>=) ვიდრე threshold-თვის მინიჭებული საწყისი მნიშვნელობა.და თუ მეტი ან ტოლი მაშინ ledValue-ს მიენიჭება 255, რას არის PWM ტიპის №9(Pin 9) ციფრული კონტაქტზე გამომავალი ძაბვის მაქსიმალური სიდიდე.

if (sensorValue >= threshold) {
    ledValue = 255;
}

და ეს სიდიდე გადაეცემა PWM Pin 9-ს. რადგან ledValue არის float ტიპის, საჭიროა მისი გარდაქნა integer ტიპად, რადგან analogWrite ფუნქციისათვის დასაშვებია მხოლოდ integer ტიპის ცვლადები:

analogWrite(ledPin, int(ledValue) );

შემდეგ ledValue ცვლადი მნიშვნელობა მცირდება, მას თანდათან აკლდება 0,05

ledValue = ledValue – 0.05;

და შუქდიოდი ნელა ჩაქრება თუ არ დაფიქსირდა ახალი კაკუნი.

თუ საჭიროა შუქდიოდის უფრო სწრაფად ან უფრო ნელა ჩაქრობა, მაშიმ 0,05-ის მაგიერ უნდა ავიღოთ შესაბამისად უფრო დიდი ან მცირე მნიშვნელობა.


December 13, 2012

საინტერესო სტატია Fuse – ბიტებთან დაკავშირებით “http://embedderslife.wordpress.com/&#8221;

Embedder's life

В своей практике я не раз встречался с тем, что lock- и fuse-биты микроконтроллеров AVR достаточно часто наводят сакральный страх на начинающих, а порой и не только. Сия статья призвана раз и, по возможности, навсегда, прояснить ситуацию с этой загадочной областью памяти.

View original post 1,011 more words