Oblig 1 - Introduksjon til Raspberry Pi

I denne obligen skal du sette opp din Raspberry Pi (referert til som RPi fra n? av), og koble den til internett. Deretter skal du kj?re noen enkle linux kommandoer og C-programmer p? den, samt skrive et enkelt C-program.

F?r du kan begynne med obligen m? du kj?pe inn en RPi (Se innkj?psliste). Kurset tar utgangspunkt i en Raspberry Pi 4 model B, s? vi anbefaler sterkt at dere benytter denne modellen. Det vil ogs? v?re mulig ? bruke en Raspberry Pi 3 model B+ dersom du har et sterkt ?nske om det. Dersom du velger RPi3B+ m? du ha med egen HDMI kabel p? laben, ettersom laben er satt opp for tilkobling av RPi4B. I oblig 4 vil det v?re en konkurranse

Du trenger ogs? f?lgende utstyr:

Dersom du har kj?pt et Raspberry Pi 4 B Kit vil Raspberry Pi OS allerede v?re installert p? ditt SD-kort, og du kan hoppe videre til Sette opp RPi. Dersom du har kj?pt SD-kortet p? en annen m?te m? du f?rst installere Raspberry Pi OS. Dersom du har et Raspberry Pi 3 B+ kit anbefaler vi ogs? ? starte p? Installere Raspberry Pi OS fordi det kan hende at din installasjon av Raspberry Pi OS har en versjon av python som ikke st?tter gdbgui, et program vi vil bruke i oblig 3. Det er ogs? mulig ? oppgradere versjonen av python, men vi har ikke en guide tilgjengelig for dette.

Installere Raspberry Pi OS

Du trenger en annen PC med SD-kort leser for ? kunne installere Raspberry Pi OS p? ditt SD-kort.

1. Sett inn ditt SD-kort i PCen.

2. Installer Raspberry Pi Imager fra Raspberry Pis offisielle nettside.

3. Velg den anbefalte versjonen av Raspberry Pi OS(?verst) under operating system, og SD-kortet ditt under storage.

4. Trykk p? write og et Raspberry Pi OS image vil skrives til SD-kortet ditt. (Merk at dette vil slette alt innhold som var p? sd-kortet fra f?r)

Sette opp RPi

1. Sett inn ditt SD-kort i RPien.

2. Koble s? til mus og tastatur via USB portene, og skjerm via HDMI kabel.

3. Forsikre deg om at skjermen er p?, og stilt inn p? riktig kilde. (HDMIen koblet til din RPi)

3. Til slutt kobler du til str?mforsyningen. RPien vil da starte.

Koble til eduroam

Vi skal n? koble RPien til internett.

1. I hovedmenyen naviger til Preferences -> Raspberry pi configuration.

2. Trykk p? Localisation fanen.

3. Under Set wifi country code velg Norge.

4. Under Timezone velg Europa -> Oslo.

5. Du kan ogs? endre keyboard layout under Keyboard.

6. Koble til uioguest nettverket. (Obs! Du m? ?pne en browser og logge inn.) Dersom klokka p? RPien g?r feil m? du restarte RPien.

7. ?pne en terminal.

8. Kj?r f?lgende kommandoer i terminalen:

sudo apt update
sudo apt upgrade
sudo apt install network-manager network-manager-gnome

9. ?pne filen: /etc/dhcpcd.conf og legg til denne linja i slutten av filen:

denyinterfaces wlan0

10. Kj?r f?lgende i terminalen:

sudo systemctl restart dhcpcd

11. ?pne filen /etc/NetworkManager/NetworkManager.conf med administratorrettigheter. (f.eks. med sudo nano /etc/NetworkManager/NetworkManager.conf i terminalen)

12. Endre filen s? den ser slik ut:

[main]
plugins=ifupdown,keyfile
dhcp=internal
 
[ifupdown]
managed=true

13. Kj?r f?lgende i terminalen:

sudo reboot

14. Raspberry Pien vil restarte. N?r den har restartet skal det v?re et ekstra Wifi symbol i ?verste h?yre hj?rne, i tillegg til det som var der originalt. Klikk p? dette og koble deg til uioguest nettverket.

15. Last ned python scriptet du finner her. Pass p? at operativsystem er satt til linux.

16. Naviger i terminalen til mappen der scriptet ligger, og kj?r scriptet med:

python "scriptets_navn".py

17. Du skal n? v?re koblet til eduroam!

Oppgaver

Etter ? ha satt opp din RPi skal vi n? bli bedre kjent med operativsystemet (Raspberry Pi OS - Linux) og komme i gang med en enkel programmeringsoppgave.

Oppgaven skal leveres som en ZIP-et mappe med besvarelse p? tekstoppgavene som en PDF-fil og eventuelle andre filer du blir bedt om ? produsere lagt ved.

Linux og bash

Som en liten oppvarming skal vi f?rst starte med ? bli litt kjent med Linux og terminalen p? v?r RPi.

?pne et terminalvindu og lag en ny mappe som heter in2060. Mapper lages med programmet mkdir.

mkdir in2060

Deretter skal vi bevege oss inn i mappen, f?r vi gj?r det kan det v?re lurt ? sjekke hvilken mappe vi st?r i akkurat n?, dette gj?res med pwd. For ? se de andre mappene i n?v?rende mappe kan vi bruke kommandoen ls som burde vise mappen in2060 vi laget ovenfor. Et annet kjekt verkt?y er kommandoen tree som viser mapper og undermapper som en trestruktur. For ? bevege oss inn i mappen vi har laget bruker vi cd kommandoen etterfulgt av navnet p? mappen vi ?nsker ? bevege oss inn i.

