Sphero miäčyn ohjelmoindu Python ohjelmoindukielel

Martti Penttonen
18.3.2017 (päivitetty 20.3.2017)

Sphero robottua voi ohjata sormel telefonan libo tabletan ekruanal, a ohjelman kirjuttamine nämil vehkehil on vaigiedu. Oigei tiedokoneh da ohjelmoindukieli pätäh sih parembi. Ohjelmoindukielekse valličemmo Python -nimizen yleisohjelmoindukielen. Pythonan voi azendua kaikkih tavallizih operuattorusistiemoih, ezim. Windowsah da Linuxah. Täs valličemmo Linux-operuattorusistieman da Pi-Top Laptop -merkkizen tiedokonehen. Opastummo ohjelmoimah kirjuttamal ohjelmii Sphero-miäčyn ohjuandah.

Pi-Top tiedokoneh da operuattorusistiemu

Enne ku rubiemmo ohjelmoimah, pidäy tuttavuo tiedokonehen käyttöh.

Käynnistämine da sammuttamine

Kannen al on virdunybly. Sidä pidäy painua kuni muzavan stoklan läbi rubie valgočöke pilkettämäh. Kodvazen peräs rubieu nägymäh operuattorusistieman käyttöliittymän, ruadostolan edusivu.

Ruadostolan yläreunas on panelu kudamas on ikonazii, huralpäi tärgevimät: menu, livain, tiijostomanageru da terminualu. Ohjelmoindas käytämmö terminualua. Panelan oigies piäs meile tärgei on B-kirjaimen nägöine Bluetoothan ikonaine.

Tiedokoneh sammutetah painaldamal hiiren hural nybläl menu-ikonastu (vagoin kuva) da valliččemal alarivil virdunyblän ikonaine da ielleh Shutdown. Stoklan tagan rubieu valgo pilkettämäh sissah, kuni sinne jiäy vaiku yksi himmei čöke. Painamal kodvaine virdunybliä segi sammuu. Sen jälgeh virdunybly jiäy pilkettämäh harvakseh. Tiedokoneh on sammutettu.


Pi-Top Pixel operuattorusistieman ruadostola

Tiijostot

Kai tiedokoneheh tallendettu tiedo, olgah operuattorusistiemah kuulujua libo käyttäjän kirjutettuu, on tallendettu puumaizeh rakendeheh. Pi-Top tiedokonehes on valmehennu pi nimine käyttäi, kudaman kodi tiijostosistiemas on
  /home/pi
Ohjelmih niškoi pi voi perustua luvettelon ohjelmat komendol
  mkdir ohjelmat
Sinne voi siirdyö kirjuttamal
  cd ohjelmat
da tulla siepäi järilleh komendol
  cd ..

Ohjelman kirjuttamine

Tiedokonehohjelmu on palaine tekstua kudai on kirjutettu ohjelmoindukielen kieliopin mugah. Tiedokonehen voi panna ruadamah tekstan ohjehien mugah, ku ohjelmu ollou oigein kirjutettu. Python ohjelmoindukieles ohjehet pidäy vie hyvin sijoitella rivilöile. Ohjelmurakendehes suurembi ruado jagavuu pienembi ozaruadoloih täh tabah:
  syömine:
    ota luzikku kädeh
    toista kuni tarielku tyhjenöy
      pane luzikku suuppah
      tunge luzikku suuh
    irroita luzikku käispäi
    pyhki suu
Ku ohjelmu on tekstutiijosto, sen voi kirjuttua miltahto tekstuedittoral. On sih tarkoitukseh luajittuloigi edittoroi a meile pädöy yksinkerdaine tekstuedittoru jed. Kirjutammo terminualas
  
  jed ohjelmu.py
Se avuau edittoran ikkunan kudamah voimmo ruveta kirjuttamah ohjelmua. Tärgevimät jed edittoran toimindot ollah:
> < ^ vliiku tekstas
Del <x|pyhki oigiel libo hural
^Kpyhki rivi
^Ykirjuta pyhkityt rivit
^Stallenda tiijosto
^Clähte edittoraspäi
Kirjaimet ^K, ^Y, ^S da ^C kirjutetah painamal Ctrl nybliä da sil aigua painaldamal sidä kirjaindu.

Python-ohjelmu suoritetah kirjuttamal

  python ohjelmu.py

Bluetooth

