Archive for Mikrokontroller

Black Magic

Jeg kom over en genial liten JTAG programmerer/debugger for bl.a. STM32F4 som heter BlackMagic. Først og fremst er både hardware og firmware open source, men man kan også kjøpe den ferdig bygd for en ganske rimelig penge. Det som er så genialt med denne i forhold til de fleste andre er at den ikke bare er en JTAG boks, men også en hardware GDB server. Man slipper med andre ord OpenOCD og liknende. Bare å plugge inn i USB porten og fyre opp debuggeren.

Men så kommer det som er ekstra genialt. Man kan bytte ut ST-Link firmwaren på STM32F4Discovery med Black Magic firmware. På Discovery-kortet sitter det som kjent en STM32F4 kontroller, men det er også en liten STM32F103 som kun kjører ST-Link (ST sitt JTAG/SWD grensesnitt). Denne kontrolleren er tilfeldigvis akkurat den samme som BlackMagic bruker. Og skulle du ikke sett om noen har laget en tilpasning slik at det bare er å kompilere med en annen paremeter. Det må litt lodding og fomling til, men når det virker er det overlegent.

Her er link til Black Magic

Og her til siden som beskriver hvordan man flasher Discovery.

Beskrivelsen er ikke helt patent. De har kuttet noen hjørner og tatt noe for gitt, så hvis du har lyst til å gjøre dette så gi meg en lyd så skal jeg fortelle hvordan jeg fikk det til.

Det som er viktig å huske er at det er ingen vei tilbake. Den orginale firmwaren er borte for alltid, og ST lar deg ikke laste den ned.

Motoren snurrer

Motoren snurrer. Riktignok har jeg ikke ennå implementert detektering av nullgjennomganger, så feltet roterer bare med et fast turtall, og så håper jeg at motoren henger med. Men, turtallet lar seg justere, og strømmen lar seg justere, så det er i hvertfall ganske mye funksjonalitet som er på plass. Det er mye på elektronikken som virker også. Så langt er jeg veldig fornøyd.

BLDC motorkontroller

Av og til trenger livet et prosjekt der man kan sitte ved kjøkkenbordet, eller i stua å pusle. Derfor dro jeg en av mine gamle ideer opp av hatten. Dette er jo egentlig ikke noe nyskapende i det hele tatt. Fartskontrollere for børsteløse motorer finnes det jo 13 av på dusinet, og mange lager seg egne med større eller mindre hell. Så hvorfor gjør jeg dette.

  1. Jeg har lyst til å lære meg ARM kotrollere (STM32F4)
  2. Jeg har lyst til å lære meg Chibios (www.chibios.org)
  3. Jeg vil ha en motorkontroller som kan integreres med annen funksjonalitet, og som kan snakke skikkelige grensesnitt
  4. Også er det sånn passe vrient, men ikke for vanskelig.

Jeg har allerede laget en PCB for å plugge inn på et STM32F4Discovery kort. Denne PCB-en har drivere og all nødvendig elektronikk for å bruke Discovery kortet som en BLDC. Det er ikke for praktisk bruk, kun for utvikling, da det er kjempestort. Jeg har ikke bestykket kortet enda, men jeg har allerede funnet en rekke feil i designet. Ingen showstoppere. Alle feilene kan fikses med en skalpell, en loddebolt og litt tynn ledning.

Hovedtrøkket har ligget på utvikling av firmware. Her har jeg laget et system som kan ta imot kommandoer fra USB og gjøre forskjellige ting med det. USB biten ble riktig smukk, og kan enkelt gjenbrukes. Jeg har kommet ganske langt på BLDC funksjonen. Men Chibios i bunn, så er det masse flotte drivere for hardwaren på chippen, så applikasjonskoden blir veldig liten. Jeg har nok funksjon til å teste litt med motor allerede, og komponentene kommer i posten hvert øyeblikk.

Skjema og utlegg har jeg ikke publisert enda, men firmware ligger her.

