Forfatterarkiv: kjell

Mer om tastatur

Vel, bilder sier mer enn ord.

Jeg nøyer mege med å montere 3 taster i denne omgang. Kun for å starte på software og kunne teste. Det er to store blundere på dette kretskortet.

  • Av en eller annen grunn innbilte jeg meg at fottprint til RJ45 var symmetrisk og at den kunne monteres fra begge sider. Det er den jo åpenbart ikke, og jeg aner ikke hvordan jeg kunne tro det. Grunnen til at jeg ønsket det var for å kunne bruke dette kortet til både høyre og venstre bare ved å montere kontakten på den respektive oversiden. Dette har jeg fått til å fungere med USB-kontakten, men for RJ45 ble jeg tydeligvis blind.
  • Jeg tegnet pinout på krystallet feil. Også en tabbe jeg ikke helt skjønner at jeg kunne gjøre. Jeg har brukt slike krystaller mange ganger før, og vet veldig godt hvordan de skal kobles. Vel det kunne fikses med litt kreativ lodding for å få i gang testingen (se bildet under)

Det må nok bli en revisjon av PCB, men først skal jeg skrive programvare.

Hva skjer?

Tastaturet ligger foran meg, men virker ikke ennå. Krystalloscillatoren snurrer ikke, og jeg mistenker at jeg ved en feiltakelse plukket en krystall med litt for stor ESR. Jeg har litt liv via debug interface, men ikke USB. Og jeg får den ikke til å kjøre program.

Ellers har jeg gått all-in på hjemmenettverket. Nabolaget hadde blitt fylt opp med Wifi. To av naboene ga kraftigere signal enn mitt Wifi når jeg sto ved siden av min egen ruter. Derfor har jeg lagt opp kablet nettverk til alle essensielle punkter i huset, og med 1Gb fiber inn til huset blir jo det strålende.

Jeg har også oppgradert resten av infrastrukturen. Kjøpte en Intel N100 PC med 4 ethernet porter fra AliExpress, og har satt opp den som ruter og brannmur. Hele greia er virtualisert på ProxMox, og i tillegg til OpnSense brannmuren så kjører jeg en Caddy web server der, en Nextcloud server, en Wireguard VPN og Adguard HOME. Javnt over er jeg veldig fornøyd med oppsettet. Disse web-sidene mine er jo knapt besøkt, så jeg kan fint spare litt penger på web-hotell. NextCloud gir meg mer kontroll på noen av sky-dataene mine (og jeg sparer litt penger på et par sync tjenester). Adguard Home er fantastisk. Mesteparten av reklame på web-sider forsvant som dugg for solen, og i tillegg kan jeg legge inn alle mulige andre regler også. Ok ikke minst, WireGuard. Jeg har satt opp telefonen min til å alltid koble via VPN hjem. På den måten får jeg glede av Ad-guard på den også. I det store og hele er jeg veldig fornøyd med oppsettet. Det blir sikkert noen endringer her og der, men det er jo litt av morroa da.

Nytt tastatur

Det finnes en drøss av ferdige design hvis man vil bygge sitt eget tastatur. Jeg har en stund hatt lyst til å prøve et minimalistisk delt tastatur. Valget falt på en variant med 36 taster totalt. Men siden jeg er den jeg er, så kunne jeg ikke gå for en enkel løsning. Litt av greia er at jeg ikke har designet noen PCB på evigheter, så i stede for å gå for standardløsningen med å kjøpe en av de utallige mikrokontrollerkortene, og så kun designe selve tastatur-PCBen, så gikk jeg for en fullintegrert løsning, Dvs alt på en PCB (eller to da, siden det er en høyre og en venstre halvdel).

Jeg valgte RP2040 som kontroller siden den er grisebillig, og veldig kraftig. Den er også ganske enkel å designe med, men litt krevende å montere. De to halvdelene kobles sammen med en vanlig ethernet kabel med RJ45 i hver ende. Alle andre som driver med dette bruker 4 pol 3.5mm jack av en eller annen grunn. Den ser sikkert fin ut, men det er betydlig vanskeligere å kjøpe passende kabel, og hvis man kobler ut eller inn når det er power på systemet risikerer man å kortslutte et eller annet. Kortet har jeg designet slik at det kan brukes både som høyre og venstre, riktignok med komponentene på undersiden på når den er en venstreside. Men både RJ45 og USB kontakten vil sitte på oversiden uansett. Begge her hullmonterte. USB-C er veldig symmetrisk, med unntak av DP og DM, så det eneste jeg behøvde å gjøre for å tilpasse den for motsatt side var å lage alternative footprint for 27Ohm seriemotstandene slik at disse signalene ble krysset. RJ 45 kontakten har 8 pinner, og det var lett å lage den symmetrisk også. Jeg har lagt opp til at kommunikasjonen mellom kortene er vha UART, så når RJ45 bli montert på motsatt side blir RX og TX byttet, og dermed blir disse signalene koblet riktig selv med en ukrysset Ethernet-kabel. Jeg har også lagt ut en solder-bead jumper på hver side som forteller kontrolleren om den er en høyre eller venstre. Til slutt kan det nevnes at hver tast er koblet direkte til IO-pinne. Dvs det er ikke behov for dioder og slikt.

