Kjekt å vite om bibliotekene vi har lagt ut

PLabLib1

  • PLab_IRremote: Basert på IRremote. Lagt til støtte for Keyes IR fjernkontroll.
  • PLab_PushButton: Klasse for knapp, med innebygd debounce støtte.

PLabLib2

PLabLib3

PLabLib4

  • LSM303: Brukes i forbindelse med Zumo roboten. Dokumentasjon kan finnes herFor å bruke denne klassen må du inkludere Wire.h. Skriv #include <Wire.h> på linja før du inkluderer denne.

NewServo

  • NewServo: Kan brukes når Arduino sitt Servo bibliotek ikke kan brukes på grunn av timer konflikt (se under).

PLabBT

  • PLabBTSerial: Bygger på Arduino SoftwareSerial, men sier først fra om tilgjengelig data når en hel melding har blitt mottatt. For å bruke denne klassen må du inkludere SoftwareSerial.h. Skriv #include <SoftwareSerial.h> på linja før du inkluderer denne.
  • PLabBTCallbak: Bygger på Arduino SoftwareSerial, men lar deg registrere en callback funksjon som mottar en hel melding. For å bruke denne klassen må du inkludere SoftwareSerial.h. Skriv #include <SoftwareSerial.h> på linja før du inkluderer denne.
  • PLabBTLEController: Bygger på Arduino SoftwareSerial, fungerer som en innpakning for ulike AT kommandoer for HM-10 og HM-11 Bluetooth LE enheter. Dette kan gjøre det enklere å gjøre konfigurasjon eller sammenkobling av slike enheter. For å bruke denne klassen må du inkludere SoftwareSerial.h. Skriv #include <SoftwareSerial.h> på linja før du inkluderer denne.

PLabDHT_sensor

Bibliotek for digital luftfuktighet og temperatursensor. Skrevet av Adafruit. Se GitHub for dokumentasjon.

PLabInternet

PLabLiquidCrystal

  • PLabLiquidCrystal: Bruker en MCP23008 port expander for å skrive til LCD displayet. Koden bygger på Arduinos LiquidCrystal. Biblioteket er avhengig av at PLabMCP23008_v101 biblioteket er installert. For å bruke denne klassen må du inkludere Wire.h og Adafruit_MCP23008.h. Skriv #include <Wire.h>  og #include <Adafruit_MCP23008.h> på linjene rett før du inkluderer denne.

PLabMCP23008_v101

Bibliotek for kontroll av MCP23008 port expander. Skrevet av Adafruit. Se GitHub for dokumentasjon. Vi bruker versjon 1.0.1 av dette biblioteket. For å bruke dette biblioteket må du inkludere Wire.h. Skriv #include <Wire.h> på linja før du inkluderer det.

Zumo

Biblioteket er en samling av Pololu sitt Zumo bibliotek. Vi har lagt til en klasse.

  • PLab_ZumoMotors har funksjonaliteten til ZumoMotors, men kan i tillegg snu høyre og venstre ett gitt antall grader.

Biblioteker i konflikt

Hva som kan skje

Noe som burde virke ikke virker. Det kan være alt fra avlesninger som ikke gir mening på tross av riktig oppkoblet krets og korrekt kode, til at kode nekter å kompilere selv om den tilsynelatende burde. Dette kan skyldes at noen biblioteker ikke vil leke sammen på riktig måte. Grunnen til at bibliotekene av og til ikke er skrevet på en måte som gjør at de kan fungere sammen er ofte at Arduino har veldig begrenset med ressurser.

Begrenset med ressurser

En Arduino Uno har i utgangspunktet 14 digitale og 6 analoge IO pinner. Av de digitale pinnene kan 5 brukes til sending av Pulse Width Modulation (PWM), som er det analogWrite() gjør. I tillegg er det svært begrenset med klokketimere (3 stykk) og ting som kan fortelle Arduino Uno at noe har skjedd fra utsiden også kalt ekstern interrupt (2 stykk).

