torstai 7. huhtikuuta 2016

Virheistä

Monista saattaa tuntua hiukan simppeliltä ainoastaan vilkutella LEDejä. Aivan totta, mutta tämä ei olekaan tavoite ja päämäärä, vaan keino päästä tutuksi eri ohjelmointiratkaisuihin. Vilkutus on ainoastaan osoitus sille, että jotain tapahtuu.

Virheitä sattuu usein. Ja ne ovat siitä hyviä, että niiden selättämisestä oppii aina uutta. Virheitä on pääasiassa kahta eri tyyppiä: kielioppivirheitä, joihin ohjelman kääntäjä puuttuu. Näistä tulee ilmoitus ohjelmointityökalun alaosaan. Vasemmalle tulostuu ohjelmarivi, mistä virhe on löytynyt. Sama rivi näkyy myös maalattuna ohjelmassa. Todellinen virhe on useinkin edellisessä lauseessa.

Näitä virheitä ovat useimmiten kirjoitusvirheet, puolipisteen ( ; ) puuttuminen ohjelmarivin lopusta tai kaarisulkuparin ( { … } ) ristikkäisyys. Ohjelmalause päätetään puolipisteeseen ja useamman lauseen toimintaryhmä suljetaan kaarisulkujen sisään. Ei tässä näistä sen enempää, näistä tulee arkipäivää.

Toinen virheryhmä on toiminnalliset virheet. Kääntäjä on ihan tyytyväinen ja lataa ohjelman Arduinoon, mutta ohjelma ei toimikaan ajatellulla tavalla. Seuraavassa esimerkki ohjelmasta, millä halutaan vilkuttaa kolmea LEDiä samanaikaisesti kolmella eri nopeudella. Näin ei kuitenkaan tapahdu!

Kolmas virhetyyppi on se, että vahingossa syöttää Arduinolle käyttöjännitteen vääränapaisesti tai ehkä vielä useammin sattuu, että pinneihin kohdistuu vahingossa liian suuri jännite. Tämä tuhoaa mikropiirin. UNO-levyihin voi pelkän IC-piirin vaihtaa erikseen, mutta esim. Leonardo on tässä tapauksessa mennyttä kalua. Lähtöjä ei myöskään saa kuormittaa liikaa.

Hyvä tapa ohjelmaa kirjoitettaessa onkin testata ohjelman edetessä pieninä kokonaisuuksina. Laajan kokonaisuuden, kokonaisuuden, missä saattaa olla useita virheitä, testaaminen on työlästä ja vaikeaa. Toinen hyvä tapa on pitää rinnalla auki toista työkaluikkunaa, mihin kopioi, ja mistä kopioi muuttujia sekä rakenteita. Tällöin välttyy monilta helposti syntyviltä virheiltä. Kun etenee testauksessa tällä tavoin pienin portain, on jatko hyvä aloittaa uudella versiolla, jolloin vanhaan jo toimivaan versioon on helppo palata.

LEDien ohjaukseen voidaan käyttää hyvin UNOn digitaalisia lähtöjä. Näinen maksimi kuormitus on 40 mA (milliampeeria eli 0,04A) Yhteensä koko Arduino UNOa voi kuormittaa 0,4A:illa (400 mA). Ei ole kuitenkaan syytä mennä näille äärirajoille.

Suositus on, että sopiva LEDin etuvastus on 220 ohmia. Arduinon lähtö (DI) on 5V ja LEDin yli jää noin 2V, joten etuvastuksen yli jää 3V. Ohmin lain mukaan vastuksen ja LEDin läpi kulkeva virta LEDin palaessa on 3V / 220ohm = 0.0136A eli noin 14 mA. Tällä mitoituksella ollaan hyvin rajojen sisällä.

eppabasic.fi
eppabasic on kahden abiturientin tekemä selaimessa toimiva ohjelmointiohjelma. Hatun nosto näille kahdelle nuorelle. Ohjelma on ajateltu kouluille alkeisopetukseen. (Toteutuuko, jää tämän vuoden syksyllä nähtäväksi.) Se on todella mainio alusta, kun haluaa päästä alkuun varsinaisten tietokoneiden ohjelmointitapaan. Tulen käyttämään tätä, kun eteen tulee laskentaa.
Pidemmälle mentäessä suositeltava on esimerkiksi ruby-ohjelmointikieli. Yksi eri kielien opetussivusto löytyy osoitteesta https://www.codecademy.com/ Siellä on kursseja monille eri ohjelmointikielille ja paljon harjoituksia. Edetä voi omaan tahtiin askel kerrallaan.

