Gå til innhold

Anbefalte innlegg

Her kommer litt om mitt nylig igangsatte prosjekt FanSY!

 

 

 

Jeg har lenge gått med en ide om å lage en form for viftestyring for å kunne bruke i PC. Jeg hadde ikke helt sett for meg hvordan jeg skulle løse det, men ideèn var å lage en "intellegent" krets som kunne styre flere vifter inni kabinettet i forhold til en eller flere temperatursensor-kretser. Jeg ville også ha en mulighet for overvåkning av styringen i form av et display eller et program på PC'n.

 

 

 

Etter en del tenking/vurdering falt valget på en Microkontroller, dette fordi den kan programmeres til å gjøre neste hva som helst bare man får det til :) Etter litt surfing på nettet, diverse forum og en liten prat med elektronikk-gutta på skolen fant jeg ut at en Atmel ATMega16 microkontroller var akkurat det jeg trengte. Denne microkontrolleren har 4 8-bits porter, 3 uavhengige timere(to 8 bit og en 16 bit), mulighet for 8 innganger med ADC (analog til digital converter), 4 PWM (pulse with modulation) hardware kanaler, 16KB flashminne, m.m. Dette var en AVR-kontroller, noe som jeg var helt ukjent med. Jeg har noe erfaring fra programmering av PIC-kontrollere fra tidligere skoler, men dette hadde helt gått i glemmeboken. Etter litt forsking med AVR Studio og assembler programmering fant jeg fort ut av at dette var litt å sette seg inn i. Jeg skrev noen programmer i assembler, men fant fort ut at dette kunne bli vanskelig med større prosjekter (koder). Jeg tenkte da å prøve å programmere microkontrolleren med en Linux-basert GCC (C++ compiler) for Atmel AVR. Valget falt da på WinAVR programmeringspakken. Dette er en pakke med flere programmer, men til nå har jeg kun benyttet meg av Programmers Notepad programmet. Dette er en liten Notepad med en link til GCC compileren slik at du kan skrive programmet og kompilere det i samme programmet. Da jeg har noe erfaring fra C++ programmering fra tidligere var ikke dette så vanskelig å sette seg inn i. Jeg fikk låne en bok om C-programmering av Atmel AVR, men denne var skrevet for en annen C-compilator slik at eksempelkodene og referansene til "#defines" ikke stemte overens. "#defines er linker som du lager i et c-program som oversettes av compilatoren til verdier som microkontrolleren (kjøremiljøet) forstår". Jeg fikk også skaffet meg et LCD-display som jeg skulle programmere til å vise status på viftestyringen.

 

 

 

Etterhvert som jeg fikk skrevet flere eksempel-programmer og småe programsnutter begynte jeg å sette sammen hoveprogrammet som skulle kjøre på AVR'n.

 

 

 

Dette ble det ferdige oppsettet på fordeling av porter og deres tilhørighet :

 

- 4 innganger for temperatursensorer (NTC-motstander)

 

- 6 utganger for styring av vifter med PWM

 

- 7 utganger for styring av display (2x16 punkter)

 

- 2 porter for tilkobling av TX og RX for kommunikasjon med PC

 

- diverse knapper og statusLED tilkoblinger.

 

 

 

Programmets virkemåte :

 

- lese status for ADC-inngangene

 

- styre PWM utgangene i forhold til verdiene på ADC-inngangene

 

- sende status til PC over UART(seriell)

 

- sende status til display og displayet skulle virke slik at det kunne vise flere verdier, f.eks spenningsnivåer, temperaturer, RPM på vifter, info, etc.

 

- automatisk skifte mellom de forskjellige modusene displayet har med jevne mellomrom

 

- sjekke brytere for forandring av programmets kjøremåte

 

- programmet skulle ha 3 moduser for viftestyring, Quiet - Normal - Turbo

 

- programmet skal ha mulighet for å skru av den automatiske viftestyringen og kjøre alle viftene på 100%

 

 

 

