›_ ebskola.lv
sākt stundu →
Robotika · 7.–9. klase · Arduino · C++ - 5 stundas

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 Arduino Uno C++ .ino fails sensori · LED · Serial
Arduino Uno LED · pogas · Servo C++ · Serial Monitor
# 02 špikeris

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.

Serial.println("Laiks: " + String(millis())); // ms precizitāte