Forfatterarkiv: kjell

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.

Røykdetektor på plass

12V røykdetektor med rele. Denne lager ikke lyd i det hele tatt, men når den slår ut flipper releet. Dette har jeg koblet inn i kretsen til kontaktoren slik at hele systemet slår seg av hvis det begynner å ryke. Det som er spennende er om jeg får mange falske positiver pga partikler fra smeltet plast. I så fall skal jeg koble på en liten vifte som trekker ut luft så det ikke kan akkumulerer seg over tid. En brann lager så mye røyk at det uansett vil slå ut.

Da er alt det viktige ferdig i det elektriske opplegget. Nå er der kun et par vifter jeg skal montere, men det haster ikke. Og nå bør den være ganske brannsikker også.

Også er det et panel til på baksiden som skal dekke over det elektriske. Av sikkerhetsmessige grunner.

Neste ferdig

Nå begynner det å likne på noe. Jeg har fått på alle paneler rundt om. Det eneste jeg ikke har satt på ennå er et panel på baksiden som skal dekke til det elektriske. Jeg har ikke helt bestemt meg for hvordan dette skal se ut.

Det største som har skjedd siden sist er at jeg har lagt inn et ekstra rele som styres av RaspberryPi. Dette releet blir aktivert som det siste som skjer ved en «shutdown». Det vil si at Linux kan stenge ned kontrollert, og så aktivere dette releet. Videre blir hovedkontaktoren styrt av dette releet, som når det aktiveres bryter kretsen til spolen på kontaktoren. Det medfører at spenningen til hele systemet kuttes. Nå har jeg også koblet om slik at 5V til RPi kuttes av kontaktoren. I tillegg har jeg koblet om knappen som skrur strømmen av slik at den går inn på en RPi GPIO pinne. Denne pinnen er satt opp slik at det sendes en shutdown kommando til Linux-kjernen når den aktiveres. Alt dette vil si at jeg kan stenge ned systemet trygt ved å trykke på knappen. Slipper problemer med at filsystemet blir korrupt eller noe slikt. Det vil også si at jeg kan stenge ned strømmen via web-grensesnittet, eller enda bedre, jeg kan legge inn en shutdown kommando i slutten av G-koden slik at maskinen skrur seg av når den er ferdig med et program.

Hva gjenstår?

  • Panel / dør som dekker det elektriske
  • Vifte som kjøler stepper-driverne
  • Vifte som trekker luft ut av kabinettet på toppen (saktegående som som blåser gjennom et HEPA filter)
  • Røykdetektor som er koblet inn i kretsen som kan stenge ned strømmen på hele maskinen.
  • EMO bryter som kutter alt, også spenning inn til kontaktoren.
  • Montere filament-sensor

Spaghetti

Så langt har jeg ikke et eneste print som har feilet, men så har jeg også bare brukt PLA. Forventer litt mer problemer når jeg går løs på mer utfordrende plast. Men, ganske nylig har Spaghetti Detective byttet navn til Obico, og så har de sluppet støtte for Klipper/Mainsail kontroller.

Obico er en sky-tjeneste som følger med på printet og kan avbryte det hvis den detekterer en feilprint. Man setter opp en videostrøm som viser print-bed. Serveren kjører en slags AI som analyserer videostrømmen og kan kontrollere printeren. Hvis den detekterer en feil, så pauser den printet, og sender et varsel. Dette koster litt penger hver måned, men hvis man ikke vil det, så er all software open source. Obico støtter installasjon på flere platformer med relativt beskjeden maskinvare. En bonus er at man får tilgang til både videostrøm, og enkle kontroller via app eller nettleser fra hvorsomhelst.