Etter mangfoldige timer med c-programmering, prøving og feiling begynte programmet å ta form. Jeg hadde fått displayet til å virke, ADC-inngangene leste verdier fra NTC-mostandene og PWM-utgangene ble styrt av ADC-inngangene. AVR'en sender også inneholdet i diverse variabler som skal oppfanges av PC'n. Det som nå var igjen var å få programmet til åforandre kjøremåte i forhold til brukerens valg. Her er en oversikt over valg som brukeren skal kunne velge mens programmet kjører. Displayet skulle også fungere slik at når noe ble slått av eller på, skulle det poppe opp en status for valget i et halvt sekund på displayet. Dette ble programmert inn i programmet og fungerer utmerket :)

 

SWx = switch(x)

 

SW1: Bytte modus på displayet, dvs. forhåndsstilte skjermer som skal vises.

 

SW2: Slå av/på autoswitching av displayet. (hvis kun en modus vil vises over lengere tid kan den automatiske byttingen av verdier som vises på displayet slås av eller på ved hjelp av denne knappen)

 

SW3: Slå av/på den automatiske viftestyringen

 

SW4: Forandre på modusene viftene blir styrt på, Quiet - Normal - Turbo

 

RESET: Knapp for resetting av AVR.

 

 

 

Planlagte knapper:

 

SW5: Velgerknapp for PWM-utgang ved manuell styring av vifter.

 

SW6: Justere viftehastighet OPP ved manuell styring av vifter.

 

SW7: Justere viftehastighet NED ved manuell styring av vifter.

 

 

 

Gjenstående ting å gjøre med avr/elektronikk :

 

- Tegne printkort for å sende til Elprint for å få laget printkortet

 

- Få bestilt alle komponenter fra ELFA etc.

 

- Fikse en liten bug i programmet som gjør at AVR'n henger hvis den ikke blir resatt etter powerup.

 

- få testet PWM-utgangene med vifter og spenning fra PC (+12v) (har ikke fått gjort dette grunnet mangel av komponenter)

 

- lage boks med knapper til display

 

- testing etc.

 

 

 

Programmering av program i Java2 for å overvåke viftestyringen med PC.

 

Jeg hadde fra begynnelsen planlagt å lage viftestyringen slik at jeg kunne overvåke den fra pc'n. Jeg var ikke helt sikker på hvordan dette skulle fungere, men begynte med godt mot :) Jeg kan noe av programmeringsspråkene C++ og Java2 og måtte vurdere hvem av disse jeg skulle bruke. Valget falt på Java2. Jeg skrev et program som skulle snappe opp alt som kom inn på COM-porten og lagre det i variabler i java-programmet. Det ble skrevet et grafisk grensesnitt på programmet slik at det skulle bli mulig å følge med på hva som skjedde. Etter noe tukling ble programmet nogenlunde fungerende. Det er kun èn liten BUG, den skulle ikke være så vanskelig å få has på, men da jeg kan ikke javax.comm pakken bra nok, klarer jeg ikke å finne ut hva som genererer feilen. (Noen som kan "javax.comm" ???? mail meg!).

 

 

 

Planlagte oppgraderinger:

 

- Kunne styre microkontrolleren (viftestyringen) fra PC.

 

- Større display slik at mer informasjon får plass om gangen

 

- En ekstern eeprom slik at brukeren skal kunne lage sin egen kurve for automatisk justering av vifter og at det ikke slettes ved strømbrudd.

 

 

 

Noen bilder fra prosjektet:

 

mcu1_resize.JPG

 

mcu2_resize.JPG

 

mcu3_resize.JPG

Min "ryddige" arbeidspult :)

 

DSCF0032_resize.JPG

Oversikt over kurver for styring

 

fansy_speed_crop_resize.jpg

FanSY Speed v1.0

 

adc_refrence_crop_resize.jpg

ADC-referanse på 10bit oppløsning

 

adc_volt_crop_resize.jpg

Spenning på ADC-inngangene

 

copyright_crop_resize.jpg

Copyright

 

rpm_crop_resize.jpg

RPM på vifter

 

auto_fancontrol_enabled_crop_resize.jpg

Når SW3 trykkes vises denne i 0,5 sek

 

auto_fancontrol_disabled_crop_resize.jpg

Når SW3 trykkes en gang til vises denne i 0,5 sek

 

auto_sw_enabled_crop_resize.jpg

Når SW2 trykkes vises denne i 0,5 sek

 