Jeg gikk for den rimeligste pcb-en jeg kunne finne, kun to lag og ikke noen plugging av via. Ikke spesielt vrient å legge ut siden jeg ikke hadde noen restriksjoner å snakke om, men jeg kunne ikke legge via i pad under RP2040 og flash. Det vil antakelig si at jeg ikke får optimal kjøling, men så har jeg heller ikke behøv for å kjøre dette systemet på spesiell høy klokkefrekvens.

Kortet ble produsert av https://jlcpcb.com. 5 stk for ca 10USD pluss frakt og MVA. Totalt endte jeg på 40USD, men fikk trekt fra 10 pga en velkomst-rabatt. Totalt ble det rett over 300kr ferdig levert inkl MVA. Og best av alt, jeg sendte inn gerberfilene på torsdag i forrige uke, og fikk levert kortene på tirsdag. Dvs 5 dager. Fantastisk.

Designet ble gjort i Kicad8. Første gang jeg bruker dette på evigheter, og jeg må si at det har skjedd store ting. Det er jo blitt fantastisk bra, og jeg ser ikke noen grunn til å bruke noe annet til private prosjekter heretter.

Det som står igjen nå er å skrive litt firmware. Jeg tipper det er ganske uproblematisk å tilpasse en av de ferdig konfigurerbare løsningene der ute, men jeg har lyst til å prøve å skrive noe selv. Dette er jo aller mest et treningsprosjekt for meg. Så får jeg heller gå for en ferdigløsning hvis jeg blir lei. Ja, så må jeg jo bestykke kortet, men det tar jeg etter hvert. Må kjøpe litt komponenter først. Tipper jeg gjør det etter ferien.

Hvodan bruke Github Copilot

Nå har jeg brukt Github Copilot et par måneder. Det er sikkert mye man kan si om dette, men jeg er overbevist om at det kan være et ganske bra verktøy. Hvordan bruker jeg det? Ikke som man vanligvis skulle tro. Det vil si, jeg bruker i liten grad code-completion eller kodegenerering. Derimot bruker jeg den som en samtalepartner for å lære ting. Enten spørre hvordan konkret kode fungerer, eller spørre om konsepter. Og den leverer overraskende gode svar. Ofte bedre enn det jeg finner i bøker. Og hvis noe er uklart, så kan man be om oppklaring eller mer detaljer. Eller kanskje et eksempel som viser hvordan det fungerer.

neovim

Jeg vet ikke helt hvorfor, men det er noe med terminalbaserte verktøy som appelerer til meg.

Da jeg med ujevne mellomrom trenger å editere en tekstfil på et system som ikke har noe grafisk grensesnitt er det ganske lurt å kunne bruke en editor som finnes over alt. VI er en sånn en. Men hvem har vel ikke startet VI, for å så måtte søke på google hvordan man skal stenge den ned igjen. Vel, nå bestemte jeg meg for å lære dette litt bedre. Da kom jeg ganske raskt borti https://neovim.io/. En mer moderne versjon av VIM, som igjen er en forbedret VI. Neovim er jo strålende. For en som har en dunkel fortid med Emacs, så er jo ikke dette så skremmende. Det er riktignok ganske mye å sette seg inn i, og konfigurasjonsmulighetene er praktisk talt uendelig, men jeg liker brukeropplevelsen veldig godt. For å forenkle oppsettet, så startet jeg med Astronvim (https://astronvim.com/). Dette er en av mange prefabrikerte oppsett man kan starte med å bygge sine egne tilpasninger fra. Når det er satt opp bra, så er det nesten ikke til å legge merke til at det utelukkende er tekstbasert. Jeg har brukt VSCode i en årrekke, og den er slett ikke ille, men jeg synes ikke den er bra. Bedre enn Eclipse og sånt som jeg brukte før det igjen, men fremdeles ikke fantastisk. Superkraften til Neovim er egentlig alle de fantastiske tastaturkommandoene. Spesielt de man bruker for å flytte seg rundt i teksten, velge tekst og editere den. I tillegg har den et veldig godt plugin-system med LUA-baserte config filer slik at man enkelt kan duplisere oppsettet på en annen PC. Selv har jeg lagt oppsettet mitt inn på Github, så kan jeg plukke det ned hvor som helst.

Hvis du leser dette, og har lyst til å prøve, så vær klar over et par ting.

  • Det er ganske dårlig dokumentasjon på mye av dette. Eller skal vi si, forvirrende. Siden det er så mange måter å gjøre samme ting på, så må man bruke en del tid på å skjønne prinsippene før man klarer å gjøre sine egne tilpasninger.
  • Hvis man søker etter hjelp, så lander man ofte på StackOverflow, der en eller annen stakkar blir æreskjelt for å ikke google det først. Ironisk nok er det disse treffene som dukker opp øverst når du søker på google.
  • Med Astronvim så er det mulig å sette opp plugins vha plugin-managere. Dette er vel og bra, men jeg klarer ikke å finne ut hvordan disse endringene blir lagret, og da blir det også vrient å sjekke det inn på Github. I stede har jeg editert lua-filene manuelt.
  • Vær forberedt på en bratt læringskurve. Her må du faktisk ta deg bryet med å lære en haug med kommandoer. Og glem musa. Det er tastaturet som redder dagen.

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
.
.