cd in2060

Inne i denne mappen skal vi gj?re den f?rste oppgaven. Vi ?nsker ? finne ut hvor mange pakker Raspberry Pi OS har som inneholder ordet assembly. Vi kan bruke verk?yene apt eller apt-cache for ? s?ke etter programmer. Vi skriver apt search s?keord.

Tips: For ? ta skjermbilde p? RPi trykk p? tasten PrtScn eller kj?r kommandoen scrot.

Innlevering:

Kompilere C kode

Det neste vi skal gj?re er ? kompilere og kj?re et C program. Under har vi limt inn et program som skriver ut setningen Hello World!. For at v?r RPi skal kunne kj?re denne koden m? vi kompilere den med gcc.

La oss f?rst se p? koden:


#include <stdio.h>

int main(int argc, char** argv) {
    printf("Hello World!\n");
    return 0;
}

Den f?rste linjen inneholder #include <stdio.h> dette forteller kompilatoren at vi ?nsker ? inkludere system filen stdio, som inneholder blandt annet funksjonen printf.

Den neste linjen med kode inneholder int main(int argc, char** argv), dette forteller kompilatoren at vi ?nsker ? definere en metode, som skal returnere et heltall (int), metoden skal hete main og den tar to argumenter (disse argumentene kan brukes for ? hente inn input fra brukeren n?r programmet kj?res, men vi skal ikke bruke disse i denne obligen). N?r vi definerer en metode med navnet main vil kompilatoren merke seg at dette er metoden som skal brukes som startpunkt n?r programmet v?rt kj?rer.

Etter dette f?lger printf("Hello World!\n");. Dette er et metodekall til printf som vil skrive til terminalvinduet v?rt. Her ser vi hvorfor vi trengte ? inkludere systemfilen tidligere, siden vi ?nsket ? bruke printf definert i stdio.h. Legg merke til at med printf s? inkluderes det ikke en ny linje og vi m? manuelt skrive ut dette med \n p? slutten.

Helt til slutt avsluttes metoden main ved return 0;. return forteller at vi ?nsker ? returnere fra metoden, men siden dette er en spesiell metode (main) s? har returverdien en spesiell betydning. ? returnere 0 forteller terminalvinduet v?rt at programmet avsluttet p? riktig m?te, mens return 1; ville indikert at det oppstod en feil under kj?ring.

Kompilere og kj?re koden

Vi skal n? kompilere koden, for ? gj?re dette trenger vi tilgang til programmet gcc som allerede burde v?re installert (hvis ikke kan det installeres med sudo apt install gcc).

Lim koden over inn i en fil i mappen in2060 ved navn helloworld.c og kj?r f?lgende.

gcc -o hello helloworld.c
./hello

Innlevering:

FizzBuzz

Siste utfordring i denne obligen blir ? endre litt p? et C program. Vi skal l?se det "kjente" problemet FizzBuzz.

FizzBuzz g?r ut p? ? skrive ut tallene mellom 1 og 100, men n?r tallet er delelig p? 3 skrive ut "Fizz", n?r det er delelig p? 5 "Buzz" og n?r det er delelig p? begge skrive ut "Fizz Buzz". Vi har gjengitt de f?rste fem utskriftene under.

1, 2, Fizz, 4, Buzz, ...

Bruk f?lgende C program og gj?r n?dvendig endringer slik at det oppfyller kravene til FizzBuzz ovenfor.


#include <stdio.h>

int main(int argc, char** argv) {
    for(int i = 1; i <= 30; i++) {
        if(i % 3 == 0) {
            printf("Fizz");
        } else {
            printf("%d", i);
        }
        printf(", ");
    }
    return 0;
}

Lim koden inn i en fil ved navn fizzbuzz.c og gj?r endringer slik at programmet utf?rer FizzBuzz korrekt for tallene mellom 1 og 100. N?r du er ferdig(og underveis) sjekk at programmet kompileres med gcc -o fizz fizzbuzz.c, og kj?r det med ./fizz.

Innlevering:

Tips rundt kompilering

N?r man kompilerer C kode kan det v?re lurt ? sp?rre kompilatoren om det vi gj?r virker fornuftig. I gcc kan dette gj?res ved ? legge til flaggene -Wall og -Wextra. Disse flaggene gj?r at gcc pr?ver s? godt den kan ? advare oss n?r vi gj?r dumme ting.

Som et eksempel p? dette s? er f?lgende resultatet n?r l?sningsforslaget til FizzBuzz blir kompilert.

$ gcc -o fizz fizzbuzz.c -Wall -Wextra
fizzbuzz.c: In function ‘main’:
fizzbuzz.c:3:14: warning: unused parameter ‘argc’ [-Wunused-parameter]
    3 | int main(int argc, char** argv) {
      |          ~~~~^~~~
fizzbuzz.c:3:27: warning: unused parameter ‘argv’ [-Wunused-parameter]
    3 | int main(int argc, char** argv) {
      |                    ~~~~~~~^~~~

Her kan vi se at gcc har oppdaget at vi ikke bruker argumentene til funksjonen og kanskje burde vurdere ? ta de bort eller benytte oss av dem.

Dessverre inneholder gcc alt for mange ekstra flag til at vi kan liste de opp her. Vi anbefaler at man alltid bruker minst flaggene -Wall og -Wextra n?r man utvikler C kode slik at kompilatoren best mulig kan hjelpe til.