Arduino-alkeiskurssi verkossa tiistaisin alkaen 26.1.2021 klo 18.00

Osalistun kurssin Teuvo

Jos tulee peruuntumisia tai muusta syystä äkillinen tarve, läbillä yksi selviytymis pakkaus vitriinissä. Haen pois kurssin jälkeen jos ei ole tarvetta.

Moi - ilmoittaudun mukaan (jos vielä mahtuu)?

Joo mahtuu

Huomenna klo 18: https://meet.google.com/awq-otjn-rqm

Läksy: Arduino-softan asennus (www.arduino.cc → Arduino IDE) ja blink-esimerkin kokeileminen jos et tehnyt sitä jo tiistaina.

Ledillä voi myös vilkuttaa jonkin monimutkaisemman kuvion, esim. morsettaa - . .-. …- .

Esimerkkikoodi löytyy valmiina täältä:
image

Arduinon malli ja portti valitaan tästä ja koodi ladataan kortille pyöreästä nuolen kuvasta:

Ensi viikolla tehdään yksinkertaisia kytkentöjä koekytkentälevylle eli leipälaudalle ja kytketään arduinoon ainakin nappuloita ja ledejä. Tähän tarvitset arduinon ja leipälaudan lisäksi pari lediä, pari kytkintä tai vastaavaa, vastuksia (kaikki arvot 100-1000 ohmia käyvät) ja kytkentään sopivia johtoja. Ehdotetun paketin mukana tuli tällaisia kytkimiä, jotka käyvät hyvin:
image

Sitä seuraavalla viikolla käsitellään koodaamisen perusteita. Tavoite on, että neljännellä kerralla päästäisiin pyörittelemään moottoreita.

Vielä kertaus käsitteistöstä:

Arduino = Piirilevy, jonka keskellä on mikrokontrolleri. Myös projektin, softan, yhteisön, firman, ekosysteemin ja konseptin nimi.

Mikrokontrolleri = Varsinaista prosessoria yksinkertaisempi mikropiiri, jolla voi ajaa ohjelmoitavaa koodia. Yleensä mikrokontrollerissa on sisäistä muistia sekä ohjelman ajamista että suorittamista varten (flash ja ram). Tarjontaa ja eri tarkoituksiin soveltuvia malleja on lähes rajattomasti.

ATmega328 = Arduinon perusversioissa käytettävä mikrokontrolleri. Alun perin Atmelin (nykyisin Microchip) valmistama, AVR-sarjan 8-bittinen 5 voltin jännitteellä toimiva, hyvin suosittu ja kohtalaisen edullinen, mutta teknologialtaan vanhahtava piiri.

C++ = Arduinossa käytetty ohjelmointikieli. C-kieleen perustuva ja 1980-luvulla kehitetty, hyvin paljon käytetty, mutta myös paljon inhottu, erityisesti matalan tason ohjelmointiin ja ns. rautaläheiseen ohjelmointiin hyvin soveltuva kieli.

Eilen oli puhetta erilaisista moottorityypeistä ja moottorien tunnistamisesta. Jos moottorin kyljessä ei lue mitään niin on pakko arvata. Ensimmäisenä kannattaa laskea moottoriin menevien piuhojen lukumäärä:

  • Pieni ja 2 johtoa: Tavallinen tasavirtamoottori (DC)
  • Iso ja 2 johtoa: Jonkinlainen vaihtovirtamoottori (AC)
  • Pieni ja 3 johtoa: Moderni “harjaton” moottori (BLDC)
  • Iso ja 3 johtoa: Perinteinen 3-vaihemoottori (3 phase)
  • 4 tai 8 johtoa: Moderni askelmoottori (hybrid stepper)
  • 4 johtoa ja selvästi kaksiosainen runko tai 5 johtoa: Perinteinen askelmoottori (can stepper)
  • 6, 7 tai 9 johtoa: Jotain eksoottista

Mittaaminen on mukavaa ja esim. moottorille suunnitellun käytön aikana menevä virta on lähes pakko mitata. Nykyään monipuolisia ja luotettavia yleismittareita saa tosi halvalla. Tässä esimerkiksi yksi tosi halpa ja yksi hyvä mutta silti halpa:

Laitoin piruuttani muutaman kuvan pikku moottoreista. Tossa ei ole kaikkia Heikin listaamia vaihtoehtoja mutta joitakin yleisimpiä kumminkin.

DC-moottoreita.pdf (1.7 MB)

Kolme esimerkkikoodinpätkää tätä iltaa varten:

int buttonPin = 8;
int ledPin1 = 3;
int ledPin2 = 2;

void setup() {
  pinMode(buttonPin, INPUT);
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
}

void loop() {
  int buttonState = digitalRead(buttonPin);
  if (buttonState == 0) {
    digitalWrite(ledPin1, HIGH);
    digitalWrite(ledPin2, LOW);
  }
  else {
    digitalWrite(ledPin1, LOW);
    digitalWrite(ledPin2, HIGH);
  }
  delay(1); // delay in between reads for stability
}

/////////////////////////////////////////////

int potPin = A0;
int ledPin = 3;

void setup() {
  pinMode(potPin, INPUT);
  pinMode(ledPin, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  int potState = analogRead(potPin);
  float potVoltage = potState / 1024.0 * 5.0;
  Serial.println(potVoltage);
  if (potVoltage > 2.5) {
    digitalWrite(ledPin, HIGH);
  }
  else {
    digitalWrite(ledPin, LOW);
  }
  delay(100);
}

/////////////////////////////////////////////

int potPin = A0;
int ledPin = 3;

void setup() {
  pinMode(potPin, INPUT);
  pinMode(ledPin, OUTPUT);
}

void loop() {
  int potState = analogRead(potPin);
  digitalWrite(ledPin, HIGH);
  delay(potState / 5);
  digitalWrite(ledPin, LOW);
  delay(potState / 5);
}

Käytetään samaa Google Meet -linkkiä kuin viimeksi: https://meet.google.com/awq-otjn-rqm

Käytetään taas samaa Google Meet -linkkiä: https://meet.google.com/awq-otjn-rqm

Ajattelin, että tällä kerralla kävisimme läpi sähköoppia ja C-koodausta vähän syvällisemmin. Tässä taas kolme ohjelmanpätkää, joita voidaan käyttää pohjana:

int potPin = A0;
int ledPins[] = {3, 5, 6};

void setup() {
  pinMode(potPin, INPUT);
  pinMode(ledPins[0], OUTPUT);
  pinMode(ledPins[1], OUTPUT);
  pinMode(ledPins[2], OUTPUT);
  Serial.begin(9600);
}

void loop() {
  int potState = analogRead(potPin);
  float potVoltage = potState / 1024.0 * 5.0;
  Serial.println(potVoltage);

  if (potVoltage < 1.667) {
    analogWrite(ledPins[0], potVoltage / 1.667 * 255);
    digitalWrite(ledPins[1], LOW);
    digitalWrite(ledPins[2], LOW);
  }
  else if (potVoltage < 3.333){
    digitalWrite(ledPins[0], HIGH);
    analogWrite(ledPins[1], (potVoltage - 1.667) / 1.667 * 255);
    digitalWrite(ledPins[2], LOW);
  }
  else {
    digitalWrite(ledPins[0], HIGH);
    digitalWrite(ledPins[1], HIGH);
    analogWrite(ledPins[2], (potVoltage - 3.333) / 1.667 * 255);
  }
  
  delay(100);
}

////////////////////////////////

int potPin = A0;
int ledPins[] = {3, 5, 6};

void setup() {
  pinMode(potPin, INPUT);
  pinMode(ledPins[0], OUTPUT);
  pinMode(ledPins[1], OUTPUT);
  pinMode(ledPins[2], OUTPUT);
  Serial.begin(9600);
}

float readVoltage() {
  int potState = analogRead(potPin);
  float potVoltage = potState / 1024.0 * 5.0;
  return potVoltage;
}

void loop() {
  for (int i = 0; i < 3; i++) {
    float voltage = readVoltage();
    digitalWrite(ledPins[i], HIGH);
    delay(voltage * 50 + 50);
    digitalWrite(ledPins[i], LOW);
  }
}

////////////////////////////////

int buttonPin = A0;
int ledPins[] = {3, 5, 6};

void setup() {
  pinMode(buttonPin, INPUT);
  pinMode(ledPins[0], OUTPUT);
  pinMode(ledPins[1], OUTPUT);
  pinMode(ledPins[2], OUTPUT);
}

void loop() {
  for (int i = 0; i < 3; i++) {
    digitalWrite(ledPins[i], HIGH);
    while (digitalRead(buttonPin) == LOW) {
      delay(50);
    }
    delay(500);
    digitalWrite(ledPins[i], LOW);
  }
}

Ensi kerralla eli 16.2. C:n operaattoreiden kertaus, käytännön esimerkkejä silmukoista ja ehtolauseista ja tasavirta- ja askelmoottoreiden ohjaaminen.

Voi kihveli missasin kurssin aloituksen. Olisiko mahdollista vielä hypätä mukaan?

Joo, tule tiistaina kokeilemaan miltä tuntuu

Käytetään edelleen samaa linkkiä: https://meet.google.com/awq-otjn-rqm

Selviytymispakkaus haettu, eli ei enää saatavilla labilla. Maksoin MPlla. Kiitos!

Meiltä joutaa myös yksi aloituspaketti jos ilmaantuu tarvitsija. Pärjätään yhdelläkin.

// ilman kirjastoa

int stepperPin1 = 2;
int stepperPin2 = 3;
int stepperPin3 = 4;
int stepperPin4 = 5;

int delay_ms = 3;

void setup() {
  pinMode(stepperPin1, OUTPUT);
  pinMode(stepperPin2, OUTPUT);
  pinMode(stepperPin3, OUTPUT);
  pinMode(stepperPin4, OUTPUT);
}

void step(int pin) {
  digitalWrite(pin, HIGH);
  delay(delay_ms);
  digitalWrite(pin, LOW);
}

void loop() {
  step(stepperPin1);
  step(stepperPin2);
  step(stepperPin3);
  step(stepperPin4);
}

// kirjaston kanssa

#include <Stepper.h>

const int stepsPerRev = 2038;

Stepper myStepper = Stepper(stepsPerRev, 5, 3, 4, 2);

void setup() {
  myStepper.setSpeed(15);
}

void loop() {
  myStepper.step(stepsPerRev);
  delay(500);
  myStepper.step(-stepsPerRev);
  delay(500);
}