Moduler og Biblioteker

Fra HTX-Arduino
Skift til: navigering, søgning
Video med forklaring til kapitlet


Der hvor Arduinoen bliver rigtig interessant, er når man kan begynde at koble mere komplekse moduler på Arduinoen og få den til at løse opgaver der har en vis funktionalitet, så man kan lave produkter med Arduinoen der kan løse en problemstilling for eksempel i teknologi eller i teknikfaget.

Et modul er en printplade med en eller flere komponenter på, som man kan koble til sit Arduinoboard, og derved få flere anvendelsesmuligheder. Det kan være forskellige typer af sensorer, eller moduler der kan vise information (displays af forskellige slags). Man kan også få moduler hvormed man kan tænde og slukke for 230V apparater. Mulighederne er mange.

Til flere af modulerne kræves et ekstra kodebibliotek, som indeholder “driveren” til moduleret ofte sammen med ét eller flere programkodeeksempler på anvendelse af modulet. I dette dokument beskrives hvordan man arbejder med disse kodebiblioteker.

De første moduler

Hvis man er startet i et eller andet starter-kit[1], så vil man sandsynligvis altid have et display med, sikkert af typen 2x16 alphanummerisk LCD som vist i figur 1.

Et 2 x 16 karakters LCD display
Figur 1 Et 2 x 16 karakters LCD display.

Tilslutning af modulet

Når man skal arbejde med for eksempel et display, så skal man have tilsluttet displayet til Arduinoen, og det kan gøres som vist på figur 2.

Et display koblet sammen med en Arduino
Figur 2 Et display koblet sammen med en Arduino.

Beskrivelse af displayet og hvordan det skal kobles op[2] kan man finde rigtigt mange steder på nettet, og langt de fleste steder man finder viser et helt korrekt billede af hvordan det skal kobles op - der kan være små forskelle som størrelsen af potentiometeret og om der kobles en seriemodstand til baggrundsbelysningen (hvis den anvendes).

Softwaren til modulet

Umiddelbart kan det være svært at kommunikere med displayet, hvis man selv vil starte helt fra bunden med at præsentere data for displayet[3], så starter man i databladet, hvor man finder ud af at man skal skille det man vil sende til displayet ad i 4 bits bidder og finde ud af hvilke kontrol-kommandoer man skal bruge for at skrive de rigtige steder - det er faktisk ret kompliceret, og heldigvis heller ikke nødvendigt.

For displayets vedkommende, så er der installeret et bibliotek med IDE’et. Biblioteket er skrevet objektorienteret, så man skal include biblioteket, oprette et objekt med angivelse af hvilke ben displayet er sat til og initialisere en instans af objektet til displayet med angivelse af hvor mange karakterer displayet håndterer.

Den nemmeste måde at komme i gang med displayet er ligesom ved de fleste andre ting, at tage et af de færdige eksempler der følger med biblioteket. De kan findes under Fil - Eksempler - Liquid Crystal, som vist i figur 3.

Indgangen til de forskellige LCD eksempler
Figur 3 Indgangen til de forskellige LCD eksempler.

Som man kan se i figur 3 er der en del forskellige eksempler, som hver især viser forskellige metoder man kan anvende til displayet - det kan her være nødvendigt at gennemgå flere eksempler for at finde de ting man har brug for. En anden måde at finde ud af hvad metoderne kan og hvordan de virker er ved at læse dokumentationen til biblioteket[4], hvor alle metoder er listet og dokumenteret. Under alle omstændigheder er det en fordel at afprøve de enkelte metoder, og se om man får det resultat man forventer.

Andre grundlæggende moduler

Blandt andre grundlæggende moduler der er med i IDE’et er servo-biblioteket, der kan styre en servomotor og stepper-biblioteket der kan håndtere en stepmotor. Der er en del flere grundlæggende moduler, som er designet efter de officielle moduler og shields der er designet til arduinoen.

Disse moduler kan håndteres ligesom displayet, med tilslutning og anvendelse af biblioteker og eksempler.

Ikke standard moduler

Går man ud over disse grundlæggende moduler, så kan man finde rigtigt mange interessante moduler man kan slutte til Arduinoen.

Tilslutning af moduler