https://github.com/kjellhar/chibi-bldc

Jeg har ikke lagt inn Chibios der, så den må lastes ned separat.

Kapasitiv lineær enkoder

Jeg har lenge drodlet litt om å lage custom servoer. Ikke fordi jeg tror jeg kan slå kjøpeservoer på ytelse, det er mer for å kunne lage noe som passer perfekt til sitt bruk. Det gjelder spesielt små servoer med litt spesiell formfaktor.

Det største problemet med dette er å lage gode enkodere som indikerer posisjonen til servoen. En essensiell del av at servosystem. På gamle kjøpeservoer ble dette ordnet med et pot-meter. Ganske enkelt, men ikke veldig fleksibelt. Hva som gjøres i moderne servoer vet jeg ikke, men det er mange muligheter. Problemet er å finne en løsning som både er bra, billig og mulig å mekke selv.

Litt inspirert av min venn Bernt sitt hovedprosjekt gikk tankene i retning av variabel kapasitans. Bernt brukte en spesiell ADC krets for å måle kapasitans, samt at giveren var roterende. Jeg ønsker å unngå en ekstra komponent samt bruke en lineær giver.

Løsningen min, som jeg tenker å teste ut ganske snart, er å lage giveren av et messingrør med innerdiameter på 2 eller 3mm. Inni dette røret støper jeg plast, som jeg borer ut et 1mm hull gjennom. I dette hullet kan man dra en 1mm messingstang. Kapasitansen øker jo lenger inn messingstangen føres.

For å måle denne kapasitansen tenker jeg å bruke en mikrokontroller med innebygget analog komparator. Mikrokontrolleren trengs uansett for å kjøre reguleringssløyfe, samt kommunikasjon. Komparatoren settes opp som en oscillator der frekvensen varierer med C. Hvis man skulle måle absoluttverdier, så måtte en god del nøkkelkomponenter være av høy presisjon, men i dette tilfellet er det kun relativ nøyaktighet, eller presisjon, vi er ute etter. Da blir presisjonen bestemt av jitter på MCU klokka og jitter på den nevnte oscillatoren. Oppløsningen bestemmes av hvor lenge man teller for å bestemme frekvensen.

Hvis dette ikke gir helt mening, så ta en titt på skissen under (klikk for større versjon).

 

Så tester vi litt.

Aller først er det greit å teste at systemet fungerer fra kommandolinjen. Last ned mitt lille Blink-LED-program, så har du noe som skal virke (på STM32F4Discovery vel og merke).

  1. Last ned ch.elf
  2. Plugg inn STM32F4Discovery kortet med USB mini kontakten (Den største). Dette er USB kontakten til ST-Link delen på kortet.
  3. Start to terminalvinduer.
  4. I den ene terminalen:
    > st-util
  5. Det skal da dukke opp noe slikt som:2012-06-19T23:23:25 INFO src/stlink-usb.c: — exit_dfu_mode
    2012-06-19T23:23:25 INFO src/stlink-common.c: Loading device parameters….
    2012-06-19T23:23:25 INFO src/stlink-common.c: Device connected is: F4 device, id 0x10016413
    2012-06-19T23:23:25 INFO src/stlink-common.c: SRAM size: 0x30000 bytes (192 KiB), Flash: 0x100000 bytes (1024 KiB) in pages of 16384 bytes
    Chip ID is 00000413, Core ID is  2ba01477.
    KARL – should read back as 0x03, not 60 02 00 00
    init watchpoints
    Listening at *:4242…
  6. I det andre terminalvinduet
    > arm-none-eabi-gdb
    Prompten vil da endre seg til (gdb)
  7. Koble debuggeren til gdb-serveren (st-util)
    (gdb)  target extended-remote *:4242
    Remote debugging using :4242
    0x08000340 in ?? ()
  8. Reset debuggeren
    (gdb) monitor reset_halt
  9. Last inn EFL fila
    (gdb) load ch.elf
    Loading section startup, size 0x188 lma 0x8000000
    Loading section .text, size 0x11d8 lma 0x8000190
    Start address 0x8000190, load size 4960
    Transfer rate: 4 KB/sec, 2480 bytes/write.
  10. Start programmet
    (gdb) run
    Svar ja på spørsmål.
  11. Nå skal den oransje, grønne og blå lysdioden blinke.

