Ir al contenido principal

Ralsina.Me — El sitio web de Roberto Alsina

Publicaciones sobre linux (publicaciones antiguas, página 22)

Raspicams

Cuan­do salían dos man­go­s, por di­ver­sos mo­ti­vos me com­pré unas cuan­tas Ras­pbe­rry Pi Ze­ro­s. De he­cho, ten­go sei­s, tres Ze­roW (con wi­fi) y trees Ze­ro 1.3 (sin wi­fi)

El pro­ble­ma es que los mo­ti­vos por los que las com­pré no son vá­li­dos (mi­cro­clus­ter edu­ca­ti­vo, una ze­ro no pue­de co­rrer co­mo no­do de nin­gún so­ft de clus­te­ring mo­der­no) así que te­nía que en­con­trar­les un uso.

Un día pa­vean­do en­contré mó­du­los de cá­ma­ra Ras­pbe­rry por una su­ma ra­zo­na­ble (mó­du­los 1.3, soy un ra­ta) y di­je "o­k, se­gu­ra­men­te pue­do ha­cer we­b­ca­ms!"

Bue­no, sí.

Pri­me­ro sim­ple­men­te ar­mé una "cá­ma­ra" pe­gan­do dis­tin­tas co­sas que te­nía a ma­no, y el re­sul­ta­do es in­te­re­san­te:

La ca­li­dad de ima­gen es me­jor que ca­si to­das las we­b­ca­ms que ten­go, con la ex­cep­ción de una Le­no­vo thi­nk­pad yo­ga bla­bla­bla, pe­ro eso es una no­te­book de 3000 dó­la­res, ES­PE­RO que la we­b­cam sea bue­na.

PE­RO, el án­gu­lo del cam­po de vi­sión es bas­tan­te an­gos­to, así que es com­pli­ca­do usar­lo co­mo we­b­cam pa­ra zoom o co­sas así, a me­nos que la ins­ta­les muy le­jo­s.

De to­das for­mas le hi­ce una car­ca­za me­jor de Thin­gi­ver­se, la aga­rré con un so­por­te de ce­lu­lar­fle­xi­ble, que a su vez en­gan­cha en un pie im­pre­so 3d pa­ra mi mo­ni­to­r... y que­dó lin­da.

Por otro la­do, tam­bién ne­ce­si­ta­ba cam­biar la we­b­cam ho­rren­da que te­nía co­nec­ta­da a Oc­to­prin­t.

Hay mu­chos tu­to­ria­le­s, to­dos ba­sa­dos en el mís­mo có­di­go pri­mi­ge­nio que ha si­do fo­rkea­do mil ve­ce­s. De­ci­dí fi­nal­men­te usar Sho­w­meWe­b­cam por­que:

  • Es fá­cil de ins­ta­lar
  • Mon­ta la SD­card en mo­do so­lo lec­tu­ra
  • Bootea en 6 se­gun­dos

Pun­tos ex­tra por ser con­fi­gu­ra­ble via puer­to se­rie!

Pe­ro­... na­da es fá­ci­l, nun­ca.

  1. No fun­cio­na con la dis­tro de oc­to­prin­t. Ni idea de por qué, pe­ro mj­pg_s­trea­mer se nie­ga a ver el dis­po­si­ti­vo.
  2. Ne­ce­si­ta más po­ten­cia de la que pue­de dar­le la ras­pbe­rry pi que ten­go con oc­to­print

So­lu­cio­nes:

  1. Reins­ta­lé oc­to­prin­t, aho­ra es una app en un ar­ch pa­ra AR­M, y reem­pla­cé mj­pg_s­trea­mer (que ni com­pi­la­ba) con us­trea­mer que an­da 10 pun­tos (u­na vez que le arre­glé un bug en un hea­de­r)
  2. Un se­gun­do ca­ble.

Tam­bién ob­via­men­te tu­ve que bus­car co­mo mon­tar la cá­ma­ra pa­ra que fil­me la im­pre­so­ra des­de un án­gu­lo ra­zo­na­ble, y mi ci­ru­ja in­terno fes­te­ja otra ba­ta­lla ga­na­da:

Y sí, fun­cio­na MU­CHO me­jor que la we­b­cam que te­nía an­tes. La re­so­lu­ción es 1080­p, 30­fp­s, y reac­cio­na mu­chí­si­mo me­jor a cam­bios en la ilu­mi­na­ción sin que­dar so­breex­pues­ta ni os­cu­ra.