Sphero-robottua ohjelmoijes on vie ylimiäräine zobottu. Pidäy luadie yhtevys tiedokonehen da miäčyn välile. Sphero käyttäy tiijon siirrändäh Bluetooth tehniekkua. Ku Sphero-miäččy on nostatettu bokkah koputtamal (konzu se rubieu pilkettämäh), tiedokoneh voi luadie sih yhtevyön. Sih niškoi pidäy painaldua ekruanan yläreunan panelan oigies reunas nägyjiä B-kirjaindu da sen al menus add device käskyy. Ku hyvin ollou, sie rubieu nägymäh Sphero-XXX vaihtoehto (XXX:n paikalla WRR (valgei-ruskei-ruskei), BRY (sinine-ruskei-keldaine) tai muu). Pidäy sit vallita Pair. Hyväs lykys rodieu yhtevys. Ku yhtevys ei ruvenne avavumah, ezmäi voi sammuttua miäčyn azettamal se kodvazeks lad'd'avundupezäh da uvvessah käynnistämäl, da sammuttamal Bluetoothan (Turn off Bluetooth) da uvvessah käynnistämäl. Erähičči voi auttua tiedokonehengi sammuttamine da uvvelleh käynnistämine.

Spheron ohjuamine Pythonaspäi

Hyvä taba tuttavuo ohjelmoindukieleh on proubuija da oppie ellendiä ezimerkiohjelmien toimindua. Python on aiga selgei da lougielline kieli. Täs opastummo ezimerkilöin vuoh vaiku pieneh ozajoukkoh Pythonan rakendehii da käskylöi, ga niilöigi voi äijän ruadua.

Sphero-miäčyn ohjuandah käytämmö Kulka-nimisty kirjastuo. Se todevuttau kudakui kai Spheron toimindot, meile täydyy puolikymmendy helposti ellendettäviä käskyy:

  from kulka import Kulka
Käytämmö kulka kirjaston funktsiedu Kulka
  with Kulka(ADDR) as kulka:
Täs ohjelmas kulka tarkoittau Bluetooth adresis ADDR löydyjiä Sphero miäččyy
  kulka.roll(V,S)
Miäččy ajau vauhtil V (0..255) suundah S (0..359). Maksimuvauhti 255 on nenga 2 m/s da suundulugu on astehii.
  time.sleep(T)
miäriäy aijan, min ielolijua toimindua (ezim. roll) jatketah. Tämä on vähä pahoi vallittu käskyn nimi ku eihäi miäččy rubie maguamah, sih niškoi on toine käsky
  kulka.sleep()
Miäčyn värittämizeh on käsky
  kulka.set_rgb(R,G,B),
mis R (ruskei), G (vihandu) da B (sinine) ozutetah nämien värilöin kirkahuttu (0..255). kulka.set_rgb(255,255,255) panou miäčyn valgiekse. Erähis ezimerkilöis on käsky
  kulka.set_inactivity_timeout(T)
mi käsköy Spheron maguamah T sekundan peräs, hos ohjelmoiju on muite unohtannuh sammuttua Spheron kulka.sleep() komendol libo lad'd'uandupezäh azettamal.

Ezimerkiohjelmat

Ezimerkiohjelmis oletammo, ku tiedokoneh da Sphero on paritettu da yhtistetty Bluetoothan kauti. Sežo oletammo ku allus Sphero on sammutettu (pimei) da se on nostatettu bokkah ähkiämäl nenga ku se rubieu vigluttamah omua valgomerkii (valgei-ruskei-ruskei tai muu).

Ezimerki 1. test.py on kolmerivine ohjelmu, kudai ozuttau, toimiugo Bluetooth ozuttehen 68:86:E7:08:E6:24 omuaju Sphero-miäččy.

  from kulka import Kulka
  with Kulka('68:86:E7:08:E6:24') as kulka:
    kulka.roll(20,180)
Ku kai ollou kunnos, miäččy lekahtau vähäzen.

Ezimerkki 2. nellikko.py piirdäy nellikön, kudaman sivu on nenga puoli metrii. (Nengahäi: (64/256)*(2 m/s)*1 s = 0.5 m). Joga sivun jälgeh on käsky kulka.roll(0,.) kudai azettau miäčyn sendäh ku se kergies kiändymäh.

  from kulka import Kulka
  import time
  with Kulka('68:86:E7:08:E6:24') as kulka:
    kulka.roll(64,0); time.sleep(1); kulka.roll(0,0); time.sleep(1)
    kulka.roll(64,90); time.sleep(1); kulka.roll(0,90); time.sleep(1) 
    kulka.roll(64,180); time.sleep(1); kulka.roll(0,180); time.sleep(1) 
    kulka.roll(64,270); time.sleep(1); kulka.roll(0,270); time.sleep(1)
    kulka.sleep()
Tavallizesti ohjelman jogahine käsky kirjutetah omale rivile. Kirjutimmo nelli käskyy samale rivile bumuagan siästämizeksi da sendäh ku nenga yksi rivi piirdäy yhten nellikön sivun. Samal rivil käskyt pidäy eroittua puoličökkehel.

