Oppsett av Raspberry Pi
I denne obligen skal vi f?rst sette opp v?r Raspberry Pi 3 model B+
(referert til som RPi
fra n? av) og koble til internett f?r vi skal teste at alt fungerer som det skal.
Oppsettguide til Raspberry Pi 3
Dette dokumentet vil guide deg gjennom oppsett av Raspberry Pi 3 model B+
for faget IN2060
.
Pass p? at du har alt n?dvendig utstyr f?r du fortsetter p? stegene nedenfor.
Oppsett av minnekort
Last ned IN2060 sitt tilpassede Raspbian Image
Last ned filen in2060_raspbian.img.tar.gz
fra nedlastinger p? emnesiden.
Det er ikke n?dvendig ? pakke ut denne filen.
Om du har valgt ? bruke Raspberry Pi 4 model B
, kan du ikke bruke imaget som er lastet opp p? emnesiden, men m? velge et standard image fra Raspberry Pi Imager, og i tillegg finne ut hvordan sette opp Eduroam p? egenh?nd om du ?nsker ? benytte deg av nettverket p? UiO.
Last ned Raspberry Pi Imager
Last ned programmet fra Raspberry Pi's offisielle nettside
Brenn imaget til SD-kortet
Sett inn SD-kortet du ?nsker ? installere Raspbian p? i laptopen din, og noter deg hvilken bane SD-kortet blir satt p?.
Start opp Raspberry Pi Imager. P? Operating System, scroll ned p? bunnen av listen og velg "Use custom".
Velg filen in2060_raspbian.img.tar.gz
du lastet ned fra nedlastinger Deretter velger du SD-kortet du ?nsker ? installere operativsystemet p?. Trykk s? p? "WRITE" for ? brenne imaget. N?r dette er fullf?rt kan du flytte SD-kortet over til RPi
.
F?r oppstart
F?r du kobler til str?m til RPi
se til at SD-kortet og alle andre kabler er koblet til. Om du ikke har mus og tastatur kan du lese om hvordan man kan koble seg til RPi
med SSH under Koble til RPi
med SSH over Ethernet.
Oppstart
Koble til str?m til RPi
og vent til maskinen har startet helt opp. Deretter er det bare ? logge seg inn med passordet "in2060". Vi anbefaler ? bytte dette passordet umiddelbart. Dette kan gj?res ved ? ?pne terminalen (fjerde ikon fra oppgavelinjen ?verst.) Kj?r s? kommandoen passwd
, og oppdater fra passordet "in2060" til ditt egenvalgte passord.
Oppkobling til eduroam
For ? koble deg til eduroam
har vi inkludert et skript som ligger p? hjemomr?det p? RPi
. ?pne terminalen som vist under Oppstart og kj?r ls
, og se etter skriptet in2060_eduroam_setup
. Kj?r skriptet med
$ sudo ./in2060_eduroam_setup
Skriptet vil be deg om ? skrive inn ditt UiO-brukernavn og passord som brukes til ? sette opp tilkoblingen til eduroam
. Deretter kan du bruke kommandoen reboot
for ? restarte RPi
. Etter omstart vil RPi
kobles til eduroam
automatisk gitt at du er i n?rheten av et aksesspunkt. Gj?r s? en omstart til for at dato og tid stiller seg riktig, det er n?dvendig for sikker kobling til nettsider og for ? oppdatere programvare p? RPi
.
Koble til RPi
med SSH over Ethernet fra egen laptop
Dette steget er kun n?dvendig om du ikke har mus og tastatur for ? koble til RPi
.
For ? gj?re dette trenger du din egen laptop med ethernet-port eller en adapter, og du trenger ogs? en ethernet-kabel. Gruppel?rer har noen kabler til utl?n.
Fysisk oppsett
Koble ethernet-kabelen til b?de din egen laptop og RPi
. Koble deretter str?mtilf?rselen til RPi
.
Koble til RPi
fra din terminal
?pne terminalen p? laptopen din og skriv kommandoen
$ ssh pi@raspberrypi
Skriv inn passordet (in2060
) n?r du f?r beskjed om dette.
Bruk av GUI med X11-Forwaring
For ? bruke GUI-baserte programmer kan du bruke denne kommandoen for ? bruke X11-forwarding:
$ ssh -Y pi@raspberrypi
Du kan teste at det fungerer med ? ?pne redigeringsprogrammet Gedit etter du har logget deg inn.
$ gedit
Oppgave
Etter ? ha satt opp din RPi
skal vi n? bli bedre kjent med operativsystemet (Raspbian - 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 -p 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 mappen vi ?nsker ? bevege oss inn i.
$ cd in2060
Inne i denne mappen skal vi gj?re den f?rste oppgaven. Vi ?nsker ? finne hvor mange pakker some Raspbian
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:
- Skjermbilde fra din
RPi
hvor du har s?kt etterassembly
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 veldig enkelt skriver ut setningen Hello World!
. For at v?r RPi
skal kunne kj?re denne koden trenger 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 en system fil (vi vet dette siden vi brukte <
+ >
isteden for #include "min_fil.h"
).
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 (akkurat n? er det ikke viktig hva disse gj?r eller betyr). N?r vi definere en metode med navnet main
vil kompilatoren merke seg at dette er en spesiell metode (p? grunn av navnet) og bruke denne metoden 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?r 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:
- Skjermbilde fra din
RPi
med utskriften fra programmet over.
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 inn i en fil ved navn fizzbuzz.c
og gj?r endringer med editoren geany
slik at programmet utf?rer FizzBuzz korrekt for tallene mellom 1 og 100. Underveis og n?r du er ferdig sjekk at programmet kompileres med gcc -o fizz fizzbuzz.c
.
Innlevering:
- Legg ved den korrigerte kildekoden til
fizzbuzz.c
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, men denne StackOverflow posten inneholder en god oppsummering. 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.