Arduino Nano 33 IoT er udstyret med en integreret IMU-sensor, der består af en accelerometer og et gyroskop, samlet i LSM6DS3-chipset. Denne sensor kommunikerer med Arduino-boardet via I2C-interface, hvilket muliggør direkte adgang til bevægelses- og orienteringsdata. For at kunne benytte denne sensor effektivt, skal man først installere Arduino LSM6DS3-biblioteket, som understøtter både accelerometer- og gyroskopsensorerne.

Biblioteket kan installeres gennem Arduino IDE’s bibliotekshåndtering ved at søge efter “arduino_lsm6ds3” og derefter klikke på installer. Når biblioteket er på plads, initialiseres sensoren i kode med funktionen IMU.begin(). Hvis initialiseringen fejler, vil programmet standse og informere om problemet, hvilket sikrer, at sensorens tilgængelighed altid kontrolleres.

Accelerometeret måler acceleration i de tre rumlige retninger: x, y og z. Måleværdierne ligger typisk i intervallet fra -4 til 4 g (tyngdekraftenheder). Data aflæses ved at kontrollere, om accelerometerdata er tilgængelige via IMU.accelerationAvailable(), og herefter læse værdierne med IMU.readAcceleration(). Disse værdier kan efterfølgende vises i seriel terminal, hvor de kan analyseres eller visualiseres i realtid.

På samme måde håndteres gyroskopsensoren, som måler den vinkelrette hastighed og orientering. Gyroskopdata giver indsigt i rotation og bevægelse, hvilket er essentielt for applikationer som robotik, droner og bevægelsesregistrering.

Det er vigtigt at forstå, at IMU-sensoren kræver korrekt initialisering og løbende kontrol for datatilgængelighed for at sikre pålidelige målinger. Desuden bør man være opmærksom på, at både accelerometer og gyroskop kan have støj og fejl, som kan kræve filtrering og kalibrering i software.

Ved anvendelse af IMU-sensoren er det væsentligt at kende sensorens opdateringshastighed (sample rate), som kan aflæses via IMU.accelerationSampleRate(). Dette har betydning for, hvor hurtigt data kan indsamles og behandles, hvilket er afgørende for realtidsanvendelser.

Yderligere bør læseren være opmærksom på, at integration af IMU-data ofte kræver kendskab til signalbehandling og forståelse af fysik bag bevægelse for at kunne omsætte rå sensorværdier til meningsfuld information. Kalibrering mod statiske forhold og håndtering af sensor-drift over tid er afgørende for præcisionen.

Den tekniske dokumentation for LSM6DS3-chipset indeholder dybdegående specifikationer og beskrivelser af registre og konfigurationer, som kan være nødvendige for avanceret anvendelse og fejlfinding.

IMU-sensorens muligheder strækker sig langt ud over blot aflæsning af rå data; de muliggør konstruktion af komplekse systemer til navigation, stabilisering og bevægelsesanalyse, men det kræver en grundig forståelse af både hardware og software integration.

Hvordan kommer man i gang med Arduino Nano 33 IoT og opbygger det første program?

Arduino Nano 33 IoT er en moderne mikrokontroller med integreret WiFi og Bluetooth, hvilket gør den velegnet til Internet of Things-applikationer. Med en driftsspænding på 3,3V og en maksimal inputspænding på 21V er det essentielt at forstå dens tekniske begrænsninger, herunder en strømgrænse på 7 mA pr. I/O-pin og en klokfrekvens på 48 MHz. Den er baseret på en SAMD21-processor med 256 KB flashhukommelse og 32 KB SRAM. EEPROM understøttes ikke. Kortet tilbyder 14 digitale I/O-pins, hvoraf 11 kan bruges til PWM, 8 analoge input (ADC med 8/10/12-bit understøttelse), og 1 analog output via en 10-bit DAC. Derudover er der én UART, én SPI og én I2C bus. Den indbyggede LED sidder på pin 13, og kortet har en indbygget LSM6DS3 IMU (Inertial Measurement Unit).

For at begynde med udvikling på Arduino Nano 33 IoT, skal udviklingsmiljøet sættes op korrekt. Arduino IDE er tilgængelig til Windows, macOS og Linux og kan downloades fra Arduino’s officielle websted. Installationen er simpel, og når IDE'en er åbnet, præsenteres brugeren for en tom skabelon, hvor funktionerne setup() og loop() udgør programmets kerne. Al initialisering placeres i setup(), mens den kontinuerlige logik placeres i loop().

For at få IDE’en til at genkende Arduino Nano 33 IoT, skal pakken “Arduino SAMD Boards” installeres via Board Manager. Dette gøres under Tools ➤ Board ➤ Boards Manager, hvor man søger efter “Arduino Nano 33 IoT” og installerer den tilhørende pakke. Forbind herefter kortet til computeren med et micro USB-kabel. På Windows kan forbindelsen bekræftes via Enhedshåndtering, mens kommandoen $ ls /dev/ttyUSB* bruges på Linux og $ ls /dev/cu* på macOS.

Det første program kan være den klassiske “Blink”-skitse, hvor den indbyggede LED tændes og slukkes med én sekunds mellemrum. Programmet findes som eksempel i IDE’en under File ➤ Examples ➤ 01.Basics ➤ Blink. I setup() initialiseres pin 13 som output med funktionen pinMode(LED_BUILTIN, OUTPUT);. Herefter styres LED’en i loop() med digitalWrite() og tidsforsinkelser med delay(1000);. Dette giver en simpel og visuel bekræftelse på, at opsætningen fungerer.