Det kræver lidt mere research at tilslutte moduler der ikke ligger i IDE’et som standard - der er for eksempel ikke nogen dokumentation af det på Arduinos officielle hjemmeside, men det er relativt let at finde meget hjælp på nettet, man skal bare være lidt mere kildekritisk over for det man møder.

Hvis man ønsker at anvende et modul der kan måle luftfugtighed og temperatur, så er DHT11[5] et rigtigt godt bud, hvor man relativt let kan finde hjælp [6] til modulet, her er bl.a. angivet hvordan man kan tilslutte modulet som vist i figur 4.

DHT11 luftfugtigheds og temperatur sensor
Figur 4 DHT11 luftfugtigheds og temperatur sensor.

Softwaren til moduler

Til et modul som DHT11 er der også hjælp at finde til softwaren på samme side som hardwaren [7], men der mangler faktisk en lille detalje, nemlig at man skal have fundet det rigtige bibliotek - det er ikke beskrevet på siden.

En måde at finde et bibliotek på er ved at gå ind under Sketch - Include Library - Manage Libraries som vist i figur 5.

Adgangen til at søge efter biblioteker
Figur 5 Adgangen til at søge efter biblioteker.

Når man kommer ind kan man søge efter for eksempel DHT11 som det er vist i figur 6 hvor der er søgt på dht11, og klikket More info på det første bibliotek.

Eksempel på søgning efter DHT11 bibliotek, der kan installeres
Figur 6 Eksempel på søgning efter DHT11 bibliotek, der kan installeres.

Ved at klikke Install, så henter IDE’et det angivne bibliotek, og lægger det ind sammen med eksempler, så man kan finde det nede i bunden af eksempler sammen med andre biblioteker man har installeret på samme måde som vist i figur 7.

Under Fil - Eksempler - nederst kan ses de eksempler man har installeret
Figur 7 Under Fil - Eksempler - nederst kan ses de eksempler man har installeret.

Her ligger to eksempler der passer til det bibliotek man har fundet. Det vil normalt være bedst at starte her, da man ikke kan vide om det kode man ellers finder på nettet virker sammen med det bibliotek man har fundet.

Normalt vil eksemplerne vise de muligheder der ligger i biblioteket, men man kan også finde mere information ved at finde biblioteket og kigge i de forskellige filer der er installeret - i Windows ligger de installerede biblioteker som standard under Dokumenter \ Arduino \ Libraries i hver sin mappe. Man vil faktisk kunne tilføje nye metoder til bibliotekerne, men her skal man være opmærksom på, at man ikke skriver i Arduinos standard C-version, men man skriver i C++.

Moduler der ikke kan søges frem i libraries

Man kan rende ind i moduler der ikke er understøttet direkte af de søgninger man laver i Arduinos autoriserede adgange. Her skal man ud i et lidt mere “gråt” marked for at finde biblioteker der kan understøtte det man ønsker at tilslutte.

Et godt sted at søge efter biblioteker er på github.com[8], hvor mange forskellige bidrager. Det er ikke alle bidrag der er lige godt lavet, så der er ikke nogen garanti for at bibliotekerne fungerer efter hensigten, så man skal nok se sig lidt mere for, og evt. prøve at kigge på anmeldelser af den der har lavet modulet, men det er stadig et af de bedste steder at finde moduler til Arduino (og meget andet).

Hvis man slet ikke kan finde et bibliotek til det modul man vil anvende, så er der kun den tunge vej at gå, nemlig at skrive softwaren selv. Man kan endda selv skrive sit eget bibliotek, ved at følge en tutorial[9] til at skrive sit eget bibliotek, men det kræver selvfølgelig at man kan skrive den software der skal kommunikere med modulet.

På samme måde kan det også være svært at finde oplysninger på hardwaren, specielt med moduler købt i Kina. Det vil til tider kræve lidt gætte arbejde at finde ud af hvilke pins der er ført ud på modulet. Man vil typisk være nødt til at analysere den tilslutning man laver ud fra databladet på den centrale chip der sidder på modulet. Når man har fundet ud af hvilke ben man kan tilgå, så skal man måske også have andre ben registreret, så man ved hvilke konstante niveauer der er på chippen.

Problemer med biblioteker til moduler