Dim Virta = 3 / 220
Print Virta
Tulos: 0,01363636
Kolmen LEDin epäonnistunut vilkku
Vieressä komponenttien kytkentä: Digitaalipinnit 0 ja 1 on varattu sarjaliikenteelle, joten ne on hyvä jättää siihen tarkoitukseen. Jos tulee pulaa pinneistä, niin pulmaan on olemassa ratkaisuja.





Ohjelma 4

/*****************************************
 * Ohjelma 4:  3 x LED 
 * 07.04.2016
 * Epäonninen 3:n LEDin vilkutus
 *****************************************/

// Määrittelyt
const int Con_LEDpun = 2;
const int Con_LEDkel = 3;
const int Con_LEDvih = 4;
const int Con_Viive = 500; // Perusjakso 500ms

void setup() {
  pinMode(Con_LEDpun, OUTPUT);
  pinMode(Con_LEDkel, OUTPUT);
  pinMode(Con_LEDvih, OUTPUT);
}
void loop() {// Pääohjema
  digitalWrite(Con_LEDpun, HIGH);
  delay(Con_Viive);           // Puolijakso = 500ms
  digitalWrite(Con_LEDpun, LOW);
  delay(Con_Viive);           // Puolijakso = 500ms
  digitalWrite(Con_LEDkel, HIGH);
  delay(Con_Viive * 6 / 10);  // Puolijakso = 300ms
  digitalWrite(Con_LEDkel, LOW);
  delay(Con_Viive * 6 / 10);  // Puolijakso = 300ms
  digitalWrite(Con_LEDvih, HIGH);
  delay(Con_Viive * 24 / 100);// Puolijakso = 120ms
  digitalWrite(Con_LEDvih, LOW);
  delay(Con_Viive * 24 / 100);// Puolijakso = 120ms

  }// Pääohjelma loppu

Jokaisella LEDillä on oma vilkutusaikansa, mutta ne vilkkuvat peräkkäin eikä yhtä aikaa, kuten oli tarkoitus. Pienin muutoksin tämä voisi toimia liikennevaloina, kunhan siinä ei ole suojatietä eikä painiketta jalankulkijoille. Kun prosessori suorittää delay(ms) käskyä, ei se tee mitään muuta. Ei esimerkiksi tutki I/O:ta eikä tiedä, onko painiketta painettu. 


Ensin tässä oli video LEDien vilkutuksesta. Siitä näki, että ne eivät vilkkuneet yhtä aikaa eri tahtiin, vaan peräkkäin. Se ei ollut tarkoitus. Tämä virhe oli tahallinen. Toinen virhe oli se, että videotiedoston koko oli niin suuri (yli 7 Mbyte), että lataus netistä oli toivottoman hidasta. Tiedän, että kokoa voi typistää, joten tässä on taas uuden oppimisen paikka.

Tuossa kytkinkaavassa LEDien etuvastukset ovat merkitty erikseen, mutta tuolla testialustalla olen käyttänyt piiriä, missä on 8 vastusta samassa kotelossa. Noiden vastusten arvo on 330 ohmia, joten LEDit palavat hiukan himmeämmin, mutta se ei ole oleellista.

HUOM! Puhuin äsken kahdenlaisista virheistä. Törmäsin uuteen. En ymmärtänyt virheilmoituksesta yhtään mitään. Myöskään äsken oikein kääntyneet eivät kääntyneet enää. Kopioin virheilmoituksen ja etsin sitä goglesta. Silloin muistin, että olin äsken hyväksynyt ehdotetun päivityksen ja versiot menivät jollain tapaa (ilmeisesti?) ristiin. Kiitos heidän, jotka auttavat goglessa. En osannut korjata mitään, vaan poistin Arduinoasennuksen ja latasin sekä asensin sen uudestaan. Lähti taas pelittämään. 

Ei kommentteja:

Lähetä kommentti