Con­clu­sió­n: Pro­yec­to ter­mi­na­do, 9 pun­to­s.

So I built a ... laptop?

Introduction

There is a vin­tage com­put­er that has al­ways fas­ci­nat­ed me. It was one of the first prac­ti­cal porta­bles, the Tandy Mod­el 100.

It ran on a few AA bat­ter­ies and had around 20 hours of bat­tery life. Does your lap­top do that? No.

It's icon­ic in mul­ti­ple ways.

  • That wide, stumpy screen!
  • That pre-IB­M-PC key­board with the funky cur­sor keys which now looks like ... a al­most nor­mal 60%?

The Mod­el 100 was an in­stant hit with jour­nal­ist­s, who could use its in­te­grat­ed text ed­i­tor to write on the road and its mo­dem to send sto­ries to the pa­per.

On the oth­er hand that form fac­tor just does­n't ex­ist any­more. It did­n't even sur­vive long in fur­ther Tandy mod­el­s, be­cause new­er bet­ter screens had a more "nor­mal" as­pect ra­tio and the now-­s­tan­dard clamshell made more sense.

But since I loved it... why not try to build some­thing like it now, when we have much bet­ter tech­nol­o­gy? Well, I could­n't come up with any good rea­son­s.

Ex­cept that I had no com­po­nents that could work in it.

And that I had no idea how to de­sign such a thing.

And that I knew noth­ing about any­thing like elec­tron­ic­s, 3d mod­el­ing, etc.

So, I de­cid­ed to do it. In late 2021. And I have spent the last 16 months or so work­ing on it.

And the 2nd pro­to­type ac­tu­al­ly work­s!

If the de­tails of how it's done are in­ter­est­ing to you, I have good news. I am about to write down A LOT OF DE­TAIL­S.

Design Idea

Even though this is what some may call a cy­berdeck I did­n't want it to be cy­ber­punk, or steam­punk, or any sort of punk.

I want­ed to make it as smooth, pol­ished, com­mer­cial-look­ing as I could with­in the con­straints of my abil­i­ty (which are plen­ty).

I want­ed it to look as what may hap­pen if por­ta­ble screens nev­er aban­doned the 5:1 as­pect ra­tio and clamshells did­n't ex­ist.

Did I suc­ceed? Hell no. This is janky as hell be­cause it's a hand­made pro­to­type, but it shows the seeds of pos­si­bil­i­ty, of it­er­a­tion that may make it ... pos­si­ble.

Hardware

SBC

So, what is the en­gine for the thing? When I was think­ing about how to make this func­tion­al, the ob­vi­ous thing was to use a SBC, such as a Rasp­ber­ry Pi.

OTOH I start­ed the project in the mid­dle of the pan­dem­ic short­age of SBC­s, which is still sort of on­go­ing, so those were hard to get, and ex­pen­sive.

So I turned to a lesser-­known brand which had the mag­i­cal thing: stock.

So, the SOC is a Radxa Ze­ro, a tiny SBC in the same form fac­tor as a Rasp­ber­ry Pi Ze­ro, ex­cept it's ridicu­lous­ly more pow­er­ful:

  • Quad core
  • 4GB of RAM
  • 32GB eMMC (no need for SD card)
  • USB 3.0
  • Mi­cro HD­MI port ca­pa­ble of 4k 60Hz

This is rough­ly 70% of the pow­er of a Rasp­ber­ry Pi 4, in a much small­er pack­age that us­es less than 5W of pow­er.

Keyboard

From the be­gin­ning I want­ed a me­chan­i­cal key­board. But I did not want to make my own be­cause that's a lot of work. So, I cre­at­ed soft­ware (more on that be­low) to make it pos­si­ble to just gut a cheap me­chan­i­cal thing and adapt the case so it would work.

Just be­cause I am not hard­core enough to live with­out cur­sor keys I de­cid­ed on a 65% board and the main cri­te­ria was "ships to my house and is cheap­est" so ... en­ter the "GANON 65%" cost­ing un­der 20 dol­lars.

It's ab­so­lute garbage. The sta­bi­liz­ers are hor­ri­ble, the switch­es are scratchy and in­con­sis­tent­ly clicky yet loud, and it was per­fect for the job be­cause all key­boards in 80s com­put­ers were pret­ty crap.

Oh, and it's one of those janky rain­bow fake-RGB back­lit things.