auto_sw_disabled_crop_resize.jpg

Når SW2 trykkes en gang til vises denne i 0,5 sek

 

quiet_crop_resize.jpg

Denne vises i 0,5sek når SW4 trykkes for å forandre modus

 

normal_crop_resize.jpg

Denne vises i 0,5sek når SW4 trykkes for å forandre modus

 

turbo_crop_resize.jpg

Denne vises i 0,5sek når SW4 trykkes for å forandre modus

 

java_prog.jpg

Foreløping java-program med fiktive verdier

 

Oppdateringer kommer etterhvert som ting skjer :)

 

Noen som vil sponse meg med display er det bare å ta kontakt! :thumbup:

 

Tor Martin Slåen.

 

[email protected]

Lenke til kommentar
Videoannonse
Annonse
du står på! bra det. (har jo nesten tatt igjen meg...)

 

får vell begynne med programmeringen jeg også snart...

Hei! Jeg trodde du var ferdig med all programmering jeg :) Har du fått til Java programmet enda? Hvis du har begynt?

 

 

Send en mail til hammar.no, de sponser deg kanskje. Eller vendur.no de sponser garantert. Men, jeg vet ikke om vendur har rett type display...

 

Vet ikke hvordan det displayet fra hammar.no er, har sett på det, men er ikke sikker på hvordan teknologi de bruker på kontrollerkretsen. Kan hende jeg må skrive om hele programmet hvis det er forskjellig fra det jeg bruker. Jeg hadde håpet på å finne et som bruker samme kontrollerkrets, men bare har flere linjer, skal finnes. Det displayet som jeg bruker har en 44780 kontroller-krets.

 

Edit:

 

Sjekka hammar.no nå. Displayet de har bruker faktisk en 44780 kontrollerkrets, men denne ser ut til å ha kun 8bits styring, den jeg bruker nå har 4-bits styring. Hvis jeg skulle brukt dette displayet ville det resultert i at jeg måtte skrevet om hele rutinen for kontroll av display... Den er lang.... :hmm:

 

Sygard

Endret av sygard
Lenke til kommentar

har ikke gjort så mye i javaprogrammet enda, men har fått til å sende og motta data (mener jeg å huske), men har ikke laga noe rutine for å behandle mottatt data...

 

må sette meg ned og planlegge hvordan data skal sendes over mellom PC og krets, tenker å bygge det opp i pakker av forskjellige typer slik at det blir enkelt å avgjøre hva som skal gjøres med dataene.

Lenke til kommentar
har ikke gjort så mye i javaprogrammet enda, men har fått til å sende og motta data (mener jeg å huske), men har ikke laga noe rutine for å behandle mottatt data...

 

må sette meg ned og planlegge hvordan data skal sendes over mellom PC og krets, tenker å bygge det opp i pakker av forskjellige typer slik at det blir enkelt å avgjøre hva som skal gjøres med dataene.

Hei!

 

Jeg kjører en test i javaprogrammet på den første Byten som kommer inn, en sending fra microkontrolleren innholder 8bytes (char), Den første har jeg laget slik at den angir hvilken verdi som kommer som de 7 siste. Dette har jeg gjort ved alfabetet, A=ADC0, B=ADC1 o.s.v. En sending fra avr'n kan da se slik ut: "A243 " Det er viktig å fylle de ubrukte plassene med "space/mellomrom" ellers vil neste sending fra avr'n begynne rett etter 3 i eksempelet, slik: "A243B200" Dette blir da vanskeligere å teste på... Å trimme bort 'A' 'B' o.s.v. og tomrommene i overføringen er fort gjort når du først får det inn i java programmet :) Si ifra hvis du opplever mye tull med javax.comm pakka da, jeg er ikke helt enig med den til tider...

 

Det er vel en grunn til at Sun skriver dette i en eksempelkode:

*/

* This software is not designed or intended for use in on-line control

* of aircraft, air traffic, aircraft navigation or aircraft

* communications; or in the design, construction, operation or

* maintenance of any nuclear facility. Licensee represents and

* warrants that it will not use or redistribute the Software for such

* purposes.

*/

 

:!:

 

Sygard

Lenke til kommentar

Oppdatering 23/4-05:

 