Der er mange forskellige udviklere der bidrager med biblioteker, specielt inde på github.com, og der er ikke en løbende kvalitetskontrol af de ting der bliver lagt op der. Det betyder at man sagtens kan støde på ting der ikke er særligt smart lavet, ikke er opdateret til nye versioner af IDE'et og ting der ikke er ordentligt gennemtestet.

En ting man ind imellem kan støde på er, at ting man har fundet ikke engang kan oversætte - det kan fx. være fordi de forudsætter et andet bibliotek man ikke har installeret eller fordi biblioteket anvender en teknik der ikke understøttes af compileren i IDE'et.

Nogle gange kan man finde ud af det, ved fx. at spore hvilket bibliotek der mangler, og så installere det, men andre gange kan det være ret svært at finde ud af hvor fejlen ligger, da mange biblioteker er skrevet ret kompliceret, bl.a. fordi de skal dække mange versioner af Arduino (ikke bare UNO). Mange biblioteker er heller ikke særligt godt dokumenteret i koden, der er måske en overordnet beskrivelse, men koden er slet ikke kommenteret. I sådanne tilfælde vil det tit være det bedste at prøve at finde et andet bibliotek, og hvis man ikke kan det, så må man selv gå i gang med at skrive koden til at arbejde med modulet.

Hvilke moduler?

Der er rigtigt mange forskellige sjove moduler der kan rigtigt meget. Der er omtalt forskellige overvejelser omkring hvad man skal anskaffe under Hardware.

Det kan også være en god ide at opbygge et lager af afprøvede komponenter som fx vist i listen på http://htx-elev.ucholstebro.dk/?p=102 - listen er lavet så den kan udvides efterhånden som man opdager nye spændende moduler, og der er linket både til data og omtaler af modulerne, hvor de er testet mere eller mindre igennem.

Følgende er oplistet en række moduler, som anbefales at kigge nærmere på, da de både er “lette” at anvende, og samtidig giver en god funktionalitet.

Modulnavn Beskrivelse Interface Driver
DHT11 Temperatur og luftfugtighed 1-wire https://playground.arduino.cc/Main/DHT11Lib
MCP23017 Port expander, 16 ekstra I/O porte I2C https://github.com/adafruit/Adafruit-MCP23017-Arduino-Library
TCS34725 RGB farvesensor I2C https://github.com/adafruit/Adafruit_TCS34725
DS1307 Real Time Clock. Ur-modul hvor tid og dato kan hentes fra. I2C https://github.com/PaulStoffregen/DS1307RTC
1602 LCD display LCD display med 16 karakterer i 2 linjer med HD44780 controller 4(8) bit parallel https://www.arduino.cc/en/Tutorial/HelloWorld
HC-SR04 Ultralyds modul, der kan bruges til at måle afstand med 2 digitale portben ingen driver, men mere info her:

http://www.instructables.com/id/Simple-Arduino-and-HC-SR04-Example/

KY-024 Hall sensor (detekter magnetfelt) 1 analog og/eller 1 digital portben ingen driver, men mere info her:

https://github.com/R2D2-2017/R2D2-2017/wiki/Keyes-KY-024-Hall-Sensor

Kigge i driver-koden Svaert.png

Hvis man får lyst til at kigge lidt i programkoden til den driver man har installeret til sit modul, så findes den (oftest) under: C:\Dokumenter\Arduino\libraries\<drivernavn>[10]

Driverne er (oftest) skrevet i C++, og har derfor fil-efternavnet .cpp. En sådan fil kan åbnes op i en kode-editor (For eksempel Notepad++[11], der er en gratis editor). Der findes i samme bibliotek som .cpp filen oftest også en .h fil, der er en såkaldt header-fil for programkodefilen. Inde i .h filen er der oftest defineret konstanter som anvendes i programkoden. Det kan for eksempel være en definition af hvilke(t) portben modulet anvender på Arduinoboardet. Har man brug for at flytte til et andet portben, og det ikke kan gøres når driveren initialiseres i sin Arduino programkode, så må man ty til manuelt at ændre i .h filen. Her er man så helt nede i maskinrummet, og man bør omgås dette med lidt andægtighed - men “hvo intet vover…”.

Referencer