All of these cheap key­boards I've seen are one or two cir­cuit boards with through holes for screws. So I made the case with stands so they would snap in place and then be screwed in.

Power

The ini­tial idea was to use a sim­ple USB power­bank, but that does­n't re­al­ly work, be­cause they have a few un­for­tu­nate habit­s:

  • They of­ten are too bulky
  • There is no sim­ple way to turn them on or off with­out un­plug­ging things
  • Most of them CUT POW­ER OUT­PUT FOR A SEC­OND WHEN YOU PLUG THEM TO CHARGE

The last one is a killer. You can't use a lap­top that crash­es ev­ery time you plug it.

So, I got a "Rasp­ber­ry Pi UP­S" thing which is pow­ered by stan­dard 18650 bat­ter­ies. They are avail­able ev­ery­where and are very cheap, which is good.

In this im­age you can see the whole "pow­er sys­tem"

The green and white cylin­ders are the 18650 bat­ter­ies. They are in­sert­ed in a black case on top of a cir­cuit board. That is the "UP­S" sys­tem,

It can pow­er mul­ti­ple things via 2 US­B-A ports and a US­B-C port.

This par­tic­u­lar one has a but­ton to turn it on and off that is ex­posed in the back of the case as well as a mi­cro USB port to charge, which are ex­posed on the back of the case.

How­ev­er ... the but­ton on­ly turns off one of the pow­er out­put­s. If you look at the BOT­TOM of the "UP­S" you can see a pair of red and black ca­bles. Those are con­nect­ed to freak­ing pogo pins at the bot­tom of the UPS and go to a cou­ple of pins in the Radza Ze­ro to pow­er it.

This sucks a lit­tle be­cause I had to use that ad-hoc con­nec­tor in­stead of a sim­ple USB ca­ble and it means the "UP­S" has to be fair­ly sep­a­rat­ed from the bot­tom of the case (7m­m!), but hey, it work­s.

There are al­so a cou­ple oth­er wires, or­ange and blue. Those are con­nect­ed to a cheap volt­age-mea­sur­ing thing with LED­s. It costs about 50 cents and ... is not great.

OTOH I glued it to the IN­SIDE of the case and I think it looks awe­some.

It can stay turned on all the time be­cause it us­es so lit­tle pow­er it would have to be turned on for a month to drain the bat­tery.

The screen gets pow­er from a USB hub con­nect­ed to the Radxa Ze­ro, so I don't need to fig­ure out how to pow­er it from here.

UP­DATE: Turns out the screen was draw­ing too much pow­er, so when the sys­tem got load­ed or an­oth­er pe­riph­er­al was added it got un­sta­ble and things turned on and off as it tried to keep up. I just spliced a mi­cro-USB pow­er-on­ly ca­ble in­to the pow­er from the pogo pins and it works just fine, ex­cept for the ug­ly, ug­ly ca­bling.

I/O

The Radxa Ze­ro has a pret­ty lim­it­ed port se­lec­tion, be­ing that smal­l.

  • HD­MI which is con­nect­ed to the in­clud­ed screen.
  • 1 USB 2.0 OTG port (unused for now)
  • 1 USB 3.0 port

So I need­ed to make that sin­gle USB 3.0 port do more things. Which means I got a USB hub.

That's a alu­minum hub (be­cause why not) which has 4 port­s, 3 on the side, and 1 on the tip.

The port in the tip I ex­posed through a hole in the back of the case:

The ones on the right are used for:

  • Plug­ging the key­board
  • Pow­er­ing the screen
  • A USB sound card

The au­dio jacks are ex­posed on the side of the case:

Up­date: Be­cause of the changes in how the screen is pow­ered now there is an­oth­er free USB port which means I may be able to pro­vide an ex­posed Eth­er­net port!

Screen

This is a gener­ic 1920x480 screen. I think they are made for car sys­tem­s, so they are bright and fair­ly af­ford­able, you should have no prob­lem find­ing one in your favourite chi­nese sup­pli­er.

If you can af­ford a touch ver­sion maybe that would be nicer, but this one is not touch, be­cause I ex­pect the main in­ter­face to be key­board based.

This weird sort of screen may or may not work with your op­er­at­ing sys­tem, spe­cial­ly if you are us­ing a not-­so-well-­known SBC like the Radxa Ze­ro.

I had to build a cus­tom ker­nel from github and that on­ly on Ubun­tu YM­MV.