- Knappene for å justere viftehastighet manuelt er lagt til i programmet og kretsskjemaet

 

- Har tegnet kretsskjema og layout for kortene

 

main_card.jpg

 

main_board.jpg

 

main_card_schematic.jpg

 

lcd_card.jpg

 

lcd_board.jpg

 

lcd_card_schematic.jpg

 

Jeg har ikke laget kortene med full GND-overflate, hvordan gjør man det? Er det gjort i en håndvending nå i ettertid eller må alt tegnes å legges på nytt?

 

Hvis noen ser noen feil eller lignende i kretsskjemaet, vær så snill å si ifra :thumbup:

 

Sygard

 

Sjekk også Min hjemmeside!

Lenke til kommentar

første jeg ser som er feil er at du har brukt feil symbol for transistoren MTD20N03HDL, men den ser ut til å være koblet rett på printkortet da, så det er vell ikke så farlig...

 

du har heller ikke noe XTAL krystall, det er jo ikke nødvendig, bruker du en ekstern på f.eks. 14745600 Hz kan du bruke UART (RS232) på alle hastigheter uten feil, ellers kan det hende at du må bruke bestemte hastigheter på UART for ikke å få feil i overføring av data, ikke noe problem det heller da det ikke er mye data som skal overføres og hastighet sannsynligvis ikke vil være noe problem.

 

du har heller ikke noen ISP, du kan jo selvfølgelig programmere AVRen før du setter den på plass og ta den ut og programmere den på nytt (så du hadde en STK500), men jeg foretrekker å ha en ISP på kretsen, så slipper en å ta kretsen fram og tilbake hele tiden. (vel jeg har SMD som er loddet fast, så jeg har ikke noe valg)

 

btw: vet du om bootloader funker over UART? hvis den gjør det så er jo ikke ISP helt nødvendig så lenge bootloaderen virker...

 

GND plan, les her: http://www.interq.or.jp/japan/se-inoue/e_eagle32.htm#1

veldig enkelt..

 

har du tenkt å lage kretskortet selv eller få det laget ordentlig? med tanke på viasene dine vil jeg anbefale å få det laget ordentlig med vias, ellers vil du få problemer med loddingen trur jeg (vanskelig å lodde under kretser og slikt...)

 

ellers så ser det nå greit ut, men har ikke studert det så nøye da, så det kan jo fremdeles hende at det er feil der...

Lenke til kommentar
første jeg ser som er feil er at du har brukt feil symbol for transistoren MTD20N03HDL, men den ser ut til å være koblet rett på printkortet da, så det er vell ikke så farlig...

 

du har heller ikke noe XTAL krystall, det er jo ikke nødvendig, bruker du en ekstern på  f.eks. 14745600 Hz kan du bruke UART (RS232) på alle hastigheter uten feil, ellers kan det hende at du må bruke bestemte hastigheter på UART for ikke å få feil i overføring av data, ikke noe problem det heller da det ikke er mye data som skal overføres og hastighet sannsynligvis ikke vil være noe problem.

 

du har heller ikke noen ISP, du kan jo selvfølgelig programmere AVRen før du setter den på plass og ta den ut og programmere den på nytt (så du hadde en STK500), men jeg foretrekker å ha en ISP på kretsen, så slipper en å ta kretsen fram og tilbake hele tiden. (vel jeg har SMD som er loddet fast, så jeg har ikke noe valg)

 

btw: vet du om bootloader funker over UART? hvis den gjør det så er jo ikke ISP helt nødvendig så lenge bootloaderen virker...

 

GND plan, les her: http://www.interq.or.jp/japan/se-inoue/e_eagle32.htm#1

veldig enkelt..

 

har du tenkt å lage kretskortet selv eller få det laget ordentlig? med tanke på viasene dine vil jeg anbefale å få det laget ordentlig med vias, ellers vil du få problemer med loddingen trur jeg (vanskelig å lodde under kretser og slikt...)

 

ellers så ser det nå greit ut, men har ikke studert det så nøye da, så det kan jo fremdeles hende at det er feil der...

Hei!

 

