Fra en virtuell verden til vår: Hvordan kommunisere med en Arduino fra Minecraft

, , ,

Sønnen og jeg ønsket å se om vi kunne styre ting i den fysiske verden fra Minecraft. Arduino er en liten datamaskin som kan kobles til veldig mange forskjellige styre-enheter og sensorer. Om du ønsker å starte med Arduino, kan du kjøpe et startsett med en god instruksjonsbok fra Robonor eller andre steder (Ikke sponset). Det fysiske oppsettet vi brukte er identisk med “Circuit 15” i instruksjonsboka.


Som du ser på videoen, kommer det “støy” på skjermen, og vi må nok forbedre det litt. Men det funker!

Arduino med display

Arduino med display

Så rotet jeg litt rundt på nettet, og fant kode som henter tekst fra serieporten. Her er programkoden. Det er veldig lenge siden jeg kodet i C. Kanskje du kan komme med forbedringsforslag?
[gist id=”8186792″]
Deretter hjalp sønnen min meg med å installere “ComputerCraft” – en såkalt “mod” til Minecraft som gjør at du kan skrive programmer i et språk som heter Lua. Vi fant ut at den enkleste måten å få det inn på på mac’en var ved å installere en “modpack” som heter “Feed the Beast”(!). Lua er et enkelt programmeringsspråk som ligner litt på Python, og det finnes et utall YouTube-videoer som viser hvordan du kan gjøre ting med det i Minecraft.

Sønnen utplasserte en “computer” i terrenget, og så festet vi en spak. Vi ønsket å vise om spaken var opp eller ned på skjermen som var koblet til Arduino’en. 

En computer i Minecraft

En computer i Minecraft

For å skrive inn programkoden høyreklikket vi på datamaskinen i Minecraft, og skrev “edit startup”. Når du kaller scriptet startup, vil det kjøre automatisk. Etter litt prøving og feiling fikk jeg endelig skrevet til en fil som jeg kunne bruke for å sende tekst til Arduino´en.

Kode i Minecraft

Kode i Minecraft

Her er programkoden vi brukte:
[gist id=”8187010″]

Helt til slutt åpnet jeg et “shell”, og kjørte en kommando som sender endringer i en fil til USB-porten som Arduinoen er koblet til. Dette er på en mac. Jeg aner ikke hvordan det gjøres under Windows.
[gist id=”8187124″]

5 replies
  1. Simen Sommerfeldt
    Simen Sommerfeldt says:

    Takk! Koden er ikke helt god hverken på Arduino eller Computercraft-siden. Vi hacka det sammen og publiserte på samme kvelden! Her er en liten forbedring av Minecraft-koden (forskjellen er os.pullevent, som gjør at den ikke står og gnur hele tiden. Da kan vi lukke filen også):

    while true do
    r, s = os.pullEvent(“redstone”)
    if fs.exists(“events.txt”) then
    filehandle=fs.open(“events.txt”,”a”) or error(“Cannot open file “, 2)
    else
    filehandle=fs.open(“events.txt”,”w”) or error(“Cannot open file “, 2)
    end

    h = redstone.getAnalogInput(“front”)
    if h>0 then
    filehandle.writeLine(“Down”);
    else
    filehandle.writeLine(“Up”);
    end
    filehandle.close();
    end

  2. John Markus Bjørndalen
    John Markus Bjørndalen says:

    Artig eksempel 🙂

    Lekte meg litt med computercraft en periode mens jeg kjørte en Tekkitserver sammen med ungene, men vi gikk etter hvert over til bukkit og Scriptcraft på serveren (som jeg ser du også bruker).

    Bare en liten kommentar på C-koden i forbifarta (siden du oppfordret til forslag 😉 ): konstruksjonen på linje 11 og 12 fortjener en kommentar, spesielt siden den gjør noe som kan være nyttig for ungene å forstå. Jeg antar den er der for å vente litt slik at resten av UP/DOWN-meldingen skal få komme inn på serieporten før vi kopierer meldingen til commandbuffer. I så fall kanskje noe sånt som dette?:

    if(Serial.available()){
    // Data har ankommet. Vent litt slik at resten av meldingen kommer inn før vi kopierer den
    // inn i “commandbuffer”.
    delay(100);

    Problemet med å bruke delay() for dette er hvis PC’en som skriver til Arduinoen ikke skriver raskt nok eller hvis man er litt uheldig med timingen (kanskje skriver de _for_ raskt). Da kan man risikere at man bare får deler av et ord eller får deler av neste ord med. En tryggere løsning kan være å lese inntil man treffer newline (writeLine skriver jo newline/linjeskift etter ordet) eller til bufferet er fullt istedet for å bruke delay().

Trackbacks & Pingbacks

  1. […] den første artikkelen viste jeg hvordan en kan få gitt beskjed til en Arduino om at en drar i en spak vha. […]

Legg igjen et svar

Want to join the discussion?
Feel free to contribute!

Legg igjen en kommentar