One un­ex­pect­ed is­sue was that the dis­play of­fers mini-HD­MI and the SBC has a mi­cro-HD­MI port.

Have you ev­er seen a mini-mi­cro HD­MI ca­ble? Me nei­ther (un­til re­cent­ly) and if you try to use reg­u­lar HD­MI ca­bles and adapters ... the end re­sult is some­thing im­pos­si­ble to fit in­to a rea­son­able case.

So­lu­tion: flat, mod­u­lar HD­MI ca­bles!

You get the con­nec­tors you wan­t, the ca­ble length you wan­t, you snap them to­geth­er and voilá! Smal­l, flex­i­ble ca­ble with the con­nec­tors you need!

Did I men­tion that these ca­bles took 3 months to ar­rive? And I could not move for­ward with the build un­til they did? Be­cause they did take 3 months to ar­rive. So get a bunch at once.

Case

With all the com­po­nents above you can con­nect ev­ery­thing and have a work­ing ... thing. But you can't put it in your lap, so it's not a lap­top.

To com­bine them all you need a case. And in 2023, as a sim­ple per­son with no me­chan­i­cal tal­ents that means 3d print­ing.

BUT, I al­so lack any knowl­edge of 3D de­sign soft­ware.

BUT, I am a pro­gram­mer. So when I found I could write 3D mod­els as Python pro­grams I knew what to do: use Cad­Query

Then came a month­s-­long pe­ri­od of fig­ur­ing out how to cre­ate the case and how to print it and so on, but the end re­sult is two pieces:

The bot­tom piece is ba­si­cal­ly a box with pegs and holes where all the com­po­nents are mount­ed.

The top piece is where the screen goes.

Both of them have holes and stands so they can be screwed to each oth­er.

Be­cause they are too large, they are print­ed in halfs and then as­sem­bled.

With a larg­er 3D print­er I could print the base as a sol­id piece, how­ev­er, the top half needs to be split in half so the screen can slide in place.

All this is gen­er­at­ed by a cou­ple of Python scripts avail­able in my per­son­al code serv­er.

It's not all the way there yet, but the goal is to cre­ate a soft­ware pack­age that lets you (yes, you) set pa­ram­e­ters and make this work with your ran­dom col­lec­tion of mis­fit com­put­er hard­ware.

So, no screen? Print a lid, ex­pose the HD­MI port!

Have a Rasp­ber­ry Pi 4 in­stead of a Radxa Ze­ro? Sure, ad­just a few things and make it work.

Got a ran­dom key­board with 14 mount points in ran­dom places? Sure, mea­sure them and slap it in place.

But again: not there yet.

Performance

What can it do?

  • Run a web brows­er (tried Falkon)
  • Watch a Youtube video (or even two!)
  • Run a light­weight graph­i­cal desk­top
  • Run ter­mi­nal apps like a champ
  • Ed­it text and write code

So, it's good enough for light us­age, which is what I am aim­ing for.

Bat­tery life is be­tween 3 and 5 hours de­pend­ing on load.

Software

This is run­ning Ubun­tu Fo­cal with a cus­tom ker­nel and a patched dwm

The ter­mi­nal of choice is alacrit­ty be­cause while it us­es a lot more RAM than st it runs a bazil­lion times faster.

To mux the ter­mi­nal (alacrit­ty has no tab­s) I use zel­lij an awe­some and friend­ly al­ter­na­tive to tmux/screen/etc.

To browse the web I would love to use qute­brows­er be­cause of its awe­some key­board sup­port that makes the mouse an af­ter­thought. Bu­u­u­ut it's re­al­ly re­al­ly bro­ken in this Ubun­tu, so Falkon it is.

Do not try to get fan­cy with pow­er man­age­men­t. Things like up­ow­erd im­me­di­ate­ly throt­tle the CPUs to 100MHz mak­ing it im­pos­si­ble to do any­thing.

Oth­er than that, just the usu­al Ubun­tu un­der­neath it al­l.

Problems (TODO)

  • Air­flow is in­ex­is­ten­t, so it over­heats
  • When it over­heats it starts turn­ing off and on the USB port which makes ev­ery­thing work bad­ly.
  • The key­board is too high from the table, so that needs tweak­ing.
  • Be­cause of the bat­tery so­lu­tion it's kin­da thick at the back
  • The pow­er but­ton is re­al­ly hard to click
  • The bat­tery gauge sucks
  • Needs no-s­lip pads
  • Has no sup­port for a point­er (other than plug­ging a mouse) so an in­te­grat­ed track­ball or thinkpad-style nub would be nice.