Jeg fikk til jordplan på kretskortene, latterlig enkelt når man bare vet hvordan det skal gjøres :) Takk for linken! Jeg skal ikke bruke et krystall, jeg bruker den innebygde oscillatoren i avr'n. Kjører den på 8MHz, fungerer ypperlig ved 19200bps, trenger ikke noe mer enn det.

 

Hva trenger man for å få ISP? Hvordan brukes det?

 

Når det gjelder kretskortet så blir det nok så jeg skal få Elprint til å lage det. Jeg har ingen muligheter til å få laget det selv heller. Tror kanskje jeg får ordnet med noe rabatt, kjenner en som kjenner en som kjenner en... :) Hva er feil med symbolet for transistoren? Den er overflatemontert ja? Har ikke fått bestilt fra ELFA enda, så jeg er ikke helt sikker på hvordan den ser ut.

 

Hvilken transistor brukte du i Eagle? navnet på komponenten?

 

Om bootloader fungerer over UART vet jeg ikke sikkert, men jeg har alltid trodd at dette var poenget med bootloader, altså programmering over UART. :)

 

 

Edit:

Forresten, er det en nødvendighet å ha en resistor mellom gate og GND på mosfetene? Jeg ser du har det på kretsskjemaet ditt.

 

Jeg leste litt om ISP, det gjør ingen ting om jeg bruker portene til andre ting i programmet ? Jeg kan bare koble det jeg trenger til et koblingspunkt og bruke ISP fra der?

 

Sygard

Endret av sygard
Lenke til kommentar

feilen med symbolet er at pila på midten står feil vei, og at zenerdioden står feil vei. fant ikke noe i eagle som jeg syntes passet (rett symbol og pakke) så jeg tegnet den selv...

og den er overflatemontert ja

 

motstanden mellom gate og GND er ikke nødvendig.

 

ser du i kretsskjemaet mitt så ser du PROG kontakten, det er ISPen min, du kan bruke pinnene til andre ting i programmet også. når du kobler til kabelen for å programmere blir reset pinnen koblet til jord slik at kretsen kan programmeres. kjekt å ha når bootloaderen ikke funker. trur STK500 har kabel som kan kobles til ISP, men er ikke helt sikker...

Lenke til kommentar
feilen med symbolet er at pila på midten står feil vei, og at zenerdioden står feil vei. fant ikke noe i eagle som jeg syntes passet (rett symbol og pakke) så jeg tegnet den selv...

og den er overflatemontert ja

 

motstanden mellom gate og GND er ikke nødvendig.

 

ser du i kretsskjemaet mitt så ser du PROG kontakten, det er ISPen min, du kan bruke pinnene til andre ting i programmet også. når du kobler til kabelen for å programmere blir reset pinnen koblet til jord slik at kretsen kan programmeres. kjekt å ha når bootloaderen ikke funker. trur STK500 har kabel som kan kobles til ISP, men er ikke helt sikker...

Sjekka databladet til mosfeten hos elfa, pinnene stemmer om hverandre, så det burde gå bra å bare bruke de som jeg har brukt.

 

Hva kobler du til prog-kontakten, det er vel ikke bare å plugge den i en rs232 da denne ikke har helt riktige spenninger... Må du lage deg et eget kretskort med noen komponenter som skal kobles mellom PC og AVR?

 

Har du fått testet prosjektet ditt enda eller?

 

Sygard

Lenke til kommentar

jeg bruker denne til å programmere, kretsen øverst på side 7:

http://www.avr-asm-tutorial.net/beginner_en.pdf

 

bygde den på et kretskort, og den tar spenning fra kretsen den kobles til. så trengs ikke no mer enn det som er der.

 

den er stk200 kompatibel mener jeg.

 

men så litt på manualen til stk500, og på den er det en ISP6PIN

den tilsvarer den jeg har, men stk200 bruker 10Pin (4 av de er jord).

på 6PINen har de bare fjernet det som ikke trengs, ellers er det likt mener jeg. så hvis du lager en slik 6PIN-kontakt på din krets så bør det funke å koble stk500en til kretsen din for å programmere den..

 

står litt om det på side 6 i den PDFen jeg lika til...

 

har så vidt begynt å programmere på min, men testet med å sette alle portene høy og målte spenningen på forskjellige steder for å se om den funka, gjorde det og viftene surret rundt når jeg kobla de til.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...