STM32 utvikling på Mac (og forsåvidt Linux)

Da prøver jeg meg på å beskrive oppsettet mitt for å skrive kode og debugge STM32F4 vha en Mac. Det kan hende jeg har glemt noe, eller at jeg allerede hadde installert noen av avhengighetene, men da er det fint om dere sier i fra, så kan jeg rette opp.

Denne beskrivelsen vil også fungere på Linux, med den lille forskjellen at systemet for å installere pakker heter noe annet. Alle stedene jeg bruker kommandoen «port», så må den byttes ut med passende kommando på ditt system (f.eks. «apt-get»). Og bare så det er nevnt, hvis du ikke klarer å bruke terminal har du tapt allerede før start, så fyr det opp med en gang. Det er forresten også greit å sjekke om pakkene allerede er installert før man kjører en «port install … »

  1. ** Kun Mac ** Det aller første som må gjøres installere XCode fra apple. Gå inn i App store og søk. Det tar laaang tid.
  2. ** Kun Mac ** Det neste er å legge inn Macports. Uten den blir dette en uvirkelig slitsom jobb.
  3. Installer GIT
    >  sudo port install git-core
  4. Installer autoconf
    >  sudo port install autoconf
  5. Installer libusb 1.0
    >  sudo port install libusb
    >  sudo port install libusb-devel
  6. Hent programvaren som snakker med ST-Link debuggeren
    >  git clone https://github.com/texane/stlink stlink.git
  7. Kompiler denne programvaren
    >  cd stlink.git
    >  ./autogen.sh
    >  ./configure
    >  make
    >  sudo make install
  8. Sjekk om applikasjonene «st-flash» og «st-util» finnes på systemet ditt.
  9. ** kun Linux **  Sett opp udev rules. Dette gør at du slipper å kjøre st-util som admin
    >  cp 49-stlinkv*.rules /etc/udev/rules.d/
    >  sudo udevadm control –reload-rules
  10. Last ned GNU ARM toolchain fra Yagarto (Mac og Win), eller Codesourcery Lite (Linux, velg bin fil).
  11. ** Kun Mac **  Installer Yagarto. Dette er i praksis å plassere den nedlastede filen der du ønsker å installere, og så dobbelklikke på den. Den pakker bare ut alle filene. Jeg har valgt å legge den på
    /Developer/yagarto
  12. ** Kun Linux ** Installer Codesourcery fra bin fil. Last ned «getting-started.pdf» og følg instruksjonene.
  13. Sett opp PATH variablen ved å editere et passende oppstart-script. På min Mac har jeg valgt å legge det til i .profile, så åpne denne med en vanlig teksteditor (f.eks emacs) og legg til
    export PATH=/Developer/yagarto/yagarto-4.6.2/bin:$PATH
    export PATH=/Developer/yagarto/yagarto-4.6.2/tools:$PATH
  14. Åpne en ny terminal og sjekk om du kan starte en haug med programmer som starter med «arm-none-eabi-«, f.eks «arm-none-eabi-gcc»
  15. Last ned Eclipse, eller mer presist, den som heter «Eclipse IDE for C/C++ Developers (includes Incubating components)»
  16. Legg Eclipse på et passende sted, f.eks i Application katalogen (kopier hele katalogen du lastet ned inn dit)
  17. Start Eclipse og gå inn på menyen «Help->Install new software …»  (Dette må du gjenta noen ganger da Eclipse insisterer på omstart hver gang du installerer noe)
  18. Installer GNU ARM Eclipse-plugin.
    Trykk på «Add» knappen og skriv inn
    Name:  GNU ARM Eclipse-plugin
    Location:  http://gnuarmeclipse.sourceforge.net/updates
    Velg så «CDT GNU Cross Development Tools» og trykk Next go Finish
  19. Installer Zylin debugger (Eclipse:  Help->Install new software …) ved å fylle inn dette
    Work with:  http://opensource.zylin.com/zylincdt
    Velg «Zylin Embedded CDT» og gå runden med Next, Finish og omstart av Eclipse.