Comments

This blog has no com­ments, but feel free to dis­cuss it in this red­dit post

Pet Server (Feb 2023 update)

This is a longer-term up­date on the state of my home serv­er. You can read more about it in these 1 2 3 4 5 post­s.

Not much has changed in it, to be hon­est.

Hard­ware's the same as in the past, ev­ery­thing is work­ing fine. I have a good back­up of the serv­er us­ing what I de­scribed here and I have ac­tu­al­ly test­ed it. I can bring it back up in un­der half an hour, which is ok.

I am con­sid­er­ing get­ting a bet­ter USB hub, be­cause the one it's us­ing now is pret­ty slow for the stor­age. Not slow enough that I can no­tice but slow­er than it could be.

I may re­do the case be­cause I have learned a lot about mak­ing cas­es and can do a bet­ter one :-)

What could im­prove?

  • Some things are tricky to de­ploy in ARM
  • Some of my ad-hoc im­ple­men­ta­tions are clunky
  • I am not re­al­ly us­ing the whole me­dia serv­er im­ple­men­ta­tion all that much

How hap­py am I with it? Su­per hap­py. I use it ev­ery day, it's re­li­able and ba­si­cal­ly main­te­nance-free.

How much energy does my office server use?

Just ran in­to this video where the host ex­plains how he's us­ing a home serv­er and how he made it use un­der 23W, and the steps he took to make it qui­et and ef­fi­cien­t.

So, know­ing that our servers are not com­pa­ra­ble I want­ed to check how much pow­er my serv­er used.

Yes, my serv­er is pret­ty un­usu­al, you can read about it here: 1 2 3 4 5

First let's look at MAX­I­MUM pow­er draw for all com­po­nents.

  • Com­put­er (Radxa Ze­ro): 900 mA at 5V
  • HD­D: 500 mA at 5V (x2)
  • Net­work USB adapter: 500 mA at 5V

There is al­so a USB 3.0 hub there but the pow­er us­age is neg­li­gi­ble, prob­a­bly be­low 100 mA at 5V.

So, the max­i­mum pow­er us­age is ~2400 mA at 5V, which is about 12 watts.

When more or less idle, mea­sured with a USB thingie, the Radxa Ze­ro us­es ~200 mA and the Net­work adapter nev­er seems to go above 150 mA, so a low­er bound is maybe about ~1300 mA, or about 6 watts.

And then there's cost. My whole sys­tem (which does ev­ery­thing I want nice­ly AFAIC­S) costs un­der 100 dol­lars. And my pow­er bill from it is, if it runs full throt­tle ALL THE TIME (it does­n't) ... $87

Mind you, that's 87 ar­gen­tini­an pe­sos, or be­tween 50 and 25 USD cents, de­pend­ing on your ex­change rate.

I think I'll man­age.

Pet Server (September 2022 update)

This is a longer-term up­date on the state of my home serv­er. You can read more about it in these 1 2 3 4 post­s.

What's the hardware nowadays?

  • Radxa Ze­ro: 4-­core 4GB RAM, 32GB eMMC
  • 2 1TB HDD over USB
  • 100Mbps eth­er­net wired con­nec­tion to the router

And ... so far, it's more than enough. No strain :-)

What is it running?

Al­so back­ups via restic and oth­er ran­dom things. I have a sep­a­rate oc­to­print serv­er but I may move it here.

Really, it runs all that?

Yeah, and it works just fine. Of course this is most­ly be­cause I am the on­ly re­al user, but hey, it work­s.

Anything else you would want to run?

  • Maybe some sort of push no­ti­fi­ca­tion thingie so I can no­ti­fy my phone if there's a prob­lem
  • Maybe grafana? But don't care enough yet.

Was it worth it?

I could run all this on cloud­s, but the hard­ware I am us­ing would cost maybe 100 dol­lars, and month­ly fees for ser­vices will quick­ly reach that amount and sur­pass it. I am al­ready pay­ing for the band­width any­way.

OTOH I have spent maybe 50 or 60 hours set­ting this up and if I look at my hourly rates ... ick.

Anything weird?

I re­al­ly don't un­der­stand oth­er peo­ple's home­lab­s, they seem wild­ly over­pow­ered.


Contents © 2000-2024 Roberto Alsina