Kategoriarkiv: Info

Lære meg Rust

Evigheter siden jeg skrev noe her nå. Må begynne å bruke denne siden litt igjen. Det er jo tross alt noen prosjekter som jeg drar i gang.

Uansett. Jobber med å lære meg programmeringsspråket Rust. Det er kjempegøy. Jeg har jo lusket meg gjennom et knippe programmeringsspråk gjennom tidene. Noen er morsomme, andre ikke. Jeg syntes C ikke var så ille, men C++ hater jeg. En gang i tiden laget jeg en ganske stor applikasjon i Perl. Tror det var oppe i 5-6000 linjer med kode. På den tiden hadde ikke Python fått skikkelig fotfeste. Det var ikke helt åpenbart at det kom til å vinne, så jeg valgte å skrive om koden i Ruby. Jeg elsket Ruby, men det er jo ikke noe man sier for høyt nå til dags. Python er greit, men jeg liker det ikke spesielt. Men Rust er gøy.

Vel. Jeg har løst et par oppgaver i Advent of Code 23 med Rust nå. I tillegg driver jeg å koder på en terminal UI basert omvendt polsk notasjon kalkulator. Også har jeg laget en ganske sprek primtall-algoritme.


use std::time::Instant;

fn main() {
    let start = Instant::now();

    //const MAX_NUMBER: usize = 4096;
    const MAX_NUMBER: usize = 2_usize.pow(32);
    let size_of_word: usize = usize::BITS as usize;

    let mut primes: Vec<usize> = vec![0; MAX_NUMBER / (2 * size_of_word)];
    primes[0] = 1;

    //Calculate all the odd number non-primes
    let mut p: usize = 3;
    while p * p < MAX_NUMBER {
        if (primes[p >> 7] >> ((p >> 1) & 0x3F)) & 1 == 0 {
            let mut i = p * p;
            while i < MAX_NUMBER {
                primes[i >> 7] |= 1 << ((i >> 1) & 0x3F);
                i += p + p;
            }
        }
        p += 2;
    }

    let duration1 = Instant::now() - start;

    // // collect all the primes in a vector
    // let mut prime_list: Vec<usize> = Vec::new();
    // prime_list.push(2);
    // for (index, element) in primes.iter().enumerate() {
    //     let vi_num = index*128;
    //     for bit in 0..=63 {
    //         if (element >> bit) & 1 == 0 {
    //             prime_list.push(vi_num + (2 * bit + 1));
    //         }
    //     }
    // }

       // count all the primes
       let mut prime_count: usize = 1;
       for element in primes.iter() {
           for bit in 0..=63 {
               if (element >> bit) & 1 == 0 {
                  prime_count += 1;
               }
           }
       }

    let duration2 = Instant::now() - start;

    println!("Calc duration:  {} ms", duration1.as_millis());
    println!("Total duration:  {} ms", duration2.as_millis());
    println!("Number of primes:   {}", prime_count);
}

Denne finner alle primtall i en U32 integer på ca 12 sekunder på min maskin (kun en tråd). Hvis jeg skal legge alle de tallene inn i en vektor (koden som er komentert ut), så tar det 20-30sekunder til da den må allokere en del minne. Skrive den til disk har jeg ikke prøvd, men det tar nå den tiden det tar.

Trykktesting

Da fikk jeg satt trykk på formen. Fant ikke noen bra ballonger, men fikk såvidt testet likevel.

Fikk trykket opp til 4 bar før første ballongen sprakk. De andre sprakk før 2 bar. Nå er jeg ikke sikker på hvilket trykk jeg skal bruke, men jeg vil ha konsistent suksess med minst 1 bar over det jeg skal holde under støp før jeg gidder å blande noe epoxy.

Nippelen var svært så vellykket. Smørte på litt «High vacuum grease» så tettet den ballongen som bare det. Ballongene sprakk i tuppen. Antakelig ble de hengende litt i formen når de skulle dytte seg fram. Mulig jeg må endre pod-en litt og gjøre spissen rundere.

Støpe DLG pod

Etter en lang dvale har jeg endelig kommet meg litt i gang igjen. Denne gangen med nye og oppdaterte planer for en 1m DLG. Nå har jeg nettopp laget en støpeform for pod (framkropp). Dette er negativ form frest ut i Prolab65, og gjort klar for trykksetting med ballong. Dreiet ut en messingnippel for tilkobling av trykkluft. Skal kjøpe ballong og teste den under trykk i dag.

Dlg prototype

Skal skrive mer om denne etter hvert, men kort fortalt har jeg gått i gang med en dlg på 120cm vingespenn. Vingene er nesten ferdig.

Konstruksjonen er følgende:

  • Skumkjerne til vingene er laget av Jackofoam 400. Kuttet for hånd med varmetråd på buesag. Veier totalt 46g.
  • Vingene er trukket med 40g kraftpapir kjøpt på gigantrull fra Nor Engros for nesten ingen penger. Papiret veide tørt ca 12-13g.
  • Kraftpapiret er festet vått med vanlig snekkerlim (PVA) uttynnet i vann. Totalvekt på vingen etter at den hadde tørket igjen var ca 85g.
  • Lakkerte den med et (litt for tykt) strøk med vanlig hobbylakk. Burde tatt flere tynnere strøk, men dette er bare prototype. La på seg nok et 2-3g
  • Balanserorene ble så festet med Blenderm teip. Det var bra saker.
  • Har skåret ut plass til et par 5g servoer fra Dualsky

Og det er omtrent så langt jeg har kommet hittil. Neste punkt på agendaen blir å montere sammen vingehalvdelene og koble servoene. Derette skal jeg lage kropp av 2-3mm balsa for framkroppen, og et 6mm CF rør til halebom. Side- og høyderor lages av 2mm balsa.

Z-akse og VFD-styring

Z-aksen lever! Fikk dreid den siste delen, montert og testet Z-aksen. Den bare fungerer rett og slett. Veldig lite støy og meget fin gange på denne kombinasjonen av motor og steppermotorstyring. Steppermotordriveren er av en annen type enn de for X og Y aksen. Har tidligere også benyttet den på X-aksen og der fungerer den bedre enn den som er til X-aksen.

Så var det å få styring av VFDen opp og kjøre, ingen stor sak, men det passa fint å få dette på plass nå. Laga et interfacekort med noen optokoblere og en liten PWM->10V overgang. Masse trøbbe pga en idiotfeil i .hal fila (konfigurasjon av alle inn og utgangspinner). Fikk knota dette til så ser det meste ut til å fungere. Har planer om å utvide med en pickup på turtall. Da kan jeg har en PID som justerer for å holde konstant turtall uansett belastning.

Men denne spindelen er alt for treg til å frese endel av materialene jeg vil frese. Dvs skum og Alu med små freser. Så det blir nok å kjøpe en spindel fra Ebay når det nærmer seg jul. Enn så lenge så regner jeg med å klare meg med å enten kjøre litt sakte, eller å montere en liten brakett for dremelen.