Ezimerkki 3. pyorikko.py piirdäy pyörikön. Pyörikkyö voi pidiä iärettömän monikulmazennu monikulmikonnu. Ohjelmu piirdäy 36-kulmikon, kudamas 10 astien kulmii on vaigei eroittua sendäh ku vauhtis ei voi luadie jyrkiä mutkua. Miäččy ajau matkan 36*(32/256)*2*0.1 = 1.8 m, sendän miäčyn diametru on nenga 1.8/pii=0.6m.

  from kulka import Kulka
  import time
  with Kulka('68:86:E7:08:E6:24') as kulka:
    for i in range(36):  
      kulka.roll(32,10*i)
      time.sleep(0.1)
      kulka.roll(0,0)
      kulka.sleep()

Ezimerkki 4. humalniekku.py on ezimerki piävyndähizis lugulois. Ajelendan loppemine on piävyndähine, vauhti on piävyndähine, suundu on piävyndähine da yhteh suundah ajandan aigu on piävyndähine. Ajandu loppuu sih, konzu enzimäzes arvondas enzimäzen kerran tulos on 100. Sit suoritus irduo while-petlas da lopeh kulka.sleep() käskyh.

  from kulka import Kulka
  from random import randint
  import time
  with Kulka('68:86:E7:08:E6:24') as kulka:
    while randint(1,100)<100:
      kulka.set_rgb(randint(0,255),randint(0,255),randint(0,255))
        kulka.roll(randint(32, 128), randint(0, 359))
        time.sleep(1.0/randint(1,5))
        kulka.roll(0,0)
    kulka.sleep()

Ezimerki 5. varit.py ozuttau jogahistu värii valgei, keldaine, fuksia, syani, ruskei, vihandu, sinine da mustu 5 sekundua da toistau tämän kolme kerdua for-petlal

  from kulka import Kulka
  import time
  with Kulka('68:86:E7:08:E6:24') as kulka:
    varit = [
      ["valgei",255,255,255],
      ["keldaine",255,255,0],
      ["fuksia",255,0,255],
      ["syani",0,255,255],
      ["ruskei",255,0,0],
      ["vihandu",0,255,0],
      ["sinine",0,0,255],
      ["mustu",0,0,0]]
    for i in range(3):
      for vari in varit:
        print(vari[0])
        kulka.set_rgb(vari[1],vari[2],vari[3])
        time.sleep(5)
    kulka.sleep()

Ezimerki 6. viglu.py vigluttau piävyndähisty värii ainos vai tihiembäh. Ozutusaigu joga kierroksel lyhenöy faktoral 1/1.1, sendäh while petla lopeh 73. kierroksel (1/1.1)^73 < 0.001.

  from kulka import Kulka
  from random import randint
  import time
  with Kulka('68:86:E7:08:E6:24') as kulka:
    viglu = 1
    while viglu>0.001:
      kulka.set_rgb(randint(0,255),randint(0, 255),randint(0, 255))
      time.sleep(viglu)
      kulka.set_rgb(0, 0, 0)
      time.sleep(viglu)
      viglu = viglu/1.1
    time.sleep(3)
    kulka.sleep()

Ezimerki 7. arbaitus.py todevuttau arbuandukižan, kudamas koneh valliččou piävyndähizen luvun 1..100 da kižuajan pidäy arbata se. Ohjelman enzimäine rivi tarvitah sendäh ku ä da č on kirjutettu utf-koodal. Ohjelmu on juattu aliohjelmikse vihjua da kiza. Piäohjelmu kuččuu aliohjelmua kiza, kudamas on todevutettu kižan ideju. Se kuččuu aliohjelmua vihjua ozuttamah, kui lähäl oigiedu luguu arbavus on. Ku arbavus ollou liijan suuri, miäččy blinkettäy ruskiedu, liijan pieni blinkettäy sinisty. Midä tihiembi blinketys, sidä lähembi oigiedu arbavus on.

# -*- coding: utf-8 -*-
import time 
from kulka import Kulka
from random import randint

def vihjua(kulka, eroitus):
    if eroitus < 0: R,G,B=255,0,0
    elif eroitus > 0: R,G,B=0,0,255
    num,lg = 500/abs(eroitus),abs(eroitus)/100.0
    for i in range(num):
        kulka.set_rgb(R,G,B); time.sleep(lg) 
        kulka.set_rgb(0,0,0); time.sleep(lg)

def kiza(kulka):
    print("Arbuas minun lugu 1..100! Kuda lähembi sidä tihiembi blinketys!")
    peittolugu = randint(1, 100)
    arbavus,opiteksii = '',0
    while True:
        arbavus = input("Anna lugu: ")
        opiteksii += 1
        if peittolugu<>arbavus: vihjua(kulka, peittolugu-int(arbavus))
        else:
             print("Moločču! Arbait %s kierroksel!" % opiteksii)
             next = input("Tahtonet loppie, anna 0 (0/1): ")
             if next==0: break # lähte iäre while-petlaspäi

with Kulka('68:86:E7:08:E6:24') as kulka: kiza(kulka)