Program IntroARM

From Chalmers Robotförening

Denna sida innehåller information om programmet för IntroARM. Här finns dokumentation för de specialskrivna biblioteksfunktioner som finns för IntroARM (t.ex. styra LEDs, Motorer, läsa sensorer etc). För mer allmän information om programmering av STM32, kolla på sidan Programmering STM32.

Programmet

Olika varianter av programmet hittar du här:
File:IntroARM kod.zip
Denna kod innehåller endast de specifika .c- och .h-filer som IntroARM använder sig av. Zip-filen innehåller ett startup-script (.S-filen) som behövs. Programmet bygger på STs standard-bibliotek som inte följer med, men som kan hittas via STs hemsida (Todo: Lägg till en länk där man hittar det). Det finns inte heller med ett länkarscript, som också behövs.

File:IntroARM Makefile Project.zip
Är ett komplett projekt med samma kod som ovan men innehåller allt som behövs för att kompilera koden under korrekt uppsatt Eclipse i Ubuntu. Detta innebär att bibilotek, länkarskript och makefil finns med. Programmet testar grundläggande funktioner som motorer, knappar, LEDs, sensorer, UART och buzzer.

File:Main start.zip
Detta är en modifierad main-fil som stödjer (till viss del) startmodulsystemet. Det som inte stöds är att den inte sparar sitt state mellan power cycles, så den måste programmeras med en ny startadress varje gång. Detta går att lösa genom att t.ex. nollställa statemaskinen via en knapptryckning (vid kanpptryckning, sätt startState till STATE_POWER) alternativt implementera att den sparas i Flash.

Generell info

Målet är att programmet ska vara uppdelat i moduler, d.v.s. att man ska kunna välja att endast använda vissa delar av programmet oberoende av andra delar. Man väljer vilken modul man ska använda genom att inkludera filen och köra init-funktionen för den.

Port-karta

Nedan följer en beskrivning på vilka portar som är kopplade till vilka funktioner på IntroARM.

Modulerna

Nedan följer en beskrivning av varje modul. En del filer kan innehålla fler än en modul, vilket gör att dessa moduler är sammankopplade. Det finns också ett antal moduler som är mycket grundläggande för IntroARMs funktion. Dessa bör alltid användas, då många funktioner beror på dessa. Detta är dels standard-peripheral-biblioteket från ST samt time-modulen

Time

Sköter funktioner som har med tid att göra. Här finns även systick-interruptet som går en gång varje ms.

  • Filer: time.c och time.h
  • Andra nödvändiga moduler: Inga
  • Settings: Inga
  • Funktioner/Variabler:
    • delay_ms(unsigned long ms): Väntar i ms millisekunder. Under tiden den väntar är det vanliga programflödet låst och processorn svarar endast på interrupt. Mycket användbar.
    • delay_us(unsigned short us): Som delay_us, fast väntar i ett antal mikroskunder istället
    • unsigned long systemTime: Innehåller antal ms sedan processorn startade. Användbar för timings av olika slag, t.ex. timeouter.

LEDs

Styr de LEDs som finns på IntroARM.

  • Filer: led.c och led.h
  • Andra nödvändiga moduler: Inga
  • Settings: Inga
  • Funktioner:
    • ledInit(): Initierar portar och klockor för LEDs. Släcker även alla LEDs.
    • Makros för varje LED: Varje LED har ett makro som använder för att styra LEDs med. Makrona heter LED_x_cmd() där x är numret på LEDen (1 till 6) och cmd är kommandot, d.v.s. SET, CLEAR eller TOGGLE. Notera att kommandot måste avslutas med ";". Exempel: LED_1_SET(); delay_ms(500); LED_1_CLEAR(); //Tänder en LED, väntar i 500ms och släcker sedan LEDen

Knappar

Hanterar knapparna för användarinput.

  • Filer: sw.c och sw.h
  • Andra nödvändiga moduler: Inga
  • Settings: Inga
  • Funktioner:
    • swInit(): Initierar portar och klockor för knapparna. Sätter pulldown Todo: kolla så att det är korrekt
    • Makros för att läsa av knapparna: SW_x där x är numret på knappen (1 eller 2). Makrot har värdet 1 ifall knappen är nedtryckt och 0 ifall den inte är nedtryckt. Exempel: if (SW1) {do_stuff()}

UART

Styr uart-kommunikation

  • Filer:
  • Andra nödvändiga moduler:
  • Settings:
  • Funktioner:

Motor

Styr motorerna.

  • Filer: mc.c och mc.h
  • Andra nödvändiga moduler:
  • Settings:
    • MC_RIGHT_DIR och MC_LEFT_DIR ställer åt vilket håll som är "framåt" på motorerna. Dessa kan ställas till -1.0 eller 1.0 och ställs efter test av motorerna.
  • Funktioner:

