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ä:
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:
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);
}