Eksterne interrupts

Når noe skjer i verden som Arduino bør vite om er det mulig å finne ut dette ved hjelp av å spørre verden om det har skjedd noe, eller verden kan sende en beskjed om at det har skjedd noe. Når Arduino spør verden kalles det polling, og når verden sender en beskjed kalles det interrupt. Kommer beskjeden fra en kilde utenfor Arduino sier vi det er en ekstern interrupt.

På Arduino Uno er det bare 2 pinner (pin 2 og 3) som kan brukes som interrupt kilde. Når det kommer en beskjed på en av disse pinnene er det en spesiell kodesnutt som kjører. Krever et bibliotek at du kobler en ting til en av disse pinnene er det stor sannsynlighet for at det er fordi dette biblioteket er avhengig av kode som kjøres på interrupt. Eksempelvis kan callback funksjoner bli kalt fra en interrupt.

Timere

Timere er i denne sammenhengen alarmklokker som sier fra når det har gått en viss tid. Dette er en form for intern interrupt som kjører når det har gått en viss mengde tid. Disse brukes til veldig mye, blant annet kan det brukes til å få kode til å sove en stund (som delay() gjør) eller for å avbryte en Arduino som venter for lenge på et svar (som når du bruker en lydpuls for å måle avstand, aldri får noe svar, men vil fortsette koden uten å vente i en evighet).

En Arduino Uno har i utgangspunktet 3 timere, Timer 0, Timer 1 og Timer 2. Timer 0 brukes av mye internt i Arduino (delay(), millis(), etc.), og kan derfor ikke brukes til generell koding. Vi har da igjen 2 timere, og med flere biblioteker avhengige av timere, vil det nødvendigvis være tilfeller hvor man prøver å bruke samme timer. Det gjør det ikke noe enklere at biblioteker som er med Arduino i utgangspunktet også bruker enkelte av disse timerene.

Hva som skjer når flere bruker samme ressurs

Når flere prøver å bruke samme ressurs blir det ganske enkelt feil som oppstår. Hvor feilen oppstår avhenger av hvilken ressurs det er krangel om og hvordan programmereren skrev koden. Feilsymptomer som kan oppstå inkluderer:

  • Du får ikke kompilert. Feilmeldingen kan være at noe er definert på flere steder, noe som skjer om du prøver å bruke NewPing sammen med Tone.
  • Du får resultater som ikke gir mening.
  • Du får oppførsel som ikke gir mening.

Hvilke biblioteker bruker hva

Biblioteker som konkurrerer om eksterne interrupts vil vise det ved at du er nødt til å koble til flere enheter til interrupt pinnene. Timere er det vanskeligere å vite hvilket bibliotek som bruker hva. Derfor gir vi her en liten liste over biblioteker som bruker de ulike timerne. Lista er ikke nødvendigvis komplett. Det vil bli kræsj om du bruker to biblioteker som bruker samme timer.

En del av oppførselen til Arduino er bestemt av innstillingene til Timer 0. Det er mulig å endre på disse, men da skal du vite veldig godt hva du gjør. Det er veldig få tilfeller dette er nødvendig, og kanskje heldigvis er det rimelig komplisert å gjøre det. For fullstendighetens skyld har vi lagd en liste av bibliotekene vi har lagt ut som vi vet er avhengig av riktig oppførsel av Timer 0 grunnet kall til millis() eller delay(): NewServo, PLab_PushButton, LSM303, PushButton, QTRSensors, ZumoReflectanceSensorArray og muligens PLabBTSerial og PLabBTCallback (via SoftwareSerial og Stream).

BibliotekTimer 0Timer 1Timer 2
Biblioteker i programvaren   
Intern timing
(delay(), millis(), etc.) 
X  
Tone  X
Servo X 
Biblioteker vi anbefaler/har lagt ut   
NewPing  X
ZumoMotors X 
PLab_IRremote  X
ZumoBuzzer  X
  • No labels