Front-sensorer

Pulsar IR-LEDs och läser av status hos sensorerna. Gör viss nödvändig databehandling.

  • Filer: ir.c, ir.h
  • Andra nödvändiga moduler:
  • Settings:
    • IR_FREQ, IR_FREQ_MAX/MIN - ställer in vilken frekvens IR-LEDsen pulsas med, och därigenom vilken känsligheten på sensorerna (mottagarna är känsligast på 38kHz, och känsligheten sjunker vid andra frekvenser).
  • Funktioner:
    • irInit() - Initierar portar, timers etc till IR-sensorerna
    • irEnable()/irDisable() - Slår på och av pulsningen av IR-LEDsen. Kan användas för att spara batteri, och skall användas i väntan på startmodul-signal
    • irSetFreq(unsigned short freq)/irSetSens(unsigned char sens) - Ställer in frekvensen (i Hz)/känsligheten för sensorerna genom att ändra pulsningsfrekvensen på LEDsen. irSetSens tar in ett värde mellan 0 och 16 och anropar i sin tur irSetFreq.
    • IR_RIGHT, IR_FR_RIGHT, IR_FR_LEFT och IR_LEFT - innehåller det filtrerade värdet på hinderdetektorerna (Höger, höger fram, vänster fram, vänster). Är 1 om sensorn ser, 0 om den inte ser. Kopplade till variablerna irActiven, där n är 1-4 och motsvarar IRMOT1-4.

Exempelkod för att använda sig av hinderdetektorerna:

<syntaxhighlight lang="c" enclose="pre"> irInit(); irSetFreq(39000); irEnable(); while(1) { if(IR_RIGHT) { LED_1_SET(); } else { LED_1_CLEAR(); } if(IR_FR_RIGHT) { LED_2_SET(); } else { LED_2_CLEAR(); } if(IR_FR_LEFT) { LED_3_SET(); } else { LED_3_CLEAR(); } if(IR_LEFT) { LED_4_SET(); } else { LED_4_CLEAR(); } } </syntaxhighlight>

Fjärrkontrollavkodare

Tar emot och avkodar meddelanden från mottagaren bak på roboten. Stödjer endast RC5 i dagsläget.

  • Filer: ir.c, ir.h, rc5.c, rc5.h
  • Andra nödvändiga moduler: IR-modulen, time
  • Settings:
  • Funktioner:
    • rc5Init() - initierar rc5-kommunikationen
    • rc5SetCallbackFunction(fun) - ställer in vilken funktion som ska anropas när ett meddelande är mottaget. Funktionen måste ta in en pekare till typen RC5DATA, en struct som innehåller adress och kommando från RC5.

Exempelkod för att använda sig av IR-mottagaren med fjärrkontroll:

<syntaxhighlight lang="c" enclose="pre"> void rc5Callback(*IRDATA data);

void main () { irInit(); irDisable(); rc5Init(); rc5SetCallbackFunction(rc5Callback); }

void rc5Callback(*IRDATA data) { //DO stuff }

</syntaxhighlight>

Kantsensorer

Sköter ADC och läser av kantsensorerna.

  • Filer:
  • Andra nödvändiga moduler:
  • Settings:
  • Funktioner:

Tachometrar

Sköter ADC och läser av tachometrar. Kan presentera data på ett antal olika former.

  • Filer:
  • Andra nödvändiga moduler:
  • Settings:
  • Funktioner:

Batterimätning

Sköter ADC och mäter batterispänningen. Kan presentera datan som V via uart eller på LEDsen

  • Filer: adc.c och adc.h
  • Andra nödvändiga moduler: UART, LEDs
  • Settings:
  • Funktioner:

Buzzer

Piper buzzern i olika frekvenser. Har en viss buffert för att spela upp ljud.

  • Filer:
  • Andra nödvändiga moduler:
  • Settings:
  • Funktioner:

SD-kort

Läser och skriver data från/till SD-kortet. Kan användas för t.ex. loggning eller lagring av musik (att spela upp på buzzern)

  • Filer:
  • Andra nödvändiga moduler:
  • Settings:
  • Funktioner:

I2C

Kommunicerar med I2C.

  • Filer:
  • Andra nödvändiga moduler:
  • Settings:
  • Funktioner:

MPU6050

Gör inställningar och läser data från MPU6050 (accelerometer och gyro, x,y,z).

  • Filer: i2c.c, i2c.h, mpu6050.c, mpu6050.h
  • Andra nödvändiga moduler: I2C
  • Settings:
  • Funktioner:

DAC (Digital-analog converter)

Skickar ut en analog spänning på en pinne.

  • Filer:
  • Andra nödvändiga moduler:
  • Settings:
  • Funktioner: