2. Tēma - // Ievads Arduino un elektronikā
Pāreja no LEGO uz Arduino C++ - maizes dēlis, vadi, LED, pogas un sensori. Piecu stundu laikā iemācies rakstīt teksta kodu, kas kontrolē fizisko pasauli reāllaikā.
5 stundas - no LED mirgošanas līdz reakcijas spēlei
Pēc katras stundas darbojas jauns shēmas elements. Apgūstam secīgi: vispirms izvade, tad ievade, tad analogā elektronika.
Ievads Arduino un Tinkercad
Pirmā shēma - LED mirgošana. Iepazīstam setup(), loop() un pinMode().
Pogas un If-Else loģika
Lasām pogas stāvokli ar digitalRead() un vadām LED ar if/else.
Analogie signāli un Potenciometrs
Potenciometrs atgriež 0–1023, analogRead() un analogWrite() regulē LED spilgtumu.
Servo motors
Pieslēdzam Servo bibliotēku un vadām rotāciju ar servo.write(leņķis) - 0° līdz 180°.
Noslēguma projekts: Reakcijas spēle
LED iedegas nejauši, spēlētājs spiež pogu - millis() mēra reakcijas laiku ms precizitātē.
← 1. Tēma: LEGO SPIKE
Robotu montāža, motori, distances un krāsu sensori, manipulators un pārbaudes misija.
2. tēmas špikeris - Arduino un elektronika
Shēmas, LED, pogas, analogie signāli un servo. Katrs bloks atbilst vienai stundai.
2.1 Pirmā shēma un Blink
// Kods un shēma ir VIENA UN TĀ PATI vieta:
// kodā: 13 <----> shēmā: Arduino pins ar numuru 13
// |
// +-- rezistors 220 omi
// |
// +-- LED gara kaja (Anods, +)
// LED isa kaja (Katods, -) --> GND
void setup() { // izpildās VIENU reizi
pinMode(13, OUTPUT); // 13. pins dos strāvu ĀRĀ
}
void loop() { // atkārtojas BEZGALĪGI
digitalWrite(13, HIGH); // ieslēdz
delay(1000); // gaida 1000 ms = 1 s
digitalWrite(13, LOW); // izslēdz
delay(1000);
}
// LED bez rezistora sadeg. Rezistors 220 omi, NEVIS kiloomi.
// Katras komandas beigās semikols. digitalWrite - lielais W!
Ja diode nedeg: salīdzini skaitli kodā ar pinu, kurā tiešām iesprausts vads - tur ir 90% kļūdu.
2.2 Pogas un if-else
int buttonPin = 2;
int ledPin = 13;
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT_PULLUP); // BEZ PULLUP poga "lēkā" pati no sevis
Serial.begin(9600);
}
void loop() {
int stavoklis = digitalRead(buttonPin);
Serial.println(stavoklis); // Serial Monitor: 1 vaļā, 0 nospiesta
if (stavoklis == LOW) { // == , nevis = !
digitalWrite(ledPin, HIGH);
} else {
digitalWrite(ledPin, LOW);
}
}
// Ar INPUT_PULLUP: poga ATLAISTA = HIGH (1)
// poga NOSPIESTA = LOW (0) <- otrādi, nekā šķiet!
// Pogu liec PĀRI maketo plates vidus gropītei, citādi būs īssavienojums.
Ar vienu = kods nesalīdzina, bet PIEŠĶIR vērtību - nosacījums vienmēr būs patiess.
2.3 Analogie signāli un map()
int potPin = A0;
int ledPin = 9; // OBLIGĀTI ports ar tildi ~ (3,5,6,9,10,11)
void setup() {
Serial.begin(9600);
pinMode(ledPin, OUTPUT);
}
void loop() {
int sensors = analogRead(potPin); // 0 .. 1023
int spilgtums = sensors / 4; // 0 .. 255 (1023/4 = 255)
Serial.println(spilgtums);
analogWrite(ledPin, spilgtums); // analogWrite, NE digitalWrite
delay(15);
}
// analogRead() dod 0..1023 (ievade)
// analogWrite() pieņem 0..255 (izvade) - TIKAI ~ portos
// Potenciometrs: malējās kājas -> 5V un GND, VIDĒJĀ -> A0
// Ja vidējā kāja pieslēgta nepareizi, tas simulācijā "uzsprāgst".
Portā 13 spilgtums nemainīsies - tam nav tildes, tāpēc tas prot tikai ieslēgt un izslēgt.
2.4 Servo motors un bibliotēka
#include <Servo.h> // bibliotēka - koda augšā
Servo mansMotors; // objekts
int potPin = A0;
void setup() {
mansMotors.attach(9); // signāla vads 9. portā
}
void loop() {
int klokis = analogRead(potPin); // 0..1023
int lenkis = map(klokis, 0, 1023, 0, 180); // -> 0..180 grādi
mansMotors.write(lenkis);
delay(15); // bez šī motors "dreb"
}
// map(vertiba, no_min, no_max, uz_min, uz_max)
// map(512, 0, 1023, 0, 180) -> 90 grādi (tieši pa vidu)
// Bez map() motors jau pie ceturtdaļas kloķa aizgriežas līdz galam.
// Servo vadi: sarkans -> 5V , brūns/melns -> GND , dzeltens -> signāls
// Mainīgo vārdos NEDRĪKST garumzīmes: klokis , NEVIS kloķis
C++ mainīgo nosaukumos nedrīkst lietot ā, ē, ķ, ņ - kompilators to nepieņem.
2.5 Reakcijas spēle: millis() un false start
const int LED = 9; // const int liec VIRS setup(),
const int POGA_START = 2; // nevis iekšā - citādi loop() tos neredz
const int POGA_REAGE = 3;
// Grūtākā daļa: nejaušo pauzi NEDRĪKST taisīt ar delay(),
// jo tajā laikā Arduino ir "kurls" un false start paliek nepamanīts.
unsigned long pauze = random(1000, 4001);
unsigned long sakums = millis();
bool falseStart = false;
while (millis() - sakums < pauze) { // gaida UN vēro pogu
if (digitalRead(POGA_REAGE) == LOW) {
Serial.println("FALSE START!");
falseStart = true;
break;
}
}
if (!falseStart) {
digitalWrite(LED, HIGH);
unsigned long t = millis(); // pulkstenis sākas TIEŠI te
while (digitalRead(POGA_REAGE) == HIGH) { }
Serial.print("Reakcija: ");
Serial.print(millis() - t);
Serial.println(" ms");
}
millis() atgriež milisekundes kopš palaišanas. Laika starpību glabā unsigned long, nevis int.