Se så, da tror jeg faktisk alt  som skal installeres er inne. For Windows er installasjonen litt annerledes. Jeg skal ta den i en egen post senere.

Det neste på programmet er å teste at hele oppsettet virker, samt sette opp Eclipse slik at man kan debugge programmer.

STM32F4Discovery

Hopla, for en overskrift.

Jeg har endelig fått hoppet på et prosjekt med UAV. Har ruget på noe slikt i 4-5 år allerede uten at det har konkretisert seg så veldig, men her for litt siden ble jeg dradd med i et lite hexakoptermiljø av noen kollegaer. Disse hadde kjøpt sett fra DiyDrones, og de virket forsåvidt helt ok, men det var ikke vanskelig å se rom for forbedringer.

Et sted skal man jo starte, og det viste seg at autopiloten var basert på en Arduino løsning. Det vil i praksis si en usedvanlig shaity 8-bits AVR kontroller fra Atmel. Alle involverte var skjønt enig i at her burde det lages noe bedre. Vel, man det finnes jo forsåvidt noen bedre løsninger rundtom, men de er ofte dyre.

Siden jeg uansett var i gang med et mikrokontrollerprosjekt på jobb, så fristet det litt å lage noe vettugt her også. Etter ganske mye leting etter den rette chippen, så kom jeg over et aldri så lite kupp.

STM32F407/17

Dette er et råskinn av en ARM Cortex-M4 kontroller som kan gå opp til 168MHz. Det er 1MB flash og 192kB RAM. Rikelig mer periferienheter, og sist men ikke minst, en FPU. Det er gull når man skal lage et system som hovedsakelig skal drive med signalbehandling og regulering. Prisen var snill, og den kom i pakker med 64, 100, 144 og 176 pinner.

Men så kommer det som var det egentlige kuppet. ST har laget et evalueringskort som heter STM32F4Discovery. Dette er et lekkert lite kort med STM32F407 kontroller. I tillegg finnes det en ST-Link SWD programmerer/debugger på kortet, en USB kontakt (eller 2 med den til debuggeren), et 3 akse akselerometer, noen lysdioder + litt til. Alle IO pinnene var ført ut på vanlige pinnelister, og kortet er ca 6x12cm stort. Det er med andre ord perfekt for hobbyprosjekter og produkter der man ikke trenger/ønsker å lage noe selv. Det beste av alt, prisen …. jeg betalte 129kr + MVA på Farnell. De er litt billigere på mouser.com, men der er frakt litt dyrere.

Jeg har nok tenkt å lage en PCB selv til autopiloten, men dette kortet er helt klart perfekt for utvikling av SW, og testing.

Hvordan utvikler man så på dette. Vel jeg har snekret i hop løsninger på alle tre platformer, ikke for det jeg trenger å utvikle på alle, men det bare ble slik pga feilsøking. I hvertfall, man kan skrive, kompilere og debugge programmer til dette kortet på både Win, Mac og Ubuntu ved hjelp av Eclipse, arm-none-eabi- og et par andre småprogrammer.

Siden flere av mine medsammensvorne også har lyst til å prøve på denne kontrolleren, så skal jeg skrive en utførlig beskrivelse av hvordan man går fram. Kommer nok opp ganske snart (tror jeg).

PS.

Det finnes flere Discovery kort fra ST, men ikke alle er helt like. Sørg for å kjøpe et med ST-LinkV2. Det vil i praksis si STM32F4Discovery eller STM32F0Discovery.