Når programmet er skrevet, kompileres det med Verify-ikonet og uploades til kortet med Upload-ikonet. LED’en begynder herefter at blinke. Det er vigtigt at forstå, at HIGH og LOW i digitalWrite() repræsenterer spændingsniveauerne for henholdsvis tændt og slukket.

Alternativt kan man bruge Arduino Web Editor via https://create.arduino.cc/editor. Fordelen ved denne løsning er, at den kræver minimal lokal opsætning — kun en browser og internetforbindelse er nødvendig. Brugeren skal registrere sig på Arduino-portalen for at anvende editoren.

Det er centralt for nybegyndere og viderekomne brugere at forstå, at arbejdet med Arduino Nano 33 IoT ikke kun handler om at få LED’en til at blinke, men om at opbygge en disciplineret forståelse af systemets arkitektur, strømgrænser, og tilgængelige interfaceprotokoller. Forståelsen af, hvordan input og output håndteres digitalt og analogt, hvordan timing styres, og hvordan IDE og drivere kommunikerer med hardware, udgør fundamentet for videre arbejde med mere avancerede projekter. Det er også vigtigt at forholde sig til kortets 3.3V logikniveau, især når det skal integreres med sensorer eller moduler, der kører på 5V, for at undgå beskadigelse.

Hvordan scanner og læser man I2C-enheder med Arduino Nano 33 IoT?

I arbejdet med I2C-kommunikation på Arduino Nano 33 IoT er første skridt at identificere alle tilsluttede enheder på I2C-bussen. Hver I2C-enhed har en unik adresse i intervallet fra 1 til 126 (0x01 til 0x7E). For at scanne disse adresser kan man implementere et simpelt program, som systematisk prøver at kommunikere med hver adresse og registrerer svarene.

Ved at benytte Wire-biblioteket – som skal inkluderes via #include <Wire.h> – initieres I2C-kommunikationen i setup()-funktionen med Wire.begin() og den serielle monitor aktiveres med Serial.begin(115200). Dette sætter baudraten til 115200, som er tilstrækkeligt til hurtig dataudveksling.

Scanning foregår i loop() ved at iterere over mulige adresser. For hver adresse påbegyndes en transmission med Wire.beginTransmission(address) og afsluttes med Wire.endTransmission(). Hvis endTransmission() returnerer 0, betyder det, at enheden er til stede på den aktuelle adresse. Resultaterne udskrives i HEX-format til den serielle monitor, hvor eksempelvis en adresse på 0x48 vil fremstå tydeligt.

Efter scanningen, hvis ingen enheder registreres, meddeles dette. Alternativt bekræftes det med en "done"-meddelelse. Dette giver udvikleren et hurtigt overblik over alle tilsluttede I2C-enheder, inklusive interne sensorer som typisk findes på Arduino Nano 33 IoT – f.eks. 0x60 og 0x6A.

Når de relevante adresser er fundet, kan næste skridt være at hente data fra enhederne. En af de anvendte enheder er PCF8591 – en AD/DA-konverter med fire analoge kanaler. Disse kanaler kan være tilsluttet sensorer såsom en termistor, en fotovoltaisk celle og et potentiometer, hvilket muliggør læsning af forskellige fysiske værdier.

For at læse data fra disse sensorer, benytter man igen Wire-biblioteket. Først defineres den I2C-adresse som #define PCF8591 0x48 og de individuelle kanaler for hver sensor: PCF8591_ADC_CH0 til PCF8591_ADC_CH3. I setup() initialiseres I2C-kommunikation og den serielle port.

I loop() starter man læsning ved at åbne en transmission til PCF8591, skrive den ønskede kanal, og afslutte transmissionen. Herefter anmoder man om to bytes data med Wire.requestFrom(), og læser dem med to efterfølgende Wire.read(). På grund af den måde PCF8591 fungerer på, skal den første læste byte ignoreres – det er kun den anden, der indeholder den faktiske sensorværdi. Resultatet vises direkte i den serielle monitor.

Denne proces gentages for hver sensor, hvor kanalværdien blot ændres. Mellem læsninger anvendes delay(100) for at sikre, at sensoren har tilstrækkelig tid til at reagere.

Det centrale i denne praksis er forståelsen for, hvordan I2C fungerer som en master/slave-protokol, hvor Arduino fungerer som master, der anmoder om data fra forskellige slave-enheder. Adressering er derfor fundamentalt, og fejlhåndtering – såsom aflæsning af fejltype når endTransmission() returnerer 4 – er ligeledes kritisk for robusthed.

Når man arbejder med I2C, er det essentielt at forstå, at flere enheder kan dele den samme bus, så længe adresserne ikke kolliderer. Det er derfor scanning er et første nødvendigt skridt, før der initieres nogen form for dataudveksling.

Ud over implementeringen bør man forstå den elektriske dimension. Pull-up modstande på SDA og SCL-linjerne er nødvendige for korrekt signalniveau. Hvis disse ikke er til stede – enten eksternt eller via interne pull-ups – kan bussen fejle. På Arduino Nano 33 IoT er der ofte allerede interne pull-ups, men det afhænger af den konkrete hardwareopsætning.

Et andet vigtigt aspekt er, at nogle I2C-enheder kræver initialiseringskommandoer eller konfigurationer for at kunne afgive brugbar data. I tilfælde af PCF8591 kræves dog ingen videre konfiguration ud over kanalvalg og læsning.

Til sidst bør man bemærke, at timingen mellem kommandoer og læsninger er afgørende. Brug af delay() er en simpel, men ikke optimal metode. I større systemer bør man anvende mere præcis tidsstyring eller interrupt-baserede metoder for at undgå unødvendige ventetider og forbedre performance.