Kategoriarkiv: Info

RatOS 2

Det var åpenbart at jeg måtte oppgradere OS på printeren nå. Den versjonen jeg hadde ble ikke vedlikeholdt mer. Dette innebar en fullstendig reinstallering, noe som er sånn passe kjipt. Men, det gikk jo greit. Ikke alt for mange timer gått med. Jeg fikk jo samtidig ryddet opp litt i konfigurasjonen. Nå ser det ut som den printer omtrent som før. Bare noen smådetaljer som skal fikses, som adaptiv mesh.

Nå tygger den seg lykkelig gjennom en liten Benchy, så får vi se hvordan det blir.

En liten detalj jeg glemte ang. shutdown. Siden jeg har koblet RPi til et relé som kutter hoverdstrømmen til printeren når jeg skrur av, så kan jeg også få printeren til å skru seg av automatisk når den er ferdig med et print. Jeg legger da følgende macro inn i printer.cfg fila:

[gcode_macro SHUTDOWN]
variable_sd: 0
gcode:
  TURN_OFF_HEATERS
  {% set sd=printer["gcode_macro SHUTDOWN_VAR"].shutdown_at_end %}
  {% if sd== 1 %}
    TEMPERATURE_WAIT SENSOR=extruder MAXIMUM=50
    M118 Turn off when extruder is below 50C
    SHUTDOWN_NOW
  {% endif %}

[gcode_macro SHUTDOWN_NOW]
gcode:
  TURN_OFF_HEATERS
  M118 Shutdown now
  {action_call_remote_method("shutdown_machine")}

[gcode_macro REBOOT]
gcode:
  {action_call_remote_method("reboot_machine")}

[gcode_macro SHUTDOWN_VAR]
variable_shutdown_at_end: 1
gcode:
  {% if printer["gcode_macro SHUTDOWN_VAR"].shutdown_at_end==1 %}
    M118 Printer will auto shutdown when print is finished
  {% else %}
    M118 Printer will stay on when print is finished
  {% endif %}

[gcode_macro SHUTDOWN_SET]
gcode:
  SET_GCODE_VARIABLE MACRO=SHUTDOWN_VAR VARIABLE=shutdown_at_end VALUE=1

[gcode_macro SHUTDOWN_CLR]
gcode:
  SET_GCODE_VARIABLE MACRO=SHUTDOWN_VAR VARIABLE=shutdown_at_end VALUE=0

SHUTDOWN_NOW og REBOOT er jo åpenbare, de virker umiddelbart ved å sende signal til OS-et. Den som bare heter SHUTDOWN vil skru av printeren hvis SHUTDOWN_VAR er satt, men den venter til alt har kjølt seg ned først. SHUTDOWN_VAR er satt på i utgangspunktet, men kan skrus av og på med SHUTDOWN_CLR og SHUTDOWN_SET.

I slutten av alle g-code filene mine har jeg da satt inn kommandoen SHUTDOWN. Da vil printeren skru seg av når printet er ferdig. Hvis jeg ikke ønsker dette, så kjører jeg bare SHUTDOWN_CLR før printet er ferdig, så forblir den på.

Power på 3D printer

Litt så jeg husker det selv:

Jeg har koblet en av bryter inn på GPIO pinne 21 (Broadcom telling). Denne knappen setter i gang en shutdown slik at jeg kan skru av printeren med Linux noenlunde intakt. I tillegg har jeg en utgang som skrur av et relé når systemet er klar for å skru av. Disse pinnene blit satt opp i /boot/config.txt

.
.
dtoverlay=gpio-shutdown,gpio_pin=21
dtoverlay=gpio-poweroff,gpiopin=26
.
.

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.