Archive for the ‘Fysik’ Category

Rätt komponent och fel komponent!

23/10/2019

Jag har fått lasern för min vibrationsmätare för fiol. Efter att ha experimenterat med lasern bl.a. byggt en strömkälla med konstant ström (ca. 20 mA) så har det visat sig att lasern speciellt vad gäller den inbyggda ljusdetektorn inte uppförde sig som väntat. För att komma vidare med felsökningen beslöt jag att öppna en sensor, jag har fem stycken, för att kontrollera att ljusdetektorn faktiskt existerar. Det finns många exempel på att ljusdetektorn lämnats bort av kostnadsskäl medan anslutningsbenet finns kvar.

Jag slipade försiktigt bort toppen av laserkomponenten med hjälp av en diamantfil och tittade på innanmätet i mikroskop.

P1000885.JPG

Laserchipen i halvledarlasern är lödd till ett vertikalt ”torn” i metall.  Tornet är den positiva polen. Den andra polen är lödd med guldtråd till ett av benen på komponenten, benet syns till vänster i bilden.

Ljusdetektorn vars ursprungliga uppgift har varit att mäta laserns intensitet kan ses i följande bild då vi fokuserar om mikroskopet.

P1000886.JPG

Ljusdetektorn finns i botten av komponenten. Den ena polen är igen lödd direkt till den positiva stommen och den andra polen är lödd med goldtråd till  ett eget ben.

ADL-65052TL_laser.png

Laserns datablad visar hur helheten fungerar. Halvledarlasern är dioden LD som matas från ben nummer två i framriktning. För att inte bränna lasern måste den drivas med konstant ström ca. 20 mA.

Den andra dioden PD är backad och den används som fotodetektorn. Strömläckaget genom den backade detektordioden är proportionell mot ljusintensiteten.

Man får en bild av dimensionerna då man noterar att diametern på den fönsterförsedda delen är 3,55 mm. Man ser de aktiva komponenterna med en bra lupp men mikroskop är att föredra.

Slutkommentar

Det ser ut som om den laserkomponent jag beställde är äkta vilket betyder att jag måste fundera vidare på varför jag inte får det resultat jag förväntar mig.

Orsaken till att jag skar upp lasern var att jag i något skede beställde ett antal TIP120 effekt darlingtontransistorer. Transistorerna har legat en tid i miljonlådan och jag tänkte använda en TIP120 eftersom den, det är en darlingtontransistor, har hög strömförstärkning på över 1000. Konstruktionen fungerade inte riktigt som väntat varför jag mätte den och fick strömförstärkningen hfe=100. Då jag tittade närmare på transistorn märkte jag att förpackningen också var fel d.v.s. de kära kineserna hade antagligen köpt en sats konventionella NPN effekttransistorer billigt och därefter ändrat typangivelsen till TIP120 som är något dyrare. I detta fall blev jag alltså blåst … smile!

Att mäta plattors rörelser på fiol

17/09/2019

Det här är en inledning till något som torde bli en serie artiklar.

Jag har i olika sammanhang funderat över hur man enkelt kunde mäta amplituden hos vibrationer i plattorna på en fiol så att fiolen hela tiden är spelbar. Jag är alltså inte i första hand intresserad av att mäta vibrationerna i ett fritt svängande lock eller bottenplatta som inte har limmats till sargerna. Naturligtvis kan samma mätteknik användas också för detta men jag är mera intresserad av ett spelbart instrument.

Jag har tidigare tittat på möjligheterna att använda en lysdiod och en ljusdetektor (en ljuskänslig diod i revers bias). Tanken var att mäta variationerna i ljusstyrka då plattan till följd av vibrationerna rör sig i förhållande till detektorn. Jag fick aldrig mätaren att fungera pålitligt varför jag gick vidare till andra problem …

För en tid sedan råkade jag hitta en intressant video på youtube som behandlar precis mitt problem och där mätningen sker på nästan identiskt sätt jämfört med mitt tänkta system ovan. Skillnaden är att man i stället för en LED (lysdiod) använder en kombinerad laserdiod och ljusdetektor i samma förpackning. En laser producerar koherent ljus d.v.s. alla ljusvågor från lasern är i fas vilket gör att ljuset som reflekteras från ytan också kommer att vara (ungefär) i fas. Ungefär i fas eftersom ytan vi belyser är ojämn i mikrometerskala. Eftersom det reflekterade ljuset är någorlunda fasrelaterat till laserljuset så kommer vi att se interferens mellan laserljuset och det reflekterade ljuset. Då laserljuset ligger i samma fas som det reflekterade ljuset får vi ett signalmaximum. Då laserljuset ligger i motfas får vi ett minimum där ljuset delvis släcks ut.

Titta på videon så att du förstår vad som händer … det är fråga om en relativt enkel process.

Vilka delkomponenter behöver jag för en mätare av plattors rörelser

Jag behöver:

  • En laserdetektor i stort sett byggd som på videon. I praktiken använder jag 3-d skrivare till att bygga en hållare för lasern och hjälpelektroniken. Eventuellt använder jag någon tunn tejp som laserreflektor. En liten tunn tejpbit bör inte ändra svängningsförhållandena märkbart.
  • En separat mikrofon för att mäta ljudnivån så att olika instrument kan jämföras. Eventuellt kan lasersignalens lågfrekventa signal användas också som mikrofon men experiment får utvisa om detta fungerar.
  • En apparat för att generera en specifik ton i instrumentet. Jag har som första approximation tänk mig en enkel apparat för att knäppa på strängen med reproducerbar amplitud. Jag tänker mig ett mekaniskt finger som är fjäderbelastat  så att strängen släpps att vibrera vid en känd kraft (Usom bestäms av fjäderns töjning). Ögonblicket då fingret släpper från strängen detekteras med en mikrobrytare som då startar datainsamlingen.

Hur görs mätningen

Då plattan svänger ger laserns ljusdetektor ut en växelspänning där antalet toppar mellan svängningspunkterna ger antalet våglängder som plattan rör sig. Eftersom jag knäpper på strängen så kommer amplituden att först vara stor d.v.s. vi får ett stort antal våglängdstoppar/dalar under plattans rörelse. Rätt snabbt kommer svängningsamplituden att avklinga mot noll.

Om vi vet, mätt med mikrofon, vilken strängens grundfrekvens d.v.s. tiden för en svängningsperiod på strängen är så kan vi beräkna plattans svängningsamplitud på följande sätt.

Antag att plattans svängningsamplitud är 0,1 mm d.v.s. rörelsen 0,2 mm (200 um) och svängningsfrekvensen är 200 Hz (lös G-sträng på en fiol). En svängningsperiod är då 5 ms. Laserns våglängd är 0,65 um  (mikrometer, rött ljus) vilket betyder att vi bör få 200/0,65 = 307 signaltoppar/dalar från lasern. Då svängningen i plattan klingar av minskar amplituden och antalet toppar/dalar från lasern minskar successivt mot noll. Om vi lyssnar på lasersignalen så kommer vi att höra ett frekvenssvep från maximifrekvensen

fmax = 307/0.005 = 61,5 kHz

Om vi tar den mätta lasersignalen och beräknar Fourier-spektret på signalen så bör vi utan problem kunna se vilken maximifrekvensen är. Maximifrekvensen ger ett direkt mått på svängningsamplituden om vi känner grundtonen:

s = f_max*lamda*T

där

f_max = maximifrekvensen i lasersignalens fourier spektrum.

lamda = laserns våglängd 0,65 um

T = 1/f_grundton

Exempel (numeriska värden tagna ovan):

s = 61500 Hz * 0,65 um * 0,005 s = 200 um

Svängningsrörelsen är 200 um från minimum till maximum.

Jag väntar på laserdioder av typen ADL65052TL. Det enda kriteriet jag hade gällande val av laserdiod var att det skall finnas en ljusdiod i samma kapsel. Notera att många laserdioder som säljs nuförtiden saknar ljusdetektorn och således inte lämpar sig för ovanstående applikation.

Mätsystemet

Ovanstående övningsexempel ger data för hur mätsystemet måste konstrueras. Om vi vill täcka hela instrumentet från låga G upp till A på E-strängen så kommer den svängande strängens grundfrekvens att ligga mellan 200 Hz och ca. 1000 Hz.

Exemplet ovan visade att vi om vi tänker oss en amplitud på +/- 0,1 mm får ut en signal på 61,5 kHz från den lösa G-strängen. Om vi vill mäta G på E-strängen så ligger strängens frekvens på 800 Hz vilket med samma amplitudantagande ger en lasersensorfrekvens på 4*61,5 kHz = 246 kHz och ur samplingskriteriet ser vi att lasersignalen bör mätas minst med frekvensen 2*246 kHz = 492 kHz. För att vara på den säkra sidan bör vi sampla signalen i kanske 800 kHz under den tid då vi ligger nära maximal svängningsamplitud. Om vi antar att vi mäter 1/50 sekund så kommer vi att lagra 16000 mätvärden a’ 2 bytes d.v.s. vi behöver lagringsutrymme för 32000 mätvärden.

Ovanstående betyder att vi kan göra ett grovt val av hårdvara för vår mätare. Jag gissar att en Arduino Due som använder en ARM processor och kör på 84 MHz bör vara kapabel att sampla tillräckligt snabbt. Enligt specifikationerna bör processorn vara kapabel att sampla upp till 1 MHz. Processorn har 96 kbyte snabbt RAM minne vilket bör räcka till för buffert och analys. En Arduino Due kostar mellan 10 och 50 Euro beroende på varifrån man köper den … och om det är fråga om en orginal Due eller en kinesisk kopia. Mätsignalen måste förstärkas så att vi ligger vettigt i förhållande till AD-konverterns arbetsområde och upplösning 10 eller 12 bitar beroende av hur processorn konfigureras.

Kommande artiklar:

  • Laserdetektorns konstruktion och eventuella problem i samband med bygge.
  • Detektorns elektronik och datainsamling.
  • Knäppmekaniken
  • mätresultat.

 

 

Klimat- och energipolitik

29/06/2019

Intressant diskussion i SWEBBTV med energiexperten Elsa Widding.

Det är intressant att notera hur Sverige som har en stor andel vattenkraft så småningom kommer i en situation där energi måste börja ransoneras. En politik som slår sönder samhällets energisystem är samhällsförstörelse!

Den medeltida värmeperioden

06/03/2019

Hur man försökte eliminera den medeltida värmeperiodsen

Det har bland geologer och historiker funnits någon typ av koncensus att det kring vår tideräknings början var varmt. Man levde i en högkultur eftersom jordbruket producerade väl och det fanns resurser till att göra annat än att överleva.

På 200-talet eKr sjönk temperaturen kraftigt vilket ledde till folkvandringar som kom att kraftigt skada Romarriket.

På 800-talet blev det varmare och vi hade i Europa en ny värmeperiod som sträckte sig fram till 1300-talet men den bästa värmeperioden tog slut vid början av 1100-talet. Medeltidens värmeperiod utmärktes av byggandet av ståtliga katedraler … sannolikt igen för att det fanns ett överskott av människor som inte behövdes för produktion av livets nödtorft.

Medeltida_värmeperioden.png

Bild 1. Den medeltida värmeperioden och det Romerska klimatoptimet. Bilden är tagen ur Ljungqvist (2010): A NEW RECONSTRUCTION OF TEMPERATURE VARIABILITY IN THE EXTRA-TROPICAL NORTHERN HEMISPHERE DURING THE LAST TWO MILLENNIA

Bilden stämmer överens med uppfattningen från några årtionden sedan men den har ett stort problem. Bilden visar hur temperaturen under romartiden och under medeltiden sannolikt var lika hög som idag för att efter år 1300 kraftigt börja sjunka mot den lilla istiden under 1600-talet och början av 1700-talet. Problemet är helt enkelt att man har svårt att använda dagens temperatur för att skrämma människor av politiska orsaker om man kan visa att det har varit lika varmt tidigare … utan att jorden gick under.  Åtminstone kan man väl anta att någon undergång aldrig kom eftersom vi finns här idag (/sark).

År 1990 gav Romklubben, de västerländska oligarkernas sammanslutning ut rapporten:

Den första Globala Revolutionen: ”Då vi sökte efter en gemensam fiende mot vilken vi kunde enas kom vi fram till att nedsmutsning, hotet om global uppvärmning, vattenbrist, farsoter och liknande kunde passa in på detta. I sin helhet och i växelverkan mellan dessa fenomen utgör de ett gemensamt hot som alla tillsammans måste konfronteras med. Om vi pekar ut dessa faror som en fiende, faller vi i fällan, som vi redan har varnat våra läsare för nämligen att se på symptomen som orsaker. Alla dessa faror är en följd av mänsklig inverkan på naturliga processer och det är endast genom förändrade attityder och beteende som de kan övervinnas. Den verkliga fienden är mänskligheten själv.”

Samma frågor hade långt tidigare diskuterats inom Romklubben (gör en Google sökning).

Om vi vill skrämma människor till att ge ifrån sig sin lokala makt att ta egna beslut så måste man kunna visa på att vår tid är extrem och att om utvecklingen fortsätter så kommer vi att uppleva en katastrof. Vi har många gånger sedan 1990 fått höra hur vi har endast 10, 12, 15 år på oss att reagera innan mänskligheten riskerar att utrotas. Profetiorna om domedagen har kommit och gått utan synliga katastrofer men detta korrigeras genom att man kommer fram med en ännu värre profetia …

Ett sätt att fixa beställningsarbetet med att eliminera den medeltida värmeperioden som var ackepterad och välkänd, d.v.s. tiden då vikingarna koloniserade grönland, föll på klimatforskaren Michael Mann. Mann använde s.k. proxyn d.v.s. han uppskattade bl.a. via årsringar från träd vilken temperaturen var det år då årsringen bildades. Tanken är att om man väljer träd som växer nära trädgränsen så kommer trädets växthastighet främst att begränsas av temperaturen. Under varma år växer trädet bättre och årsringen blir bredare och under dåliga år blir årsringen smalare.

Hockey_stick_IPCC.png

Michael Manns hockeyklubba eliminerade hela den medeltida värmeperioden (jämför med Ljungqvists kurva) och visade på en extrem uppvärmning från början av 1900-talet. Det stora problemet med kurvan är att den lyftes fram som en ikon för en katastrofal uppvärmning samtidigt som den stod i fullständig konflikt med många ärtionden av historisk och geologisk forskning.

Det visade sig emellertid att det också fanns andra problem. Manns rekonstruktion använde sig av en då relativt ny statistisk metod PCA som inte tillämpades helt korrekt. Resultatet var att metoden visade sig kunna plocka ut hockeyklubbor ur brus d.v.s. om man matade algoritmen med brus så skapade den en hockeyklubba.

Ett annat problem som bl.a. statistikerna McIntyre och McKitrick påvisade var att Manns hockeyklubba var beroende av ett enda träd för att man skulle få fram klubban. Detta förnekades naturligtvis på det kraftigaste av Mann och gruppen runt honom.  Historien har dock nu hunnit ifatt Mann efter att gruppens epostmeddelanden nu har gjorts offentliga efter ca. 8 års förhalanden. I ett epostmeddelande från Malcolm Huges (en i gruppen) till Mann kan vi läsa:

From: Malcolm Hughes
To: Michael E. Mann
Cc: rbradley@geo.umass.edu
Subject: Re: close call
Date: Monday, July 31, 2000 3:00:26 PM
Dear Mike – I have read and re-read the draft, and have come to the
conclusion that it would be a mistake to publish it. I would also urge
you not to publish it. I think my enthusiasm aroused by the first
version of the figure allowed me to ignore the most important
problem. In the 1999 GRL paper the dangers of using too few
proxies for a hemispheric reconstruction were rehearsed – that was
our intention. That this new version of your post-1980 calculations
should be so sensitive to the omission of a single record is very
worrying indeed.

Den sista meningen ovan: ”Att denna nya version av dina beräkningar efter 1980 är så känsliga för bortlämnandet av en mätning (ett träd – min kommentar) är mycket oroande.”

Vi ser alltså att gruppen trots förnekanden var mycket väl medvetna om att hela rekonstruktionen byggde på ett enda träd som råkade ge korrekt resultat.

… epostmeddelandet avslutas med:

Då jag tänker närmare på saken skulle det vara klokare att hålla vårt krut torrt och om någon ifrågasätter detta i ett trovärdigt forum poängtera att vi jobbar med att sätta ihop ett tätt högkvalitativt datasett som ligger närmare dagens situation.

Jag läser detta som ett direkt bevis på att man körsbärsplockar data så att de skall ge det resultat man vill ha. Detta påstående om körsbärsplockning går också att direkt veriefiera genom de nyligen frisläppta epostmeddelandena:

Michael Mann:

Well, one thing that is different here is that we are  actually screening all proxies to see if they have a verifiable signal (temperature or precip) against the instrumental record. So we are using an objective measure, rather than just deciding what we think is good or not.

Alltså, en sak som skiljer här är att vi väljer bland alla proxys för att se om det finns en verifierbar signal (temperatur eller nederbörd) jämfört med mätningar. Vi använder alltså en objektiv metod i stället för att helt enkelt välja vad som är bra eller inte.

Det här är hårresande! Man säger alltså att man går igenom årsringsserier och väljer ut de serier som stämmer överens med mätningar som kriterium för att använda serierna.  Det är självklart att det hela datasettet efter denna filtrering kommer att visa precis det urvalsfiltret valde ut. Josh har illustrerat saken på kornet nedan …

Nedan ser vi vetenskaplig heder (/sark) i arbete. Vid arbetet på IPCC:s rapporter fanns det klara direktiv på hur publikationer kunde tas med. Publikationen skall ha genomgått peer review etc.  före ett givet deadline för att kunna användas i IPCC:s rapport. Saken gäller naturligtvis inte den inre kretsen/teamet. Den egna artikeln, som försökte försvara hockeyklubban mot McIntyres och McKitricks kritik, var försenad. Vad borde man då göra?

From: Phil Jones [mailto:p.jones@uea.ac.uk]
Sent: Wednesday, September 12, 2007 11:30 AM
To: Wahl, Eugene R; Caspar Ammann
Subject: Wahl/Ammann

Gene/Caspar,
Good to see these two out. Wahl/Ammann doesn’t appear to be in CC’s online first, but comes up if you search.
You likely know that McIntyre will check this one to make sure it hasn’t changed since the IPCC close-off date July 2006!
Hard copies of the WG1 report from CUP have arrived here today.

Ammann/Wahl – try and change the Received date! Don’t give those skeptics something
to amuse themselves with.

Cheers<
Phil

Phil Jones en av teamets huvudfigurer föreslår:

Amman/Wahl – försök att ändra ankomstdatumet! Ge inte de där skeptikerna någon orsak att ha roligt.

Kanske nog för denna gång!

Det stinker!

06/03/2019

Skall jag tro på auktoriteterna?

Jag har deltagit i en liten grupp som har diskuterat den antropogena globala uppvärmningen AGW) som sedan blev  ”den katastrofala globala uppvärmningen” (CAGW) som man sedan har morfat till ”klimatförändringen”. Det finns personer med åsikter både för och emot. Notera att begreppet klimatförändring nog har funnits med länge men hela motiveringen till dagens domedagsprofetior har varit påståendet att vi råkar ut för en för människan katastrofal uppvärmning om vi inte radikalt lägger om hela vårt samhälle och samtidigt kraftigt sänker vår levnadsstandard. Om stigande koldioxidnivåer inte leder till en ohanterlig uppvärmning så borde vi snarare tacka högre makter för den välsignelse koldioxiden för med sig i form av bättre tillväxt inom växtriket.

År 1990 gav Romklubben, de europeiska oligarkernas sammanslutning ut rapporten:

The First Global Revolution. “In searching for a common enemy against whom we can unite, we came up with the idea that pollution, the threat of global warming, water shortages, famine and the like, would fit the bill. In their totality and their interactions these phenomena do constitute a common threat which must be confronted by everyone together. But in designating these dangers as the enemy, we fall into the trap, which we have already warned readers about, namely mistaking symptoms for causes. All these dangers are caused by human intervention in natural processes, and it is only through changed attitudes and behavior that they can be overcome. The real enemy then is humanity itself.”

Vi presenteras flera gånger dagligen nyheter om den katastrofala klimatförändringen som kräver att vårt västerländska samhälle gör självmord genom att snabbt eliminera alla fossila bränslen, bränslen som idag utgör stommen i västvärldens energiförsörjning.

Ett sätt att motivera detta är att visa på den uppvärmning man påstår vara förorsakad av människan. Utvecklingen hos den globala temperaturen sett genom auktoriteternas glasögon är:

Untitled

Bilden ser onekligen imponerande ut och vi kan ur den glättade linjen läsa ut att temperaturen har stigit ungefär 1,3 grader C sedan år 1910. Det finns dock en hel mängd intressanta tvivelaktigheter i den här bilden. Notera att då jag talar om GISS så bör man i princip kunna byta ut GISS mot datamängden ghcn i vårt fall version 3. Jag tar inte ställning till om vi har en exakt överenstämmelse eller om GISS gör ytterligare korrektioner.

Vi börjar med att titta på puckeln vid 1940 och vi ser hur den jämfört med perioden 1960-80 ligger ungefär 0,1 grad högre än platån som kommer efter den. Notera dock att norra och södra hemisfären uppför sig något olika varför en global kurva inte har en lika accentuerad puckel vid 1940 som motsvarande kurva för nordliga områden.

Det finns dock belägg för att bilden kanske inte är korrekt och att det är fråga om ett politiskt beställningsarbete.

Vid Climatgate i november 2009 släppte en okänd person ut en stor mängd e-postmeddelanden som gav en inblick i spelet bakom kulisserna i den inre ringen ”klimatvetenskapsmän”.

From: Tom Wigley <wigley@ucar.edu>
To: Phil Jones <p.jones@uea.ac.uk>
Subject: 1940s
Date: Sun, 27 Sep 2009 23:25:38 -0600
Cc: Ben Santer <santer1@llnl.gov>

It would be good to remove at least part of the 1940s blip, but we are still left with “why the blip”.

Översatt: Det skulle vara bra att eliminera åtminstone en del av 1940s puckel men vi har fortfarande kvar frågan ”varför puckeln”.

James Hansen publicerade en vetenskaplig artikel år 1981 där han presenterar temperaturen på olika håll på jorden.

Hansen_1981

Notera hur temperaturen år 1910 ligger endast ungefär 0,1-0,2 grader C under temperaturen ungefär år 1970. Jämför detta med GISS temperaturkurva där motsvarande temperaturdifferens har vuxit till ca. 0,5 grader C d.v.s. differensen har fördubblats genom ”justeringar”. Jag har inte tillgång till användbara data där GISS kurva i bild 1 (korrigerad och homogeniserad) kunde jämföras med motsvarande kurva beräknad från ojusterade data. GISS har däremot gett tillgång till ifrågavarande information för olika mätstationer stationer för vilka vi alltså enkelt kan beräkna en differens mellan de mätta ojusterade temperaturer GISS utgått från och de justerade och homogeniserade tomperaturer GISS presenterar för beslutsfattare och publik.

Nedan ges ett exempel på hur man har justerat en specifik station (Reykjavik). Chefen för Islands meteorologiska institut konstaterade, då justeringen fick offentlighet, att Island själv har korrigerat sina temperaturdata utgående från flyttningar av stationen, byte av mätinstrument etc och att ytterligare justeringar inte behövs … GISS justerade ner gamla temperaturer genom att kyla det förgångna med upp emot 2 grader (man justerade alltså gamla mätningar så att de blev kallare vilket gör att trenden ökar). Genom att man justerar det förgångna och presenterar dagens data oförändrat så kan man inte få fast förfalskarna genom att i nutid jämföra dagens mätningar med det som rapporteras. Sarkastiskt så kan man dock konstatera att moderna topptemperaturer inte tenderar att ligga speciellt länge på toppen eftersom också dessa kommer att justeras nedåt inom något år vilket gör att man år efter år får nya värmerekord …

På 1940 talet upplevde man konkret att det var varmt och temperaturen hade stigit under många år:

WarmerArctic_14.12.1940.png

Notera hur man beskriver att havsisarna i ishavet har smultit snabbt under de senaste femtio åren och kanske en tredjedel av isen har försvunnit.

November 2, 1922 The Washington Post: The Arctic ocean is warming up, icebergs are growing scarcer and in some places the seals are finding the water too hot, according to a report to the Commerce Department yesterday from Consulafft, at Bergen, Norway.

Reports from fishermen, seal hunters and explorers all point to a radical change in climate conditions and hitherto unheard-of temperatures in the Arctic zone. Exploration expeditions report that scarcely any ice has been met as far north as 81 degrees 29 minutes. Soundings to a depth of 3,100 meters showed the gulf stream still very warm. Great masses of ice have been replaced by moraines of earth and stones, the report continued, while at many points well known glaciers have entirely disappeared.

Very few seals and no white fish are found in the eastern Arctic, while vast shoals of herring and smelts which have never before ventured so far north, are being encountered in the old seal fishing grounds.

Enligt GISS kurva nedan (Norra halvklotet utanför tropikerna) så såg man en snabb avsmältning som ledde till att glaciärer helt försvann. Hur stämmer detta med samma kurva som säger att temperaturen var högre på sjuttiotalet men att havsisen bredde ut sig och det spekulerades kring inledningen till en ny istid eftersom temperaturen enligt dåtidens uppfattning hade sjunkit 0,5 grader C (NAS rapport 0,6 grader)från trettiotalats topp. På 1920-talet var temperaturen enligt GISS betydligt lägre än på 1970-talet men enligt rapporter skedde en snabb avsmältning i polarområdet. Skall vi tolka detta som att för avsmältning behövs kyla och för växande isar behövs värme (/sark).

I USA hade man på 1930-talet upplevt ”the dust bowl” d.v.s. extremt höga temperaturer med svår torka vilket ledde till utbredd misär bland odlare. På 1970 talet då man inte endast hade mätningar att falla tillbaka på utan också forskare som personligen hade upplevt 1930-talets värme uppskattade man att temperaturen efter 1930-talets topp föll med 0,5-0,6 grader C fram till mitten av 1970-talet. (Notera att den digitaliserade rapporten saknar vissa delar sannolikt till följd av fel vid inscanningen)

NATIONAL ACADEMY OF SCIENCES

UNITED STATES COMMITTEE FOR THE GLOBAL ATMOSPHERIC RESEARCH PROGRAM National Research Council

UNDERSTANDING CLIMATIC CHANGE A Program for Action NATIONAL ACADEMY OF SCIENCES WASHINGTON, D.C. 1975

36 UNDERSTANDING CLIMATIC CHANGE

A striking feature of the instrumental record is the behavior of temperature worldwide. As shown by Mitchell (1970), the average surface air temperature in the northern hemisphere increased from the 1880’s until about 1940 and has been decreasing thereafter (see Figure A. 6, Appendix A). Starr and Oort (1973) have reported that, during the period 1958-1963, the hemisphere’s (mass-weighted) mean temperature decreased by about 0.6 °C. In that period the polar and subtropical arid regions experienced the greatest cooling. The cause of this variation is not known, although clearly this trend cannot continue indefinitely.

Notera hur 1930-talets värmeperiod och avkylningen har eliminerats i stort sett helt i GISS temperaturuppskattning nedan:

GISS_NorthernHemisph

Vad beror den kraftiga förändringen på? Min personliga uppfattning är att vi ser en medveten justering (läs förfalskning av temperaturdata för att data skall följa politikernas krav). Jag har inte programvara för att reproducera GISS globala bild ovan men vi kan titta på ett exempel på hur förfalskningen görs.

Bilden är intressant eftersom vi från bevarade nyheter från 1900 – 1940 har mänder av belägg för att glaciärer har smultit, polarisarna krymte och situationen var mycket lik den idag. Från ca. 1950 fram till ca. 1965 sjönk temperaturen med ca. 0,6 grader vilket gav upphov till spekulationer om en kommande ny istid. Vi kan egentligen inte se någon betydande sjunkande temperatur alls i GISS kurva. Var den amarikanska vetenskapsakademins rapport  ovan någon typ av social sinnessjukdom eller var temperaturmätning på 1960-talet något så svårt att behärska att forntidens människor måste ha gjort stora fel som man måste korrigera?

Temperaturen i Reykjavik på Island

Islänningarna har mycket klart meddelat att deras temperaturdata har justerats på bästa sätt enligt förändringar i stationens läge, eventuella termometerbyten etc. och att vidare justeringar av denna orsak inte skall göras.

Reykjavik_ojusterad

Bilden ovan visar temperaturen som den mätts i Reykjavik före justeringar. Meteorologerna på Island anger att inga ytterligare justeringar skall göras. Notera hur temperaturen på 1930-talet ligger på ungefär samma nivå som idag. Variationerna på 1930-talet var eventuellt större än idag.

Reykjavik_unadj_adjusted

Temperaturen i Reykjavik efter att GISS (ghcn) har gjort sina justeringar (svart kurva). Värmeperioden på 1930-talet har i praktiken försvunnit.

Där den svarta GHCN V3 justerade, homogeniserade kurvan börjar är justeringen strax över en grad C. Till vänster om den svarta kurvan stiger justeringen till ca. 2 grader C (taget ur kurvan).

Hur ser då temperaturjusteringen ut? Vilka är de stationsförändringar i omgivningen som skulle kräva nedanstående förändringar som alltså Islänningarna anser att inte skall göras:

GISS_Reykjavik_justeringar1930-2018

Kurvan fås genom att ladda ner numeriska data för den justerade svarta kurvan i föregående bild och räkna differensen mot råa mätdata.

Sorry det finns inga stationsförändringar som hederligt skulle kunna ge denna typ av justering. Av en slump (/sarc) så justerar ovanstående kurva bort 1930-talets värmeperiod exakt såsom man diskuterade i mailet ovat. Vi vet att Islänningarna är mycket bra på fotboll men jag gissar nog att de inte ens i övningssyfte har burit Reykjaviks temperaturmätstation med sig på ryggen då de har övat med tanke på de våldsamma justeringarna (/sark).

Albert Einstein lär någongång ha sagt:

No amount of experimentation can ever prove me right; a single experiment can prove me wrong.

Översatt ungefär:
Inget experimenterande kan någonsin bevisa att jag har rätt. Det räcker med ett enda experiment för att bevisa att jag har fel.
Exemplet ovan (som inte på något sätt är unikt) visar tydligt att dagens historiska temperaturuppskattningar är tagna ur luften och de fakto fabricerade. Man har justerat mätta data så att de skall motsvara den bild man vill ha. I detta fall är justeringarna större än hela den påstådda uppvärmningen. Jag tror faktiskt inte att meteorologer och fysiker för mindre än hundra år sedan inte skulle ha klarat av att mäta luftens temperatur.
Min uppfattning är att om man en gång har blivit blåst så kan detta förlåtas. Att gång på gång bli blåst bevisar blåögdhet eller dumhet. Det faktum att eliten i världen har resurser och möjlighet till denna typ av Orwellska datamanipulationer och det faktum att den tredje statsmakten d.v.s. nyhetsmedia låter denna typ av förfalskningar passera utan ett knyst visar att vi har skäl att allvarligt ifrågasätta också andra nyheter vi överöses med varje dag.
Eftersom jag nu har ett kalkylark med data från Reykjavik så kan det vara intressant att jämföra 1930-talets värmeperiod (1930-1949) för Reykjavik med motsvarande period i nutiden (1998-2018). Jämförelsen gäller alltså rådata d.v.s. de temperaturer meteorologen på 1930-talet avläste från en MAX/MIN termometer jämfört med motsvarande mätningar i vår tid.
Värmeperioden i Reykjavik på 1930-talet låg på en medeltemperatur på ca. 5,5 grader C och motsvarande period i nutiden ligger på 5,6 grader. Temperaturökningen under tiden 1930 – 2018  d.v.s. under 88 år har varit ungefär 0,001 grad per år vilket naturligtvis måste uppfattas som extremt skrämmande eftersom talet innehåller så många nollor (/sark).
Notera att man under tiotals år har poängterat att uppvärmningen på nordliga breddgrader bör bli betydligt större än i tropikerna (polar förstärkning). En enkel fråga är då:
Varför kan man inte se ifrågavarande temperaturstegring i vårt specifika fall för en så lång period som 88 år?  Giss justerade temperaturdata från Reykjavik ger en uppvärmning på 0,94 grader C vilket ligger mycket nära motsvarande temperaturskillnad plockad visuellt från bilden över temperaturen i den extratropiska norra hemisfären.  Skall jag tolka detta som att bilden av temperaturutvecklingen på norra hemisfären i medeltal har genomgått samma massage som Reykjavik?
Ett annat kanske korrektare sätt att se på bild ett är att vi precis som bilden anger faktiskt har en antropogen uppvärmning på nästan en grad sedan 1930-talet. I stort sett hela uppvärmningen är en följd av antropogen justering av mätdata  d.v.s. människor är orsak till uppvärmningen som gjorts så att resultatet skall bli det politikerna vill ha. Vem betalar kalaset och varför?

Andra stationer:

Notera att alla nedanstående uppskattningar inte är beräknade ur numeriska data. Stationer där jag ger årsintervall har kontrollerats som medeltal över 20-års perioder. Övriga är uppskattade ur GISS grafer där GISS har plottat både rådata och justeringar.
Sodankylä (Finland, clean, rådata motsvarar helt GISS justerade och homogeniserade data). Jag har under många år regelbundet återkommit till temperaturen i Sodankylä för att kontrollera att dessa data inte förfalskas. Det är mycket hedervärt att jag aldrig har kunnat se förfalskning av finska data.

Angmagssalik (Grönland, clean, rådata motsvarar helt justerade och homogeniserade data).

Gothab Nuuk (Rådata 1930-1950 = -0,62,  1998-2018 = 0,63 d.v.s. ingen förändring på ca 80 år)

Gothab-Nuuk (GISS justerade åren 1930-1950)= -1,37, åren 1998-2018 = -0,59, Delta=-0,78)

Malaye Karmaku (Ryssland, Novaja Zemlja) historiska data har justerts ned ca. -1 grad.

Akureyri (Island) 1930-talet nedjusterat ca. -2 grader C.

Stykkisholmur (Island) 1930-talet nedjusterat med ca. -0,6 grader.

Archangelsk (Ryssland) 1930-talet nedjusterat med ca. -0,5 grader C.

Prince Albert (Canada) 1930-talet nedjusterat med ca. -1 grad C.

Isla Juan Fernandez (Chile) 1930-talet nedjusterat med ca. -0,7 grader C.

Pudahuel (Chile) 1930-talet nedjusterat ca. 0,7 grader C.

Salta Aero (Argentina) början av 1900-talet nedjusterat mer än -2 grader C.

Bahia Blanco Aero (Argentina) 1930-talet nedjusterat med -1,3 grader.

Santa Cruz Ae (Argentina) sjunkande temperatur 1950-1960 höjd med ca +0,5 grader C. Plockar bort sjunkande temperatur efter 1950.

Capetown (Sydafrika) början av 1900-talet -1,7 grader.

Port Elisabeth (Sydafrika) början av 1900-talet sänkt med -1,4 grader C.

Antananarivo (Madagaskar) 1930-talet sänkt med -1 grad och 1980-talet höjt med ca 1 grad C.

Port Blair början av 1900-talet -1 grad C.

Alice springs (Australien) början av 1900-talet -2 grader C.

Nome (Alaska) 1930-talet ner ca. -0,7 grader C.

St. Paul (utanför Alaska) 1930-talet ner -1 grad.

Punta Arenas (Chile) 1930-talet ner -0,7 grader C.

O.s.v.  jag tycker mig se en trend och trenden är att storleksordningen på justeringarna ungefär motsvarar den påstådda uppvärmningen under 1900-talet fram till vår tid. Det är skäl att komma ihåg att dagens uppskattning är att temperaturen sedan ”förindustriell tid” har stigit med 0,8 – 1 grad C. Är faktiskt mätdata så urusla att korrigeringarna är större än hela den signal man försöker mäta? Vilket värde har temperaturdata där korrigeringarna är större än mätsignalen?

Notera att ovanstående lista över justeringar inter har genomgått Peer review 😉 men uppgifterna kan enkelt kontrolleras genom att gå till:

https://data.giss.nasa.gov/gistemp/stdata/

Kom ihåg att välja datatyp (uadj=ojusterad, adj=olika varianter av justerad). Notera att mätserierna ofta är homogeniserade endast en del av mätperioden.

 

Fasta #2

23/02/2019

Jag skrev en annan artikel på finska som behandlade samma frågor som min tidigare artikel om fasta på svenska. Den finska varianten bygger på ett annat material varför det kan vara vettigt att presentera samma artikel också på svenska. Den här artikeln bygger på material av dr. Jason Fong samt delvis på den tidigare artikeln på svenska.

Vilket är målet för fasta

Då människan för många årtusenden sedan som samlare/jägare vandrade över jorden så fanns det inte möjligheter att lagra mat för lång tid. Kroppens förmåga att skapa ett eget matförråd i form av lagrat fett var extremt viktigt.

Om vi tänker på vårt eget klimat så var sensommaren och början på hösten en period då det fanns väldigt mycket frukter och bär tillgängliga. Resultatet av en våldsam konsumtion av socker och kolhydrater var att människorna snabbt lade på hullet vilket var en önskvärd följd av festandet på frukter och bär eftersom ymnighetstiden snart skulle följas av en period av begränsad mattillgång.

Kroppen signalerar till sina celler att fett borde lagras i fettcellerna genom hormonet Insulin. Då alltså den forntida människan åt mycket söta frukter så steg blodsockernivån vilket kroppen kompenserade med att höja insulinnivån. Den höga insulinnivån tolkas av kroppen som en order att lagra fett i fettcellerna. Man kan säga att personen hamnar i något som kan liknas vid ett förstadium till diabetes … vilket naturen under vintern botade då det endast fanns begränsad tillgång till kolhydrater vilket tvingade kroppen att utnyttja de egna fettreserverna.

Då människan fastar d.v.s. då den urtida människans matförråd var slut så reagerar kroppen inte genom att minska på energikonsumtionen t.ex. genom att göra personen slö och trött utan ämnesomsättningen stiger och hjärnansfunktion skärps. Orsaken till detta är naturligtvis att om människan skulle ha blivit slö av hunger så skulle det idag inte finnas människor till följd av naturens urval. En fysiskt och psykiskt trött människa klarar inte av att skaffa mat till sin svältande familj! Ämnesomsättningen och kroppens prestationsförmåga stiger under fastan och hjärnans verksamhet skärps … det är precis det här allerta jakttillståndet vi eftersträvar!

Fasta och att minska på maten

Många tror att fasta helt enkelt är en mental övning där man tvingas äta mindre. En fasta av denna typ är mycket ineffektiv och den ger inte det fysiska och psykiska välbefinnande som en lyckad fasta för med sig. Varför når jag inte målet endast genom att äta mindre?

Om jag äter mindre men maten jag äter är likadan som före fastan (vi antar västerländsk kolhydratrik standardmat) så kommer jag vid varje tillåtet mål mat att höja socker- och insulinnivåerna så att fettförbränning förhindras. Kroppen märker att insulinnivån är så hög att det inte lönar sig att ta ut fett ur förråden … å andra sidan så märker kroppen att det kommer in mindre mängder mat än tidigare och att det verkar finnas för lite tillgänglig energi. Om kroppen inte har tillgång till fett (blockerat av insulin) så sköter kroppen problemet genom  att sänka ämnesomsättningen så att mindre energi behöver användas. Resultatet är tvärtemot det vi eftersträvar då ämnesomsättningen sjunker blir jag trött, jag fryser och jag är inte mentalt så skarp som jag kunde vara. Orsaken till problemet är att jag fortsatte att äta socker och kolhydrater.

En hälsosam skön fasta imiterar t.ex. björnens vintersömn. Björnen hamnar under höstens festande på frukter och bär i ett tillstånd man kan kalla fördiabetes men då frukter och bär inte längre är tillgängliga så går björnen i ide och den får inte i sig kolhydrater över huvudtaget. Efter någon dag har ämnesomsättningen gått över till att endast utnyttja kroppens fettförråd och samtidigt reparerar kroppen de skador det myckna sockerätandet åstadkom. Efter några månaders fasta vaknar björnen betydligt lättare än tidigare men den är i gott skick och klar i huvudet och färdig att hitta ett lämpligt byte.

Vår tids människas problem är att höst och vinter inte leder till att fyllandet av fettförråden avslutas. Vi äter så mycket socker och snabba kolhydrater att kroppens enda möjlighet att hantera situationen är att producera stora mängder insulin. Som jag nämnde ovan så är en av Insulinets funktioner att signalera till kroppens celler att socker skall omvandlas till fett och lagras i fettcellerna. Mängden fett stiger kontinuerligt eftersom kroppen till följd av en hög insulinnivå inte kan utnyttja de egna fettförråden.

JasonFungInsulinCop

Kolhydrater är en snabb energiform för kroppen. Vi kan jämföra kroppens sockerförråd med ett kylskåp som är lättåtkomligt i köket. Det är lätt att hämta en munsbit ur kylskåpet då man blir hungrig. Man kan likna kroppens fettförråd med en frysbox placerad nere i källaren bakom en låst dörr. Låset kontrolleras av kroppens insulin. Endast om insulinnivån är låg så kan dörren öppnas och fett tas ut ur förråden.

JasonFung_burn_fat_from_Hall

Fastans stadier

Under fastans första skede är socker- och insulinnivån höga och kroppen gör relativt snabbt slut på det socker som finns i kroppen. Sockernivån sjunker och själva processen att sockernivån sjunker tolkas av hjärnan som att jag är hungrig och jag vill ha mat … helt oberoende av om jag har tjocka lager fett lagrat kring midjan.
Under det första dygnet, om ingenting ätes, så sjunker insulinnivån så mycket att kroppen kan öppna fettförråden och kroppen börjar hämta s.k. Ketoner ur förråden. Ketoner kan användas direkt av kroppens celler och även av hjärnan på samma sätt som glukos (socker). Det behövs nu mycket lite socker och det socker kroppen behöver kan levern tillverka ur fett. Sockernivån når nu en konstant nivå vilket leder till att hungersignalen från sjunkande sockernivå inte längre fås. Resultatet av övergången till fettförbränning är att kroppen uppfattar att det är tid att skärpa sig och gå ut på jakt … och under jakt får endast den mest skärpta ett bra byte! Kroppens ämnesomsättning ökar och hjärnverksamheten skärps! Fett används nu av kroppen som bränsle och hjärnan fungerar på maximal nivå!

MetabolicChange4DaysFasting

Vi ser hur övergången till fettförbränning kräver en relativt lång tid. Efter ungefär ett dygn börjar socker- och insulinnivåerna att ha nått ett stabilt lågt värde och först då börjar kroppen övergå till fettförbränning. Alla kolhydrater gör att övergångsperioden förlängs. Ätande av fett höjer sockernivån mycket obetydligt varför det lönar sig att byta kolhydraterna mot fet mat.

Vad kan gå fel? Det största felet är att förhindra kroppen att gå över i fettförbränningsläge. Det effektivaste sätter att förstöra fastan är att börja dagen med en stor sats kolhydrater. Kolhydraterna höjer socker- och insulinnivåerna och förhindrar fettförbränning. Följden av att vi höjer sockernivån på morgonen är att kroppen igen efter någon timme uppfattar att sockernivån sjunker vilket tolkas som hunger. Ätande av kolhydrater mongon och kväll blockerar effektivt en övergång till fettförbränning. Jag kommer då in i ett jo-jo-fastande där jag varje dag kommer att känna mig hungrig, frusen och nedstämd.

Om jag följer bahaitraditionen där man fastar mellan solens uppgång och nedgång så är lösningen enkel. Jag sänker kolhydratintaget så mycket som möjligt genom att lämna bort allt socker, gärna allt bröd, potatis, ris etc. Jag byter ut kolhydraterna mot t.ex. ägg, avocado, nötter, feta ostar, smör. Fettet i sig skickar en signal till hjärnan att jag är mätt vilket kompenserar signalen från fallande blodsocker. På kvällen används samma metod d.v.s. kolhydraterna ersätts med fet mat och sallad, gurka, tomat etc. Vi kan på detta sätt förhindra att blodsockret stiger vilket gör att hungersignalen från sjunkande blodsocker blir allt svagare … och nu bränns eget fett från kroppens förråd.

MetabolicChangeFasting

Resultatet av en snabb övergång till förbränning av fett är att hungerkänslan minskar eller försvinner samtidigt som kroppen mår mycket väl och sinnet skärps. Lägg märke till hur kroppsvikten snabbt börjar sjunka trots att ämnesomsättningen snabbas upp. Den mänskliga jägaren är nu i topptrim för att gå ut och jaga för att på detta sätt lösa familjens matproblem.

Här finns en länk till dr. Jason Fongs video om terapeutiskt fastande.

 

Selkävaivat ja C-vitamiinin puute

07/02/2019

Kommentar till mina läsare:
Jag skriver undantagsvis på finska eftersom jag egentligen vänder mig till en vän som kan behöva den här informationen. Artikeln behandlar varför C-vitaminbrist kan vara orsak till rygg och ledproblem samt vad man kan göra för att eliminera orsakerna till problemen.

Mihin keho tarvitsee C-vitamiinia

Noin 30% kehon painosta on kollageenia eli ”liima-aine” josta keho tekee jänteitä, osana luustoa, muodostaa nivelten liukupinnat, iho … jne. Kyseerssä on siis kehon universaalirakennusaine.

Jos artikkeli käsittelee C-vitamiin tarve niin miksi aloitan kollageenista? Syy on siinä, että kollageeni muodostuu proteiinikuitukimpuista jotka on kierrettu kolmen kuidun naruksi ja vahvistettu ”hitsaamalla” kuidut yhteen c-vitamiinilla. Tyypillisessä kuitukimpussa kuiti hitsataan joka kolmas kierros.  Kun tarkastellaan kollageenin rakenne kemiallisesti ja todetaan, että jokaisen hitsin muodostamiseksi tuhotaan yksi c-vitamiinimolekyyli niin voidaan laskea, että kollageenisynteesiin tarvitaan karkeasti yhtä paljon c-vitamiinia kuin muodostettava kollageenimäärä. Mikäli c-vitamiinia ei ole tarpeeksi niin kollageenia muodostuu edelleen mutta laatu huononee askel askeleelta kun yhä enemmän ”hitsejä” jää tekemättä.  Kun c-vitamiinin saanti vuorokaudessa putoaa 50 mg alapuolelle niin voidaan laskea, että ehkä  joka sadasviideskymmenes ”hitsi” on paikalla. Muodostunut kollageeni on nytt verrattavissa pumpulituppiin ja kun tällaista huonolaatuista kollageenia käytetään verisuonten seinämiin niin seinämä vuotaa eli alkaa tulla mustelmia ilman ”syytä”. Kollageeni on liima joka pitää hampaat kiinni alustassa suussa. Kun kollageeni on huonoa hampaat irtoavat. Kun kollageeni on huonolaatuista niin nivelpinnat eivät enää kestä rasitusta ja luu alkaa hangata suoraan luuta vastaan.  Selkärangan välityynyt vaativat hyvälaatuista kollageenia koska muuten voi muodostya pullistumia (kuva alla) jotka erittäin kivuliaasti painavat hemoja. Psyykkisesti c-vitasmiinin puute aiheuttaa vakavaa masennusta.

Yllä kuvattu oiresarja kuvaa tyypillisiä keripukin oireita mutta samalla oireita jotka ovat melko tyypillisiä nykyihmisillä jotka ovat keski-ikää vanhempia. Tiedämme esim. , että hammaslääkärit ahkerasti mittaavat ientaskut koska tästä voidaan ennakoida hampaan irtoaminen. Entäs jos suuri joukko oireita loppujen lopuksi ovat kroonisen keripukin oireita. Lääketieteessä on laitettu päivittäinen C-vitamiinitarve älyttömän pieneksi (2x keripukiraja). Asia pahenee koska tiedetään, että sokeri ja c-vitamiini kilpailevat kehossa ja suuri sokerikulutus pienentään kehon käytettävissä olevat c-vitamiinivarat. Tämä johtuu siitä, että sokerimolekyyli ja c-vitamiinimolekyyli muistuttavat toisiaan paljon … koska eläimet tuottavat c-vitamiinia sokerista. Ihmisen kohdalla on pieni ongelma. Ihmisen c-vitamiinisynteesi tarvitsee useita kemiallisia askelia ja viimeinen näistä on rikki eli Ihminen, Apinat, Marsut ja muutama laji lisää eivät pysty itse tuottamaan c-vitamiinia vaan joutuvat hankkimaan c-vitamiinia ruoasta.

Kuva:  Selkärangen välilevyn pullistuma joka painaa hermon juurta. Hyvin kivuliasta.

Miten paljon c-vitamiinia tarvitaan

Tiedetään, että jos ihmisjoukolle annetaan 60 mg c-vitamiinia päivässä niin 70% näillä ei ole keripukioireita. Kääntäen RDA varmistaa, että kolmellakymmenellä prosentilla on joitakin keripukioireita. Kysymys, miksi suositus on laitettu näin alas, vaatii erillisen artikkelin mutta olen sitä mieltä, että tällä tavalla varmistetaan jatkuva vuo uusia potilaita lääketeollisuudelle (Onko RDA raja järkevä (englanniksi)).

Jos RDA 60 mg johtaa tilanteeseen jossa huomattava osa ihmisjoukossa edelleen oireilee eli ovat keripukin partaalla niin mikä olisi järkevä taso joka pitäisi keripukioireet kunnolla loitolla? Yksi tapa on tarkastella miten paljon c-vitamiinia eläimet tuottavat. Esim. 80 kg painava vuohi tuottaa noin 15g c-vitamiinia.  Tiedetään, että luonnollisessa ympäristössä elävä gorilla syö noin viisi grammaa c-vitamiinia päivässä. Eli jos oletetaan, että me kemiallisesti toimimme kuin eläimet niin määrä tämän pohjalta voisi olla ainakin muutama gramma c-vitamiinia päivässä.

Totesin yllä, että kollageenin muodostamiseen kuluu karkeasti yhtä paljon c-vitamiinia kuin muodostunut kollageeni. En mene kemiallisiin yksityiskohtiin vaan pidetään tämä yhtenä oletuksena. Lääketieteessä on jonkunlainen ”konsensus”, että ihmiskeho uusiutuu karkeasti seitsemässä vuodessa. On selvää, että jotkut elimet uusiutuvat paljon nopeammin ja toiset hitaammin. Jos oletetaan, että seitsemän vuoden uusiutumisvauhti on karkeasti oikea niin voidaan laskea c-vitamiinitarve tästä.

Oletetaan, että keho painaa 80 kg josta kollageenia silloin on noin 24 kg (30%).

Jos keho uudistuu seitsemässä vuodessa niin pitäisi päivittäin muodostua kollageenia seuraavasti:

Päivätuotanto (kollageeni) = 24kg/(7*365pv) = 0.0093 kg/päivä.

Eli päivässä muodostuu hieman alle kymmenen grammaa kollageenia. Totesin yllä, että tarvitaan vastaava määrä c-vitamiinia hyvänlaatuisen kollageenin muodostamiseksi eli tämän karkean laskelman mukaan tarvitaan noin 9,3g c-vitamiinia päivässä. Huomaa toki, että tarve on vielä suurempi koska kehon immunijärjestelmä tarvitsee myös c-vitamiinia toimiakseen. Laskettu karkea arvio täsmää melko hyvin eläinten c-vitamiinituotantoon. Tiedetään, että osa c-vitamiinista hajoaa suolistossa ennenkuin pääsee kehoon eli voitaneen vielä nostaa tarvittava määrä. Kemian nobelin palkinnon saanut Linus Pauling, joka on pidetty maailman suurimpana kemistina, söi 18g c-vitamiinia päivässä ja perusteli tämä nimenomaan sillä, että vain osa on hyödynnettävissä … hän eli 93 vuotiaaksi.

Selän vahvistaminen, korjaaminen c-vitamiinilla

Jos selkärangan välilevyn materiaali, kollageeni, on huonolaatusta niin välilevyn kuormittaminen nostamalla, kiertämällä selkä voi aiheuttaa välilevyvaurion, pullistuman, joka vai painaa hermoa. Vaurioitunut välilevy paranee usein itsestään kunhan ei aiheuteta lisää vaurioita mutta paranemiseen voi mennä pitkä aika.

Entäs jos osasyy vaurioon olikin huonolaatuinen kollageeni joka taas oli c-vitamiinipuutoksen seuraus. Tuntu silloin selvältä, että lisäämällä c-vitamiinia niin keholle annetaan paremmat mahdollisuudet korjata vaurio koska ainakin korjaukseen käytetty aine on hyvälaatuista.

Mikä olisi päivittäinen c-vitamiinimäärä? Nähtiin yllä, että esim. vuohi tuottaa jopa 15g c-vitamiinia päivässä (kerhon paino 80 kg). Järkevää olisi silloin varmasti kokeila 4-5g ja tästä hitaasti nostaa annos. Jos alkaa tulla ripulia niin annos on noussut liian korkeaksi.

Yleinen näkemys on, että oikea c-vitamiinitaso löydetään ns. titraamalla eli nostetaan annos hitaasti kunnes alkaa tulla ripulia jonka jälkeen annos puolitetaan. Tämä on karkeasti haluttu taso. Toinen tapa on lähteä samalle tasolle kuin eläimet eli 80kg painavi henkilön päiväannos olisi silloin n. 10g.

C-vitamiini varastoituu huonosti kehoon ja ylimääräinen c-vitamiini poistuu virtsalla joka voi saada hedelmätuoksun ylimääräisestä c-vitamiinista. Koska ylimäärä poistuu virtsalla niin c-vitamiini tulisi ottaa jaettuna annoksena läpi päivän esim. aamulla, päivällä, iltäpäivällä ja illalla. Itse yritän ottaa 2,5g aamulla, 2,5g päivällä ja 2,5g illalla. Joskus voi tulla annos lisää tai pudota pois.

Missä muodossa c-vitamiini kannattaa ottaa

C-vitamiinin kemiallinen nimi on Askorbiinihappo. Pieniä määriä voidaan haluttaessa ottaa askorbiinihappona mutta yllä kuvatut usean gramman annokset ei missään nimessä tulisi ottaa raakana askorbiinihappona vaan tehdään Samariini-tyyppinen juoma sekoittamalla yksi teelusikallinen askorbiinihappoa, yksi hieman pienempi teelusikallinen ruokasoodaa vesilasiin. Tästä saadaan hyvänmakuinen kivennäisvesi joka tuo keholle noin 2,5g c-vitamiinia. Toinen vaihtoehto on käyttää 1000mg poretabletteja ja näitä voi veden kanssa ottaa 3-5 päivässä. Poretablettiin on lisätty soodaa valmiiksi.

Miten nopeasti nähdään tuloksia

Krooninen puutostila joka eiheutti esim selkä, sydän tai nivelvaivat ovat kehittyneet hitaasti vuosien yli. Nähtiin yllä miten kehon korjausmekanismin kierrosaika on noin seitsemän vuotta. Vaurioiden korjaaminen vaatinee tästä syystä melko pitkän ajan vähintään viikkoja tai kuukausia. Toisaalta tiedetään, että c-vitamiini myös toimii luonnollisena kipulääkkeenä eli oireet saattavat parantua melko nopeasti.

Itse olen vuosia syönyt noin 5-10g c-vitamiinia päivässä ja kokemukset ovat seuraavat:

  • Ei ole ollut selkävaivoja vuosiin
  • Nuoruudessa pyöräilystä tulleet polviongelmat ei ole haitanneet sen jälkeen kun olen ryhtynyt syömään paljon c-vitamiinia.
  • Hammaslääkärikäynnit ovat vähentyneet … ei näytä enää televan reikiä. Oletan, että tämä johtuu siitä, että kollageeni tarvitaan elävän hampaan huokoisten kanavien tukkimiseen ulkopinnassa. Mikäli kollageenia ei ole niin bakteerit pääsevät helposti hampaan sisälle.

Mitä kannattaa välttää

Totesin yllä, että puhdas c-vitamiini tulisi ottaa ruokasoodan kanssa jolloin c-vitamiini kemiallisesti muuttuu askorbaatiksi joka on pH mielessä neutraali. Olen kokeillut itselleni ja koiralleni puhdasta Askorbiinihappoa mutta näyttää siltä, että muutamassa päivässä alkaa tulla esim. varpaiden niveliin oireita jotka olen tulkinnut kihtin alkuoireiksi. Kihti muodostuu kun kehossa on ylimääräistä virtsahappoa yhdistettynä alhaiseen pH arvoon. Tilanne korjaantui heti ruokasoodan kanssa joka nostaa pH-arvon. Tämä voi ihan yleisestikin olla järkevä tieto ihmisille joilla on kihtia. Puoli teelusikallinen ruokasoodaa veteen ja juodaan kivennäisveden tapaan poistaa oireet muutamassa tunnissa. Toisaalta ei kannata menna soodan kanssa liiallisuuksiin koska ruoansulatus tapahtuu happamassa ympäristössä eikä haluta vaikuttaa mahan toimintaan.

Huomaa, että c-vitamiinista keho myös tuottaa virtsahappoa eli suuret c-vitamiiniannokset nostavat jonkun verran virtsahapon määrä kehossa.

Mikä on yllä oleva c-vitamiiniannoksen suhde RDA:han

Jos oletetaan, että päiväannos laitetaan kuuteen grammaan niin puhutaan annoksesta joka on noin satakertainen verrattuna RDA:han. Tämä annos on yleensä täysin ok ja keho ilmoittaa itse milloin annos on liian suuri (ripuli). Laskennallisesti tämä tarkoittaisi, että vähän enemmän kuin joka toinen ”kollageenihitsi” on paikalla eli pitäisi olla suhteellisen hyvälaatuista kollageenia.

Entäs jos syön vähän enemmän hedelmiä

Tyypillinen keskikokoinen appelsiini sisältää noin 70 mg c-vitamiinia. Jos kuuden gramman c-vitamiiniannos yritettäisiin saada appelsiineja syömälla niin tarvittaisiin:

Appelsiinejä päivässä = 6g/0.07g = 85 appelsinia päivässä.

On ihan selvää, ettei kannata edes yrittää saada isompi annos c-vitamiinia hedelmiä syömällä koska silloin elämä olisi kuin gorillan elämä jossa suuri osa päivästä menee syömiseen. On ihan eri asia, että järkevä hedelmämäärä on hyväksi. Liiallinen hedelmien määrä, esim. yllä kuvattu 85 appelsiinin syönti päivässä ja päivästä toiseen, todennäköisesti pitemmällä tähtäimellä aiheuttaisi rasvamaksan samaan tapaan kuin alkoholin suurkuluttajalle. Syy  on hedelmäsokeri (fruktoosi) joka keho käsittelee maksassa suunnilleen samalla tavalla kuin alkoholi.

Yllä olevan c-vitamiinin lisäksi voi olla hyödyllistä ottaa erilaisia B-vitamiineja (B12). Löytyy esim. poretabletteja jossa on pieniä annoksia erilaisia erilaisia B-vitamiineja. Talvella voi olla järkevää ottaa jonkun verran D, E ja mahdollisesti K-vitamiinia. Magneesiumi on aina tarpeen …

Englanninkielistä lukemista:

Selkärangan ahdistuma (stenosis).

Äggplotter, bygg själv!

05/02/2019

Det är alltid kul att lära sig något nytt och att tvingas motionera de små grå cellerna innanför det grå håret med problemlösning och felsökning av något man aldrig har lekt med tidigare.

Det är snart påsk igen, som baha’i ser jag fram mot baha’i nyår Naw Ruz … i båda fallen har ägg en plats i måltiderna i anslutning till dessa högtider. Det är för övrigt intressant att se hur många sedvänjor med en ursprungligen Zoroastrisk bakgrund (från det antika Persien) lever kvar i olika sedvänjor från Afghanistan till Spanien. Sedvänjorna har helt enkelt modifierats så att de passar ihop med den lokala religionen varefter man kan glömma varifrån sedvänjorna kommer.

I den Nordiska traditionen hör ägg, ofta snyggt målade, till påsktraditionen. Man färgar ägg på olika sätt. Själv minns jag hur man kokade ägg tillsammans med lämpliga växter för att ge äggen en trevlig färg. Senare har jag många gånger ritat figurer på ägg tillsammans med barnen. Vad är då naturligare än att använda moderna hjälpmedel för att göra mera avancerade utsmyckningar t.ex. i form av geometriska mönster som är alltför arbetsdryga eller komplicerade för att göras för hand.

Videon ovan visar en Ägg skrivare som dock ser relativt komplicerad ut 🙂 . Det här projektet använder dock betydligt bättre, och dyrare stegmotorer än vad jag använde.

Jag hittade en variant som kan skrivas ut med 3d skrivare och som såg snygg och väl genomtänkt ut. Bygget av den varianten och problem i anslutning till detta bygge beskrivs i den här artikeln. Jag utgick från den här äggplottern:

Vad behöver jag för projektet

Filerna som behövs för 3d utskrift av mekaniken hittar man på thingiverse i form av en stl-fil. Stl är en beskrivning av hur de mekaniska delar som skall skrivas ut med 3d skrivare ser ut. Innan skrivaren kan skriva ut komponenten måste stl-filen vidarebehandlas av ett lämpligt program som skär upp föremålet i en serie skikt  som 3d skrivaren sedan kan rita ut skikt för skikt och på såsätt långsamt bygga upp hela det föremål som skrivs ut. Jag använder programmet slic3r för att vidarebehandla stl-filen. Skrivarprogrammet jag använder är Repetier-Host V1.6.2.

Problem #1

Min 3d skrivare klarar av att skriva ut föremål med dimensionerna ca. 200x200x200 mm³.  Det visade sig att alla delar till Ägg skrivaren fanns i samma fil som kräver en betydligt större skrivare än den jag har. Alternativen är då att antingen hitta någon firma med en skrivare med tillräckligt stor byggyta … eller att modifiera stl-filen så att bitarna kan skrivas ut på min skrivare. Jag valde det senare alternativet.

Då jag själv konstruerar föremål som skall skrivas ut på 3d skrivare så använder jag programspråket openscad för att designa föremålen. Jag kan enkelt läsa in en stl-fil i openscad:

storbit1

Jag använder helt enkelt kommandot import( … ); för att läsa in stl-filen som ett enda stort föremål. Därefter använder jag kommandot difference() på den inlästa filen och använder stora lådor (klossar) som skär bort de delar jag  för tillfället inte vill se. Det spelar inte någon roll på vilket område på skärmen den kvarvarande delen finns, den centreras automatiskt av skrivaren.

Jag klippte söner stl-filen i tre olika föremålsgrupper d.v.s. skalet blev två olika bitar och de små mekaniska delarna blev en egen grupp. De olika beskurna delarna skrevs sedan ut separat. Jag antar att motsvarande funktionalitet finns i de flesta CAD-program som stöder 3d utskrift.

Utöver plastdelarna behövde jag två stycken små kullager, skruvar i olika dimensioner som jag klippte till lämpliga längder med hjälp av en Abico-tång. Lager hittade jag på en lokal järnaffär och skruvar har jag på lager i olika dimensioner.

Hopplockning av styrelektroniken

Skalet är konstruerat för en Arduino UNO med stor USB (typ B) kontakt. Jag har olika varianter av processorkortet på lager så jag valde helt enkelt en som fysiskt var kompatibel med en Arduino Uno. Processorkortet kostar kanske sex dollar på ebay.

Ett litet RC-servo av lämplig storlek hittade jag i miljonlådan (Tower Pro micro servo 9g). Ett servo kan beställas från ebay för någon dollar.

Jag hittade stegmotorn inklusive drivkort ULN2003 hos en elektronikaffär i Åbo och beställde den över nätet (https://www.triopak.fi/fi).

Jag monterade styrelektroniken utan att ännu bygga in den i det 3d utskrivna skalet. Jag ville enkelt kunna testa servot och stegmotorerna utan att ideligen öppna skalet på apparaten. Det började nu dyka upp problem …

Problem #2

Jag kunde utan problem kompilera drivprogrammet och ladda ner det på Arduinokortet. Då jag försökte få kontakt med äggskrivaren genom programmet Inkscape dök det upp problem. Ritprogrammet Inkscape för vilket det finns en tilläggsdel för att driva äggskrivaren verkade inte över huvudtaget kunna se Arduinoprocessorn.

Problemet visade sig bero på att då jag via min dator försöker komma i kontakt med Arduinon så skickar datorn via USB en DTR signal (data terminal ready) som på UNO är kopplad till Reset d.v.s. UNOn startade om då jag öppnade kommunikationen mot UNO. I sig är detta inget problem, jag behöver bara vänta på att Arduino Uno startar om varefter linjen är öppen och bör fungera i fortsättningen.

På en linuxdator söker Inkscape efter äggskrivaren genom att öppna en serieförbindelse i taget varefter programmet väntar på att UNO startar om varefter Inkscape skriver ‘v\r\n’ d.v.s. ber om äggskrivarens versionsinformation. Om svaret kommer inom en vettig tid så vet Inkscape var äggskrivaren finns och kan börja skicka kommandon till skrivaren. Orsaken till problemet är att en Linuxdator har tillgång till en stor mängd potentiella serieportar ocxh det krävs lång tid för att beta av alla portar … så lång tid att jag gav upp 😉 . Den lösning jag fastnade för var att läsa av om Arduino Uno var kopplad till min dator. Detta kan kontrolleras med hjälp av kommandot:

lsusb

Bus 002 Device 005: ID 248a:8367
Bus 002 Device 004: ID 046d:c52b Logitech, Inc. Unifying Receiver
Bus 002 Device 060: ID 1a86:7523 QinHeng Electronics HL-340 USB-Serial adapter
Bus 002 Device 002: ID 1a40:0101 Terminus Technology Inc. Hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub

Man kan enkelt identifiera den egna anslutna USB-enheten i mitt fall Arduino Uno-kortet genom att först ge kommandot lsusb utan att kortet är anslutet varefter man ansluter kortet och ger kommandot på nytt. Den nya rad som dyker upp innehåller den kod jag vill ha. Jag har märkt ut den aktuella raden med fet stil ovan.

Kommandot listar alla USB anslutna apparater på datorn. I princip har UNOn en unik identifikationsadress. Jag modifierade Inkscapes sökprogram så att det först tittade efter min specifika Arduino UNO innan den försöker söka igenom alla andra serieportar. Äggskrivaren hittas nu snabbt och bekvämt utan problem.

Eggbot tilläggsdelen för Inkscape finns i en linuxdator i katalogen:

~/.config/inkscape/extensions

Programmet jag modifierade var: ~/.config/inkscape/extensions/ebb_serial.py .

Jag lade in mitt Arduino UNOs id i raden:

if port[2].startswith(”USB VID:PID=1A86:7523”):

Koden 1A86:7523 fick jag från lsusb-kommandot ovan.

Problemet med att Arduino UNO startar om då en yttre enhet försöker ansluta över USB kan elimineras genom att bryta en förbindelse på kretskortet om Arduinon är en äkta Arduino Uno. I mitt fall är det fråga om en kopia från vilken man har lämnat bort den här egenskapen. Nackdelen med att kapa ifrågavarande hopptråd är att programmeringen blir besvärligare. Inom ca. en sekund efter att man börjar ladda upp program till Arduinon måste man trycka på reset på Arduinokortet … reset-tryckningen har eliminerats i Arduino Uno genom att låta DTR sköta saken men då dyker det upp ovanstående problem.

Problem #3

Min ena stegmotor av typen 28BYJ-48 var defekt. Stegmotorn råkade vara kopplad till armen som styrde pennan. Något kugghjul inne i motorns kuggväxel (64 ggr nedväxling) är defekt vilket leder till att motorn stoppar i ett specifikt läge.  Jag bytte ut motorn varefter det fungerade.

Problem #4

Då jag testade stegmotorerna med en verklig bild genom Inkscape så visade det sig att motorerna gick relativt varma och de snurrade endast i en riktning. Orsaken var att instruktionerna för hur styrsignalerna fron Arduino skulle kopplas till drivkortet var felaktiga. In/ut pinnarna 2,3,4,5 styr IN1, IN2, IN3 och IN4 på stegmotorns drivkort. Det visade sig att jag för korrekt funktion måste kasta om pinnarna 3 och 4. Kopplingen till stegmotorn blev då:

pin 2 –> IN1

pin4 –> IN2

pin3 –> IN3

pin5 –> IN4

På mitsvarande sätt måste pinnarna för den andra stegmotorn kopplas:

pin 8 –> IN1 (drivkort #2)

pin10–> IN2

pin9 –> IN3

pin11–>IN4

IMGP0849_mod.JPG

Bilden visar processorkortet Artduino UNO till vänster (blått) samt två stegmotordrivkort (vita) baserade på kretsen ULN2003. Drivkorten är inget stegmotorkontrollkort utan uttryckligen en serie transistorer som kan kopplas på och av under processorkontroll. Arduinin kontrollerar bitmönstret för varje steg.  För att en stegmotor skall stega måste en serie bestämda bitmönster genereras som genererar önskade magnetfält inne i stegmotorn och bitmönstrena måste skickas till motorn i korrekt ordning och ordningsföljden byter om man vill backa …

En stegmotorkontroller behöver egentligen endast två signaler steg och riktning en kontrollkrets kan oftast också justera strömmen genom stegmotorn vilket kan användas till bl.a. att justera motorns effekt och motorns temperatur. En riktig stegmotorkontroller innehåller egen intelligens och den genererar själv korrekta bitmönster för stegning framåt och bakåt. Det finns avancerade stegmotorkontrollers som också på egen hand klarar av att accelerera och decelerera. Man kan inte abrupt ändra stegfrkvensen på en stegmotor eftersom den då kan tappa bort steg vilket blir pinsamt om maskinen som styrs inte mäter den exakta positionen … vilket i allmänhet inte görs om man använder stegmotorer.

De fyrpoliga sladdarnas ledare i mitten (på de vita korten eller på arduino men inte båda) måste kastas om för att stegmotorn skall stega i båda riktningarna.

Efter att ett antal gånger ha plockat ihop äggskrivaren och sedan isär igen började grundfunktionerna se korrekta ut. Hålen i de 3d utskrivna mekaniska bitarna tenderade att vara för små vilket krävde filande samt varmluftsblåsare. Då ett hål nästan är korrekt kan man värma komponenten varefter man pressar på den med milt våld varvid passningen blir exakt. Någon bit värmde jag så mycket att den ändrade form vilket löstes genom att skriva ut en ny bit.

Ägghållaren vid rotationsstegmotorn använder en O-ring som friktionsyta mot ägget. Vid den fria axeländan som är kullagrad finns motsvarande något mindre O-ringsyta som trycks mot ägget med hjälp av en metallfjäder. Metallfjäderns längd kan justeras med hjälp av en mellanbricka som kan skrivas ut med 3d skrivare i olika tjocklekar. Tanken  är att ägget skall vara stadigt monterat men man får inte trycka så hårt att ägget går sönder. Det är extremt viktigt att ägget inte rör sig medan äggskrivaren skriver eftersom detta dödar all precision. Mer om injustering senare i artikeln. Jag är inte övertygad om att min konstreuktion som använder O-ringar nödvändigtvis fungerar speciellt bra. Tiden får utvisa och då måste något annat system prövas.

IMGP0858_mod.JPG

Pennans drivmekanik. Den lilla stegmotorn till höger i bilden vrider pennan kring centrum av ägget. Vi ser  den vita servoarmen som används för att höja/sänka pennan. Pennan trycks mot ägget av dess egen tyngd. Vi ser o-ringen  vid rotationsmotorn som fungerar som friktionsyta för att hålla ägget på plats.  Den fjäderbelastade hållaren för äggets spetsiga ända syns nere till höger.

IMGP0857_mod.JPG

Äggskrivaren sedd från en annan vinkel. Observera att pennans lyftservo är monterat på den vertikala armen som är monterad på stegmotorn i mitten.

Arbetsprocess för att rita på ett ägg

Vi använder programmet Inkscape som är ett öppet källkodsprogram som finns att ladda ner gratis för Windows, Masc och Linux. Jag kör sedan många år endast Linux och jag har inte ens Windows installerad på mina två arbetsmaskiner. Nedanstående är inte någon ingående instruktion för hur man använder Inkscape. Det finns goda instruktioner för detta om man googlar Inkscape.

Då vi monterar ägget är det viktigt att det är möjligast väl centrerat vilket vi kan kontrollera t.ex genom att utan penna vrida ägget ett varv. Detta kan vi enkelt göra genom att skapa en Inkscape bild med storleken 4070×800. Från dokumentets vänstra kant till dokumentets högra kant dras en rät linje mitt på dokumentet. Använd View/Zoom Out så att hela bildytan kan ses då strecket ritas från kant till kant.  Om vi utan penna ”skriver ut” detta dokument så kommer ägget att vridas 360 grader runt sin axel. Genom att hålla ett lämpligt föremål som referens mot skrivarbasen kan vi kolla om avståndet mellan referensföremålet hålls konstant genom varvet eller om avståndet varierar. Om vi sder betydande variationer lönar det sig att försiktigt flytta ägget vid någondera ändan så att felet blir så litet som möjligt. Det lönar sig att experimentera.

OneTurnInkscape

En hjälpbild som består av endast ett enda streck tvärs över bilden kan användas till att kontrollera att ägget roterar precis ett varv och att det sitter korrekt monterat utan att kasta av och an då det roterar.

Under Extensions/Eggbot/ hittar vi EggBot control. Med denna kontroll kan vi kontrollera att lyftning/sänkning av penna fungerar samt skriva ut en bild i Inkscape.  Vi börjar med att skriva ut (utan penna) vår räta linje för att kontrollera att ägget är centrerat och att det roterar precis ett varv.

Vi öppnar nu ett nytt dokument antingen så att vi skapar det själv eller så att vi laddar ner ett mönster vi gillar från nätet. Vi måste nu justera bildens storlek så att den precis fyller hela ägget utan att överlappa. För min skrivare med 28BYJ-48 stegmotorer och ULM2003 styrkretsar skall dokumentets storlek sättas till ungefär 4070(bredd) x 800 (höjd). Den bild vi har läst in kan manuellt justeras till den bredd vi vill ha.

Ett test av utskrift från Inkscape visar att skrivaren i princip fungerar men det är extremt viktigt att:

  • Ägget centreras korrekt så att det inte blir några kast då det roterar
  • Pennan ställs in till lämplig höjd så att den ritar också vid ytterlägena
  • Pennan ställs i mittläge innan ritningen påbörjas. Det finns annars risk för att pennan slår i ägghållaren i ändläget vilket kan lösgöra ägget delvis så att det gungar av och an.

Provritning gav resultatet nedan vilket inte ännu är så bra.

IMGP0863.JPG

Då man tittar noga på bilden ser man att det är en springa mellan ägget och tjockändans O-ring vilket gör att denna ända av ägget abrupt hoppar av och an med intressanta resultat vid utritningen.  Jag glömde att dra fast skruven som håller pennan vilket ledde till att pennan gungade av och an beroende av pennans rörelseriktning.

Jag kommer att modifiera tjockändans fastsättning för att åtgärda felen. Jag är helt optimistisk på att skrivaren ännu kommer att fungera helt OK.

Tack till alla kända och okända på nätet som har lagt ner mycket arbete på både utveckling av programvara och hårdvara.

Den extremt billiga och samtidigt kompakta stegmotorn 28BYJ-48 är inte bra till följd av att den är utväxlad. Kugghjulen i kuggväxeln är aldrig perfekta och speciellt i en sådan här billig motor så finns det glapp d.v.s. om vi ritar en linje i en rörelseriktning och sedan byter riktning så kommer det att finnas ett obestämt område till följd av glapp. Lösningen skulle vara bättre stegmotorer som inte är utväxlade men detta betyder samtidigt att en stor del av mekaniken måste förnyas. Byter man stegmotorerna så får man dock mycket bättre exakthet vid ritandet.

Modifierad fastsättning av ägget

Jag konstaterade ovan att ägget gungade av och an i upphängningen gjord av O-ringar. Orsaken var att O-ringens dimension i förhållande till ägget blev fel. Ägget låg antagligen delvis direkt mot ändplattan vilket gjorde att det kunde glida sidlänges vilket i sin tur gjorde ritandet mycket inexakt.

Jag hittade röda flaskkorkar av gummi (se bild nedan). I finland är det här traditionella korkar som man speciellt hittar på hösten vid saftningstider. Jag köpte en påse korkar och klippte sönder en som blev en ca. 7 mm djup mjuk ägghållare. Resultatet blev mycket bra och precisionen förbättrades radikalt.

IMGP0883.JPG

Med den modifierade hållaren blir ritandet reproducerbart, räta linjer som går runt hela ägget träffar startpunkten igen efter ett varv … något som inte hände tidigare.

IMGP0882.JPG

Notera den 3d utskrivna pennhållaren. Jag skrev också ut en hållare för tre pennor i vilka pennorna kan förvaras utan kork. Den extra pennadaptern gör det mycket enklare att montera pennerna exakt och lika för alla pennor.

Planerade vidare modifiationer

Det finns fortfarande ett tydligt kännbart glapp i pennans stegmotor till följd av stegmotorns växellåda med utväxlingen 1:64 d.v.s. stegmotorn roterar 64 varv då den utgående axeln roterar ett varv.
Jag beställde en Nema 13 stegmotor som har ungefär samma dimensioner som den nu använda 28BYJ-48 men helt utan utväxling.  Då jag får stegmotorn så planerar jag att först köra den med den existerande drivkretsen och om det fungerar OK så använder jag den. Alternativet är att jag byter ULN2003 drivkortet mot en kontroller av den typ som finns i dagens 3d-skrivare. Exempelvis A4988 eller DRV8825 av vilka jag uppfattar den senare som marginellt bättre.

En stegmotor av annan typ kommer att kräva modifikation av ritarmen d.v.s. jag blir tvungen att designa en egen variantmed något annorlunda dimensioner. Fastsättningen av armen i stegmotoraxeln kommer att säkras med skruv vilket inte är falllet nu.

Beslutar jag mig för att byta ut stegmotorkontrollern så blir jag antagligen tvungen att skriva ut en modifierad bottenplatta eftersom A4988 och DRV8825 saknar skruvhål och därför kräver en annan fastsättning.

Några källor:

Byggbeskrivningen för den här presenterade Egg Painter Mini.

Den ursprungliga EggBot skrivaren.

Mjukvara till äggskrivaren.

Byggbeskrivning i PDF.

 

 

Enkel temperaturlogger

08/01/2019

Jag gjorde för en tid sedan en första preliminär mätning av UHI (Urban Heat Island) d.v.s. värmenedsmutsning av tätorter. Det är självklart att meteorologiska mätstationer som ligger nära eller i tät bebyggelse bör mäta högre temperaturer än stationer som ligger ostörda på landsbygden. De lärda tvistar idag om hur stor inverkan från UHI har på globala uppskattningar av temperaturen och uppskattningarna varierar från i princip ingen alls till några tiondels grader.

Temperaturloggerns upplösning d.v.s. de minsta temperaturskillnaderna den kan detektera är 0.1 grader C.  Sensorns precision d.v.s. felet i förhållande till en välkalibrerad temperaturgivare ligger antagligen på ca. +/- 0.5 grader C.

Jag har ingen aning om hur sensorn driver med tiden och inte heller hur linjär den i verkligheten är (om jag exempelvis vet att sensorn visar rätt vi 20 grader C, hur stort är felet vid +40?). Min gissning är dock att de relativa felen vid temperatursving på några grader är mycket små d.v.s. i storleksordningen +/- 0.1 grad C.

imgp5759

Fig. 1  Den första loggerprototypen. Det 3D-utskrivna skalet är misslyckat men bättre än ingenting. Följande version kommer ur ”ugnen” efter fyra timmar då detta skrivs. Bilden visar temperaturmätning i mitt arbetsrum kväll-natt. temperaturtoppen på nästan en grad är förorsakad av min kroppsvärme.

arbetsrum20190107

Fig. 2  Mätning av temperatur i mitt arbetsrum natten mellan den 7 och 8.1.2019. Rummet är i andra våningen /därav rätt hög temperatur) och det värms endast av datorer, skrivare etc. Det är intressant att notera hur temperaturen stiger med nästan en grad då jag sitter i rummet. En människa torde producera ungefär 200W värme vilket jag uppfattar att man kan se i mätningen. Andningsluften innehåller rätt mycket fukt vilket kan ses i den röda kurvan som är relativ luftfuktighet. Grafen skapades genom att läsa in mätvärdena i LibreOffice Calc i CSV (Comma Separated Values) format. Inläsningen krävde ingen editering av datafilen.

temp_logger_base

Fig. 3  En virtuell bild av stommen till version #2 av den nya lådan till loggern i programmet Repetier-host som jag använder för utskrift. Lådan är konstruerad i programmet openscad. Processorn och skärmen är skyddade men enkelt åtkomliga. I den första versionen kom kretskortet lite för nära lådans inre vägg vilket har åtgärdats här. Likaså modifierade jag öppningarna till USB-kontakten, SD-kortet och anslutningen för signalsladden till sensorn.  I nedre hörnet finns fack för SD-kortet och Bluetooth givaren HC-05. Nära det övre hörnet finns hjälpväggar som fungerar som kraftavlastare för sensorns sladd. Normalt brukar jag behöva tre iterationer för att designen skall bli ungefär vad jag vill ha.

tloggerboxutskrift

Fig. 4  Utskrift av den nya lådan från föregående bild. 3D-skrivaren är en Geeetech I3 kopia på motsvarande Prusa I3 skrivare. Skrivaren är byggd från en byggsats och den fungerar bra. Det krävdes dock en hel del tid, kanske två veckor,  att få allt korrekt injusterat både mekaniskt och mjukvarumässigt. Fördelen med en byggsats är dock att jag inte har några som helst hämningar att fixa eventuella problem eller göra uppgraderingar.  Det här är den bästa leksak jag har gett mig på många år.

imgp5761

Fig. 5  De i temperaturloggern ingående delarna. Från vänster Arduino Mega 2560 (blå). Därefter SD-kortadapter(ljusgrön). Bluetooth adapter HC-05 (vit) och bildskärmen sedd bakifrån (röd).  I den 3D-printade lådans skruvfästen smälts mässingsgängor vilket på sikt är mycket pålitligare än att skruva direkt i plast.

En Arduino Mega som temperaturlogger

En temperaturlogger kan byggas billigt från följande komponenter:

  • Processor Arduino Mega 2560 (ca. $10 ebay)
  • Display 480×320 pixlar innehåller ofta SD-korthållare ($5-$10 ebay). Kontrollera att displayen är kompatibel med en Arduino Mega och att den inte är gjord för en Arduino Uno (SD-kortet kan vara svårt att få att fungera om kortet är för en UNO). Det lönars ig inte att använda en Arduino Uno som logger om bildskärm används … minnet räcker inte till.
  • Bluetooth adapter HC-05 ($5 på ebay)
  • Någon typ av låda för att skydda loggern jag designade en egen låda och skrev ut den med 3D-skrivare.
  • Temperatur/fuktighetsgivare DHT22 ($3 på ebay). Det finns kombinationsgivare som också mäter lufttryck. Jag byter eventuellt senare ut DHT22 givaren mot en givare som mäter temperatur, luftfuktighet och lufttryck.
  • Ett minneskort t.ex. 8 GByte (det minsta man hittar i en normal butik)
  • Två stycken 1 kohms motstånd

Utöver ovanstående behövs lödkolv, gärna en universalvoltmätare, tröd, lödtenn o.s.v. normala hobbytillbehör för elektronikhobby.

Egenskaper hos den färdiga loggern

Loggern mäter och lagrar temperatur och luftfuktighet på ett SD minneskort. Mätta data plottas i grafisk form till bildskärmen. Mätintervallat kan ställas från ca. 1s till timmar mellan mätningarna. Bildskärmen kan skalas enligt behov d.v.s. det minsta och det största värdet p skärmen kan ställas via kommandon.

Jag kommer att lägga till funktionalitet i loggern senare. Det är enkelt att lägga till mätning av andra parametrar om det behövs. Jag har för närvarande endast en temperatursensor. Tanken är att lägga till en annan sensor så att jag kan mäta utetemperaturen nära bilens tak och ca. 10 cm högre upp. Det bör vara möjligt att få en uppfattning om hur mycket värmen i bilen stör mätningarna genom att placera två termometrar på olika höjd i luftflödet.

Kontroll/styrning av loggern

Loggern skriver ut mätningar till processorns USB serieport samt till Bluetooth modulen HC-05. Via båda dessa kanaler kan man ge kommandon åt loggern.

Bäst kontrollerar man loggern via t.ex. en mobiltelefon eller en lämplig läsplatta med bluetooth.  En lämplig App för kontroll är appen ”Bluetooth Terminal” som man hittar på Google Play. Appen är gratis (det finns säkert många andra som också fungerar). Då man kopplar på strömmen till loggern och då Bluetooth är aktiv i telefonen så kommer det att dyka upp en enhet HC-05. Om det i omgivningen finns flera HC-05 enheter så känner man igen dem på deras unika id (hexadecimal sträng av bokstäver/siffror). Då anslutningen har lyckats så kan man testa förbindelsen med kommandot ”help” som visar vilka kommandon systemet känner.

Följande kommandon finns för närvarande (kommandot ”help” ger en lista över kommandon):

COMMANDS:
help      --> This help.
start     --> Start logging
stop      --> Stop logging
sdstart   --> Re-initialize SD
sdstop    --> SD write stopped
tlog      --> Print tlog.txt
tdata     --> Print tdata.txt
ls        --> List SD files
ctlog     --> Erase tlog.txt
ctdata    --> Erase tdata.txt
!         --> Comment to tlog.txt.
logint    --> Logging interval secs.
ymin      --> Set plot ymin
ymax      --> Set plot ymax
ytic      --> Set plot ytic
replot    --> Clear screen and replot

Innan man börjar logga lönar det sig att ställa in skärmen:

ymin

Säller in y-axelns minsta värde. Om vi t.ex. vet att temperaturen ute ligger på ca. +5 och vi kommer att göra en körning som kräver några timmar så kan vi sannolikt ställa in skärmen på t.ex. 0 grader C. Commandot är då ”ymin 0” utan citationsteckn.

ymax

På motsvarande sätt ställer vi in det största värdet som ryms påskärmen t.ex. 15 grader C. Kommandor är ”ymax 15”.

logint

Kommandot ställer in intervallet mellan mätningar uttryckt i sekunder. Om vi t.ex. vill logga en gång per minut så ger vi kommandot ”logint 60”.  Intervallet är inte helt exakt. Den löpande tiden d.v.s. tidpunkten för mätningen i sekunder sedan start är relativt noggrann.

replot

Kommandot ”replot” raderar skärmen och ritar ut koordinatsystemet på nytt. Räknaren som håller reda på mätningens ordningsnummer sätts till ett (1).

start

Starta loggningen med de parametrar systemet för närvarande känner (ymin, ymax och logintervall).

stop

Stoppa loggning.  Loggning kan startas på nytt med ”start”.

sdstart

SD minneskortet initialiseras t.ex. om man har tagit ur kortet och kopierat innehållet till en dator ellr om minneskortet har bytts. Samma initialisering görs då loggern startas d.v.s. det är inte nödvändigt att ge kommandot ”sdstart” då loggern startas.

sdstop

Stoppar skrivning till SD minneskortet. Det är säkrast att ge kommandor ”sdstop” innan man tar ur SD-kortet eller innan man stänger av strömmen till loggern. Om man råkar rycka ur kortet precis då loggern skriver data till minnet så kan SD minnet förstöras. På motsvarande sätt kan kortet förstöras om man stänger av strömmen medan loggern skriver till kortet.  Risken för skador på minneskortet är naturligtvis störst om loggningsintervallet är kort. Användning av ”sdstop” förhindrar skador på SD-kortet eftersom skrivning till kortet stoppas.

tlog

Lista (skriv ut) hela loggfilen. Man kan skriva kommentarer till loggfilen genom att börja en kommentar med kommandot ”!”. Den maximala längden på en rad är satt till 50 tecken.

Exempel:

! Sommarö, start

Strängen lagras som sådan i filen tlog.txt men den förses med en tidsstämpel som motsvarar tiden för mätningarna. Man kan alltså senare direkt relatera kommentaren till specifika mätningar.

tdata

Skriv ut alla mätdata i mätfilen till både USB serieporten och till Bluetooth (HC-05). Ett sätt att överföra data till en annan apparat är att lista mätdata till serieterminalen och sedan på den kontrollerande enheten kopiera data från terminalen till en fil. Användning av tdata gör att loggningen inte behöver avbrytas och man behöver inte ta ut minneskortet.

ctlog

Radera loggfilen. Allt innehåll i loggfilen försvinner.

ctdata

Radera innehållet i datafilen. Allt innehåll i datafilen försvinner.

Koppling av termometer/luftfuktighetsmätare till loggern

Sensorns signalstift kopplas till Arduino Mega A15.

Sensorns strömmatning VCC koplas till 5V bredvid Arduinons stift 22.

Sensorns jord kopplas till Arduinons jord bredvid Arduinons stift 52.

Koppling av Bluetooth HC-05

Bluetooth VCC går till 5V på Arduino Mega (bredvid VCC för temperatursensorn). Till samma stift kopplas också VCC för SD-kortet.

Bluetooth jord GND kopplas till GND på Arduino (nära A15).

Bluetooth TXD kopplas till A13.

Bluetooth RXD kopplas via spänningsdelare t.ex. så att signalen från Arduino leds till jord via två 1 kohms motstånd kopplade i serie. Signalen till Bluetooth modulen tas ut mellan motstånden. Problemet är att HC-05 RXD är gjord för 3.3V spänningsnivå medan Arduinon använder 5V nivåer. HC-05 kan fungera en tid utan spänniungsdelare men den blir inte långlivad om den kopplas direkt.

Koppling av SD-kort

SD-korthållaren bör vara av en som har inbyggd spänningsregulator och 5V tålig. Orsaken är att SD minnet är konstruerat för endast 3.3V. Ansluter man ett oskyddat SD-kort till ett 5V system så kommer minnet att förstöras snabbt (jfr. HC-05 problemet).

SD 5V kollas till Arduino 5V (kombinerat med HC-05).

SD jord (GND) kopplas till Arduino GND (kombinerat med HC-05),

SD MOSI kopplas till Arduino Mega 2560 ICSP pin 1 (MISO)

SD MOSI kopplas till Arduino Mega 2560 ICSP pin 4 (MOSI)

SD SCK kopplas till Arduino Mega 2560 ICSP pin 3 (SCK)

SD CS kopplas till Arduino Mega 2560 dig. io pin 48

LCD skärmen

LCD skärmen är en billig kinesisk skärm designad för en Arduino UNO. Skärmen har inbyggd SD-kortläsare men problemet är att SPI gränssnittets signaler i en Arduino mega ligger påannan plats (ICSP konnektorn). Jag uppfattade det inte som mödan värt att tjuvkoppla mig runt problemet så jag använder en separat SD-kortläsare.

Problemet med många billiga kinesiska skärmar är att de är totalt ”namnlösa” och det finns ofta ingen information om vilken drivkrets de använder. Drivkretsens typ avgör vilket bibliotek jag måste använda på Arduinon för att skriva till skärmen. Vill jag has en skärm som är enkel att använda för t.ex. mätändamål så vill jag inte ha en skärm som sitter som en skäld ovanpå Arduinon och samtidigt förhindrar åmst till arduinons in/ut kontakter.

Skärmen jag har använt i det här projektet använder UTFT APIN f skärmaccess. Många kinesioska skärmar använder kontrollkretsen ILI9xxx för vilken man oftast hittar drivrutiner på nätet.

Notera att skärmen inte är nödvändig för funktionen.

Om ingen skärm finns kan programmet fortfarande köras genom att kommentera bort

#define HAVESCREEN

genom att skriva // framför definitionen d.v.s:

//#define HAVESCREEN

Programmet använder då inte alls skärmen men kontroll över programmet via Bluetooth och Arduino IDE fungerar fortfarande.

Programmet i Arduino

Programmer är skrivet i Arduinos C/C++ som är standardspråket om man använder Arduino IDE. Programmet är skrivet i en form som är typisk för en mikrokontroller där det ofta helt saknas ett underliggande operativsystem. Programmet sköter alltså själv alla funktioner och det är programmerarens sak att se till att programmet aldrig hamnar i en återvändsgränd och stoppar. Programmet är i princip en oändlig slinga som upprepas på nytt och på nytt. En cykel körs på ungefär 1/10 sekund. Vid varje varv genom programslingan kontrollerar programmet om det är tid att göra en mätning, kontrollerar om det finns något nytt kommando som borde utföras.

Om det är tid att göra en mätning så mäts temperatur och luftfuktighet och mätningens nummer, tiden sedan programstart, temperatur och luftfuktighet loggas till SD-minne. Temperaturen skrivs också ut på skärmen.

Om det finns ett kommando så utförs kommandot varefter programmet väntar på att följande varv genom slingan skall starta. Långa kommandon t.ex. en utskrift av en lång datafil kan ge tidsfel d.v.s. avståndet mellan två mätningar behöver inte vara helt exakt.

Notera att indenteringarna iprogrammet har förlorats vid inklistringen  i bloggen.

Jag kommer senare att lägga ut programmet på Github som fri programvara. Tillåtelse att använda programmet fritt ges här.

// Temperature_logger
// (c) 2019 Lars Silén
// Version 1.0
//
// Runs on an Arduino Mega 2560
//
// Using a 480×320 TFT diplay will hide the ICSP connector which caries
// the HW SPI signals. The are two options going around this problem.
// The first option is th solder the signals to the ICSP allowing us to use
// the ICSP connector with the display mounted (this option is selected here).
// The other option is to use a SW SPI library driving the SD memory card.
// This option is not selected.
//
// Any free text comin in over BT is stored including clock stamp.
// This allows simple input of location.
//
#include <Arduino.h>
#include <dhtnew.h>
#include <SPI.h>
#include <SD.h> // Support library for SD memory
#include <SoftwareSerial.h>

#define HAVESCREEN

#ifdef HAVESCREEN
//################################################
// GLUE class that implements the UTFT API
// replace UTFT include and constructor statements
// remove UTFT font declaration e.g. SmallFont
//################################################

#include <UTFTGLUE.h> //use GLUE class and constructor
UTFTGLUE myGLCD(0,A2,A1,A3,A4,A0); //all dummy args

// Declare which fonts we will be using
//extern uint8_t SmallFont[]; //GLUE defines as GFXFont ref

#define ORG_X 10
#define ORG_Y 10
#define MAX_X 470
#define MAX_Y 300

#define SCALE_MINY -10.0
#define SCALE_MAXY 30.0
#define SCALE_TICY 2.5
#define CIRCLE 0
#define CIRCLE_SIZ 2
#define SQUARE 1
#define TRIANGLE 2
#define LINES 1
float miny = SCALE_MINY;
float maxy = SCALE_MAXY;
float ytic = SCALE_TICY;

#endif

#define SDavailable // We have access to a sd memory
#define REPORTINTERVAL 60*10 // For testing reporting is done ar one minute interval.
int reportinterval=REPORTINTERVAL;

// ****************************************************
// Thermo and humidity sensor
// ****************************************************

#define connectedTSens1 true
#define connectedTSens2 false

// Looks like digital IO 22-53 don’t work properly.
// Use PWM pins or A-series pins.
#define DHT22Sens1 A15
#define DHT22Sens2 A12

DHTNEW mySensor1(DHT22Sens1);
#ifdef DHT22Sens2
DHTNEW mySensor2(DHT22Sens2);
#endif

// ****************************************************
// SD-memory support
// ****************************************************
// MISO, MOSI and SCLK in ICSP header.
// CD on pin 53.

Sd2Card card;
SdVolume volume;
SdFile root;
int SDstop = false;

int measured = false;
float Temperature = -999.0;
float Humidity = -999.0;
unsigned long timeSecs = 0; // Updated at 1s intervals using interrupts this is the main clock
unsigned long timeSinceStart=0; // Time in seconds since start
unsigned long stepper_rotate=0; // How often should we rotate the tower by one movement step (one turn of the motor).

int reportCnt = 0;
boolean stringComplete = false;
String inputString = ””; // a String to hold incoming sewrial needs initialization in setup().
String sysString = ””; // Handles writing/reading data
SoftwareSerial BTSerial(A13, A14); // RX, TX

unsigned long t;
int counter=0;
int shortcnt=REPORTINTERVAL;
int isRunning = false;
unsigned long tOffs;

void setup() {
// Serial interface towards supervising computer at 9600 baud
Serial.begin(9600);
pinMode(A14,OUTPUT);
BTSerial.begin(9600);

// Set up the temperature/humidity sensor type DHT2x (AOSONG AM230x)
//pinMode(50,INPUT);
if(connectedTSens1){
mySensor1.read();
}
#ifdef DHT22Sens2
if(connectedTSens2){
mySensor2.read();
}
#endif
Serial.println(”Started the Temperature/humidity sensor”);
BTSerial.println(”Started the Temperature/humidity sensor”);

// Start the system
inputString.reserve(50);
sysString.reserve(50);

// ***********************************************
// Setup SD-memory
// ***********************************************
#define SDCS 48
//pinMode(SDCS,OUTPUT);
if (!card.init(SPI_HALF_SPEED, SDCS)) {
Serial.println(”initialization failed. Things to check:”);
Serial.println(”* is a card inserted?”);
Serial.println(”* is your wiring correct?”);
Serial.println(”* did you change the chipSelect pin to match your shield or module?”);

BTSerial.println(”initialization failed. Things to check:”);
BTSerial.println(”* is a card inserted?”);
BTSerial.println(”* is your wiring correct?”);
BTSerial.println(”* did you change the chipSelect pin to match your shield or module?”);
return;
} else {
Serial.println(”Wiring is correct and a card is present.”);
BTSerial.println(”Wiring is correct and a card is present.”);
}
SD.begin(SDCS);
if (!volume.init(card)) {
Serial.println(”Could not find FAT16/FAT32 partition.\nMake sure you’ve formatted the card”);
BTSerial.println(”Could not find FAT16/FAT32 partition.\nMake sure you’ve formatted the card”);
return;
}
if(SDstop==true){
Serial.println(”SD stopped use SDstart”);
BTSerial.println(”SD stopped use SDstart”);
}

#ifdef HAVESCREEN
// ***********************************
// Setup the LCD
// ***********************************
Serial.println(”Trying to init LCD”);
BTSerial.println(”Trying to init LCD”);
myGLCD.InitLCD();
myGLCD.setFont(SmallFont);
#endif
}

float get_temperature(int sensorNo){
switch(sensorNo){
case 1: if(connectedTSens1){
Serial.println(”mySensor1.temperature”);
BTSerial.println(”mySensor1.temperature”);
return mySensor1.temperature;
} else {
return -999.0;
}
break;
case 2: if(connectedTSens2){
Serial.println(”mySensor2.temperature”);
return mySensor2.temperature;
} else {
Serial.print(”Not connected connectedTSens2=”);Serial.println(connectedTSens2);
return -999.0;
}
break;
}
Serial.println(”Fell through no such sensor number”);
BTSerial.println(”Fell through no such sensor number”);
return -999.0;
}

unsigned long get_time_since_start(){
// Get time in seconds since start
return timeSinceStart;
}

void ck_serial(){
// ***********************************
// Handle incoming serial data
// ***********************************
// CheclUSB serial typically Arduino Serial Monitor
while (Serial.available()>0) {
// get the new byte:
char inChar = (char)Serial.read();
inputString += inChar;
// if the incoming character is a newline the command is complete
// set a flag so the main loop can
// do something about it:
if (inChar == ‘\n’) {
stringComplete = true;
//Serial.println(”Got CR”);
}
}
// Check Bluetooth connection to phone/pad
while (BTSerial.available()>0) {
// get the new byte:
char inChar = (char)BTSerial.read();
inputString += inChar;
// if the incoming character is a newline the command is come,
// set a flag so the main loop can
// do something about it:
if (inChar == ‘\n’) {
stringComplete = true;
//Serial.println(”Got CR”);
}
}
serial_cmd();
}

void writeToLog(String ipStr){
if(SDstop==true) return;

File wrf=SD.open(”tlog.txt”,FILE_WRITE);
wrf.print(counter);
wrf.print(”,”);
wrf.println(ipStr);
wrf.close();
}

void serial_cmd(){
int n=0;
float h;
float energy=0;
float price=0;
// Some very basic commands
if(stringComplete==true){
// Ensure that case doesn’t matter when entering commands.
inputString.toLowerCase();
if(inputString.startsWith(String(”#”))){
// Handle comments
// Allows us to use scripts on the PC to set parameters on the controller.
Serial.print(”# ”);
Serial.println(”inputString”);
BTSerial.print(”# ”);
BTSerial.println(”inputString”);
stringComplete=false;
return;
}
// Restart use of the SD memory card after a SD stop.
if(inputString.startsWith(String(”sdstart”))){
Serial.print(”# command=sdstart ”);
BTSerial.print(”# command=sdstart ”);
// Re-initialize the card. The card may have been replaced.
if (!card.init(SPI_HALF_SPEED, SDCS)) {
Serial.println(”initialization failed. Things to check:”);
Serial.println(”* is a card inserted?”);
Serial.println(”* is your wiring correct?”);
Serial.println(”* did you change the chipSelect pin to match your shield or module?”);
BTSerial.println(”initialization failed. Things to check:”);
BTSerial.println(”* is a card inserted?”);
BTSerial.println(”* is your wiring correct?”);
BTSerial.println(”* did you change the chipSelect pin to match your shield or module?”);
inputString=””;
return;
} else {
Serial.println(”Wiring is correct and a card is present.”);
BTSerial.println(”Wiring is correct and a card is present.”);
}
SD.begin(SDCS);
if (!volume.init(card)) {
Serial.println(”Could not find FAT16/FAT32 partition.\nMake sure you’ve formatted the card”);
BTSerial.println(”Could not find FAT16/FAT32 partition.\nMake sure you’ve formatted the card”);
return;
}
SDstop = false;
inputString=””;
stringComplete=false;
return;
}
// Secure removal of the SD memory card.
if(inputString.startsWith(String(”sdstop”))){
Serial.print(”# command=sdstop”);
BTSerial.print(”# command=sdstart ”);
SDstop=true;
inputString=””;
stringComplete=false;
return;
}
// Start logging
if(inputString.startsWith(String(”start”))){
Serial.println(”# command=start”);
BTSerial.println(”# command=start”);
isRunning=true;
tOffs=millis()/1000;
stringComplete=false;
inputString=””;
return;
}
// Stop logging
if(inputString.startsWith(String(”stop”))){
Serial.println(”# command=stop”);
BTSerial.println(”# command=stop”);
isRunning=false;
stringComplete=false;
inputString=””;
return;
}
if(inputString.startsWith(String(”ymin”))){
Serial.print(”# command=ymin value=”);
BTSerial.print(”# command=ymin value=”);
#ifdef HAVESCREEN
miny=inputString.substring(4).toFloat();
Serial.println(miny);
BTSerial.println(miny);
#else
Serial.println(”Error: No screen defined”);
BTSerial.println(”Error: No screen defined”);
#endif
stringComplete=false;
inputString=””;
return;
}
if(inputString.startsWith(String(”ymax”))){
Serial.print(”# command=ymax value=”);
BTSerial.print(”# command=ymax value=”);
#ifdef HAVESCREEN
maxy=inputString.substring(4).toFloat();
Serial.println(maxy);
BTSerial.println(maxy);
#else
Serial.println(”Error: No screen defined”);
BTSerial.println(”Error: No screen defined”);
#endif
stringComplete=false;
inputString=””;
return;
}
if(inputString.startsWith(String(”ytic”))){
Serial.print(”# command=ytic value=”);
BTSerial.print(”# command=ytic value=”);
#ifdef HAVESCREEN
ytic=inputString.substring(4).toFloat();
Serial.println(ytic);
BTSerial.println(ytic);
#else
Serial.println(”Error: No screen defined”);
BTSerial.println(”Error: No screen defined”);
#endif
stringComplete=false;
inputString=””;
return;
}
if(inputString.startsWith(String(”logint”))){
Serial.print(”# command=logint value=”);
BTSerial.print(”# command=logint value=”);
reportinterval=inputString.substring(6).toInt();
Serial.println(reportinterval);
BTSerial.println(reportinterval);
reportinterval=10*reportinterval;
stringComplete=false;
inputString=””;
return;
}
if(inputString.startsWith(String(”replot”))){
Serial.println(”# command=replot”);
BTSerial.println(”# command=replot”);
#ifdef HAVESCREEN
setup_graph_screen();
#else
Serial.println(”Error: No screen defined”);
BTSerial.println(”Error: No screen defined”);
#endif
counter=1;
stringComplete=false;
inputString=””;
return;
}
if(inputString.startsWith(String(”tlog”))){
Serial.println(”# command=tlog”);
BTSerial.println(”# command=tlog”);
#ifdef SDavailable
dumpTLog();
#else
Serial.println(”SD card not available”);
BTSerial.println(”SD card not available”);
#endif
inputString = ””;
stringComplete=false;
return;
}
if(inputString.startsWith(String(”tdata”))){
Serial.println(”# command=tdata”);
BTSerial.println(”# command=tdata”);
#ifdef SDavailable
dumpTData();
#else
Serial.println(”SD card not available”);
BTSerial.println(”SD card not available”);
//BTSerial.println(”SD card not available”);
#endif
inputString = ””;
stringComplete=false;
return;
}
if(inputString.startsWith(String(”ls”))){
Serial.print(”# command=ls: ”);
BTSerial.print(”# command=ls: ”);
File root = SD.open(”/”);
printDirectory(root,0);
root.close();
//root.openRoot(volume);
// list all files in the card with date and size
//root.ls(LS_R | LS_DATE | LS_SIZE);
inputString = ””;
stringComplete=false;
return;
}
if(inputString.startsWith(String(”ctlog”))){
Serial.print(”# command=ctlog”);
BTSerial.print(”# command=ctlog”);
clearTLog();
Serial.println(”tlog.txt cleared (erased)”);
BTSerial.println(”tlog.txt cleared (erased)”);
inputString = ””;
stringComplete=false;
return;
}
if(inputString.startsWith(String(”!”))){
Serial.print(”# command=”);
Serial.println(inputString);
BTSerial.print(”# command=”);
BTSerial.println(inputString);
#ifndef SDavailable
return;
#endif
t = millis()/1000;

File wrf=SD.open(”tlog.txt”,FILE_WRITE);
wrf.print(counter);wrf.print(”,”);
wrf.print(t);wrf.print(”, ”);
wrf.println(inputString);
wrf.close();
inputString = ””;
stringComplete=false;
return;
}
if(inputString.startsWith(String(”ctlog”))){
Serial.print(”# command=ctlog”);
BTSerial.println(”# command=ctlog”);
clearTLog();
Serial.println(”tlog.txt file erased”);
BTSerial.println(”tlog.txt file erased”);
inputString = ””;
stringComplete=false;
return;
}
if(inputString.startsWith(String(”ctdata”))){
Serial.println(”# command=ctdata”);
clearTData();
Serial.println(”tdata.txt file erased”);
BTSerial.println(”tdata.txt file erased”);
inputString = ””;
stringComplete=false;
return;
}
if(inputString.startsWith(String(”help”))){
Serial.println(””);
Serial.println(”COMMANDS:”);
Serial.println(”help –> This help.”);
Serial.println(”start –> Start logging”);
Serial.println(”stop –> Stop logging”);
Serial.println(”sdstart –> Re-initialize SD”);
Serial.println(”sdstop –> SD write stopped”);
Serial.println(”tlog –> Print tlog.txt”);
Serial.println(”tdata –> Print tdata.txt”);
Serial.println(”ls –> List SD files”);
Serial.println(”ctlog –> Erase tlog.txt”);
Serial.println(”ctdata –> Erase tdata.txt”);
Serial.println(”! –> Comment to tlog.txt.”);
Serial.println(”logint –> Logging interval secs.”);
Serial.println(”ymin –> Set plot ymin”);
Serial.println(”ymax –> Set plot ymax”);
Serial.println(”ytic –> Set plot ytic”);
Serial.println(”replot –> Clear screen and replot”);
Serial.println(””);

BTSerial.println(”COMMANDS:”);
BTSerial.println(”help –> This help.”);
BTSerial.println(”start –> Start logging”);
BTSerial.println(”stop –> Stop logging”);
BTSerial.println(”sdstart –> Re-initialize SD”);
BTSerial.println(”sdstop –> SD write stopped”);
BTSerial.println(”tlog –> Print tlog.txt”);
BTSerial.println(”tdata –> Print tdata.txt”);
BTSerial.println(”ls –> List SD files”);
BTSerial.println(”ctlog –> Erase tlog.txt”);
BTSerial.println(”ctdata –> Erase tdata.txt”);
BTSerial.println(”! –> Comment to tlog.txt.”);
BTSerial.println(”logint –> Log interval secs.”);
BTSerial.println(”ymin –> Set plot ymin”);
BTSerial.println(”ymax –> Set plot ymax”);
BTSerial.println(”ytic –> Set plot ytic”);
BTSerial.println(”replot –> Clear screen and replot”);
inputString = ””;
stringComplete=false;
return;
}
// Any comman that isn’t recognized is assumed to be a comme that is loged
// into the tlog.txt logfile.
Serial.print(”inputString”);
Serial.println(inputString);
writeToLog(inputString);
inputString = ””;
stringComplete=false;
return;
}
return; // Never reached
}

void report_serial(){
// Write as comma separated values for easy import to a spread sheet program

Serial.print(”Time,”); Serial.print(t); Serial.print(”, ”);
BTSerial.print(”Time,”); BTSerial.print((timeSecs/3600.0)); BTSerial.print(”, ”);
if(connectedTSens1){
Serial.print(”Temp1, ”); Serial.print(mySensor1.temperature); Serial.print(”, ”);
Serial.print(”Hum1, ”); Serial.print(mySensor1.humidity); Serial.print(”\n”);
BTSerial.print(”Temp1, ”); Serial.print(mySensor1.temperature); Serial.print(”, ”);
BTSerial.print(”Hum1, ”); Serial.print(mySensor1.humidity); Serial.print(”\n”);
}
//if(connectedTSens2){
// Serial.print(”Temp2, ”); Serial.print(mySensor2.temperature); Serial.print(”, ”);
// Serial.print(”Hum2, ”); Serial.print(mySensor2.humidity); Serial.print(”\n”);
//}
}

// ********************************************
// SD related functions
// ********************************************

void printDirectory(File dir, int numTabs) {
while (true) {

File entry = dir.openNextFile();
if (! entry) {
// no more files
break;
}
for (uint8_t i = 0; i < numTabs; i++) {
// Repaced ‘\t’ with ‘ ‘ to save screen space
Serial.print(‘ ‘);
BTSerial.print(‘ ‘);
}
Serial.print(entry.name());
if (entry.isDirectory()) {
Serial.println(”/”);
BTSerial.println(”/”);
printDirectory(entry, numTabs + 1);
} else {
// files have sizes, directories do not
Serial.print(”\t\t”);
Serial.println(entry.size(), DEC);
BTSerial.print(”\t\t”);
BTSerial.println(entry.size(), DEC);
}
entry.close();
}
}

void dumpTLog(){
// Dump the logfile to the external computer
char c;
#ifndef SDavailable
Serial.println(”Error: No SD memory available”);
BTSerial.println(”Error: No SD memory available”);
return;
#endif
File rdf = SD.open(”tlog.txt”,FILE_READ);
if (rdf){
while (rdf.available()) {
c=rdf.read();
Serial.write(c);
BTSerial.write(c);
}
rdf.close();
} else {
Serial.println(”Error: Could not open tlog.txt”);
BTSerial.println(”Error: Could not open tlog.txt”);
}
}

void clearTLog(){
#ifndef SDavailable
Serial.println(”Error: No SD memory available”);
BTSerial.println(”Error: No SD memory available”);
return;
#endif
SD.remove(”tlog.txt”);
}

void dumpTData(){
// Dump the logfile to the external computer
char c;
#ifndef SDavailable
Serial.println(”Error: No SD memory available”);
BTSerial.println(”Error: No SD memory available”);
return;
#endif
File rdf = SD.open(”tdata.txt”,FILE_READ);
if (rdf){
while (rdf.available()) {
c=rdf.read();
Serial.write(c);
BTSerial.write(c);
}
rdf.close();
} else {
Serial.println(”Error: Could not open usrlog.txt”);
BTSerial.println(”Error: Could not open usrlog.txt”);
}
}

void clearTData(){
#ifndef SDavailable
Serial.println(”Error: No SD memory available”);
BTSerial.println(”Error: No SD memory available”);
return;
#endif
SD.remove(”tdata.txt”);
}

#ifdef HAVESCREEN
int cy(int y){
// Convert y into screen coordinate sy)
int v=0;
v = MAX_Y – y;
if(v<0){
v = ORG_Y;
return v;
} else if(v>MAX_Y){
v= MAX_Y;
return v;
}
return v;
}

int cx(int x){
// Dummy conversion of x-coordinate to screen coordinate
int v=0;
v = x+ORG_X;
if(v<ORG_X){
return ORG_X;
} else if(v>MAX_X){
return MAX_X;
}
return v;
}

void draw_axisX(){
// Draw x-axis
myGLCD.drawLine(cx(0), cy(0), cx(MAX_X), cy(0));
}

void draw_axisY(){
// Draw y-axis
myGLCD.drawLine(cx(0), cy(0), cx(0), cy(MAX_Y-10));
}

int cnvYfloatToInt(float y){
int intY;
//intY = MAX_Y*(y-SCALE_MINY)/(SCALE_MAXY-SCALE_MINY);
intY = MAX_Y*(y-miny)/(maxy-miny);
//Serial.print(”y=”);
//Serial.println(y);
//Serial.print(”Conv intY=”);
//Serial.println(intY);
return intY;
}

void ticX(int dx){
// Starts from x=0
// Draw x-ticks
myGLCD.setBackColor(0, 0, 0);
for (int i=0; i<460; i+=dx){
myGLCD.drawLine(cx(i), cy(0), cx(i), cy(10));
sysString=String(i);
myGLCD.print(sysString, i+5, cy(15));
}
}

void ticY(float dy,int ltype){
float ypos;
int intY;
int i;
//for (int i=0; i<MAX_Y; i+=dy) myGLCD.drawLine(cx(0), cy(i),cx(10), cy(i));
ypos = miny;
while(ypos < maxy){
intY = cnvYfloatToInt(ypos);
myGLCD.drawLine(cx(0), cy(intY),cx(10), cy(intY));
if(ltype==LINES){
myGLCD.setBackColor(0, 0, 0);
for(i=10; i<469; i=i+10){
myGLCD.drawLine(cx(i), cy(intY),cx(i+3), cy(intY));
}
}
sysString=String(ypos);
myGLCD.print(sysString, 15, cy(intY+9));
ypos = ypos + dy;
}
}

void setup_graph_screen(){
myGLCD.clrScr();
myGLCD.setColor(255, 0, 0);
myGLCD.print(”* Temperature logger V1.0 *”, 30, 20);
// Draw a background
myGLCD.setColor(255, 0, 0);
myGLCD.fillRect(0, 0, 479, 13);
myGLCD.setColor(64, 64, 64);
myGLCD.fillRect(0, 306, 479, 319);
myGLCD.setColor(255, 255, 255);
myGLCD.setBackColor(255, 0, 0);
draw_axisX();
ticX(60);
draw_axisY();
ticY(ytic,LINES);
}

void plot_point(int x, float flY, int symb){
int y;
//Serial.print(”Initial float Y=”);
//Serial.println(flY);
y = cnvYfloatToInt(flY);
//Serial.print(”Converted intY=”);
//Serial.println(y);
switch(symb){
case CIRCLE: myGLCD.drawCircle(cx(x), cy(y), CIRCLE_SIZ);
break;
}
}
#endif

void store_data_SD(){
if(SDstop==true) return;
File wrf=SD.open(”tdata.txt”,FILE_WRITE);
wrf.print(t-tOffs);
wrf.print(”,”);
wrf.print(counter);
wrf.print(”, T , ”);
wrf.print(mySensor1.temperature);
wrf.print(”, h , ”);
wrf.println(mySensor1.humidity);
wrf.close();
}

// ********************************************************************************************
// MAIN PROGRAM
// We run, very roughly one loop per second.
// Notice that variables defined within the loop are local to loop() and they
// are initialized when a new loop starts. To preserve data between loops variables have
// to be declared outside the loop().
// ********************************************************************************************

void loop() {
// ******************************************************
// Main loop for actual work
// ******************************************************
ck_serial();

if (counter==0){
#ifdef HAVESCREEN
setup_graph_screen();
#endif
counter=1;
}
shortcnt–;
if((shortcnt<=0) & isRunning==true){
mySensor1.read(); // Read Temperature and Humidity sensor #1
t = millis()/1000; // Seconds since start
Serial.print(t-tOffs);
Serial.print(” , ”);
Serial.print(counter);
Serial.print(” , T , ”);
Serial.print(mySensor1.temperature);
Serial.print(” ,h, ”);
Serial.println(mySensor1.humidity);
BTSerial.print(t-tOffs);
BTSerial.print(”,”);
BTSerial.print(counter);
BTSerial.print(” , T , ”);
BTSerial.print(mySensor1.temperature);
BTSerial.print(” , h , ”);
BTSerial.println(mySensor1.humidity);
shortcnt = reportinterval;
#ifdef HAVESCREEN
plot_point(counter,mySensor1.temperature,CIRCLE);
#endif
store_data_SD();
counter++;
}

delay(100);
}

Historisk datateknik

24/12/2018

Mina första kontakter med datateknik var på 1960-talet då min far lånade hem en Olivetti Programma 101 ”dator” eller kanske bättre programmerbar (bords) räknemaskin. Datorn var stor som en modern resväska men den var programmerbar i 100 steg dock så att varje variabel förbrukade ett programsteg.
Olivetti_programma_101

Pappa programmerade maskinen till att bl.a. skriva ut lyftdata för olika vingprofiler. Ungdomarna i familjen (däribland jag) var intresserade av modellflyg.

Följande steg för mig var Science of Cambridge Mk14  som var en 8-bitars dator med 256 minnesplatser. Program kunde lagras på kassettband men man måste alltid börja med att knacka in ett laddprogram i hexadecimal form. Jag hade inbillat mig att jag skulle ha kunnat expandera maskinen till att bli den programmerbara funktionsräknare jag egentligen önskade mig. Resultatet blev att jag lärde mig programmering i assembler men så att jag själv översatte koden till binär (hexadecimal) form.

Några år senare jobbade jag i Tavastehus på ”Ammattikoulujen Opettajaopisto” som fungerade i anslutning till en teknisk skola. Man hade en Eclipse minidator som tidsdelat användes bl.a. till undervisning i programmering (Fortran).  Min uppgift var. bl.a. att skriva enkla undervisningsprogram. Jag märkte snabbt att det lönade sig att använda en fristående mikrodator som körde CP/M operativsystemet i stället för att dela minidatorn. Eclipse minidatorn hade en kapacitet som var en bråkdel (kanske 1/1000) av kapaciteten hos en modern PC och samma maskin användes samtidigt av tjugo elever till att kompilera Fortran. Resultatet var naturligtvis att Eclipsen under skoltid var fruktansvärt trög … man kunde vänta i flera sekunder på att en knapptryckning skulle noteras. Den lilla CP/M maskinen hade endast en användare (jag) så den var underbar att använda. En persondator innan den egentliga persondatorn (IBM PC) ens var uppfunnen.

Jag råkade för en kort tid sedan på nätet stöta på en artikel om emulering av CP/M maskiner med hjälp av Arduino processorer. Den mest extrema vartianten jag har sett är då en Arduino Nano, dock med stöd av extern hårdvara, har använts till att köra CP/M. En enklare variant, då processorn är mycket mera kraftfull, är att emulera CP/M med hjälp av en Arduino Due som är ett ARM-baserat processorkort som antagligen är några hundra gånger snabbare än den ursprungliga Intel 8080 processorn.

Arduino_Due_CPM_system.png

Mitt emulerade CP/M system med hårdskiva till höger. Skivenheten är ett 4G SD-kort som är så litet att man inte hittar sådana i butikerna längre. På kortet finns katalogerna A, B, D, D, E som motsvarar forntidens 8 tums skivminnen. Skillnaden är att mina skivstationer A, B  … har en nästan obegränsad kapacitet. De första 8 tums ”floppyna” hade en kapacitet på kanske 150 000 tecken. Min extrema SD-hårdskiva har en kapacitet som är 25000 gånger större än en forntida 8-tums floppyenhet. En floppy hade en så liten kapacitet att man normalt körde t.ex. en kompilator från en skiva och hade texteditorn och programmet som kompilerades på en annan skiva.

Man kan köra CP/M i normal hastighet på kortet. Processorn har så mycket RAM minne att det finns nästan 64kByte minne ledigt för program … ett sagolikt stort minne!  Maskinen är helt användbar bl.a. till textbehandling (Wordstar) trots att en modern PC har ett minne som är ungefär 125 000 ggr större!

CP_m_2.2_Arduino_Due

Bilden ovan visar hur jag kör CP/M i textterminal GtkTerm. Det dök egentligen upp endast två poblem.

Det första problemet var hur det var tänkt att det simulerade skivsystemet med skivenheterna A:, B:, C: osv skulle konfigureras för att maskinen skulle hitta systemfilen och starta. Jag blev tvungen att lägga till några kommentarer tll emulatorns uppstartsrutin för att se varför systemet inte först ville starta., därför finns kommentaren ”Looking for: CPM22.BIN. Jag visste helt enkelt inte om problemet var SD-kortet eller platsen där systemet var lagrat i förhållande till övriga CP/M rutiner.

Det andra problemet var trivialare … att hitta ett lämpligt terminalemulatorprogram för linux som skulle gå att använda direkt utan läsande av någon bruksanvisning.   Att hitta ett terminalemulatorprogram var egentligen det storsta problemet med att få igång CP/M systemet på riktigt. Arduinons utvecklingsmiljö har något de kallar ”Serial Monitor” d.v.s ett enkelt program som kan  skicka kommandon till Arduinon och skriva ut den text som kommer tillbaka från kortet. Monitorn visade nog att jag hade fått CP/M startat men det gick inte att i praktiken köra något eftersom monitorn inte motsvarade en riktig gammaldags intelligent terminal. För detta ändamål behövs det en terminalemulator som klarar av att tolka bl.a. kontrolltecken som CP/M systemet skickar till terminalen.

Det behövdes en aning debuggning av SD-kortet som används i stället för skivminne, därav min kommentar vid uppstart ”Looking for: CPM22.bin”.

MBASIC_1985-1986.png

Bilden visar hur systemet kör Microsoft MBASIC från 1986 i en CP/M emulator som körs i en Arduino Due. Arduino Due har följande specifikationer:

Processor 32-bitars ARM.

Flash programminne 512 kB

RAM-minne 96 kB

Klockfrekvens 84 MHz

Detta kan jämföras med orginalets processor Intel 8080 som körde på 2 MHz men så att en instruktion typiskt behövde mellan 4 och 8 klockcykler. Arduinon kör alltså ungefär 100 ggr snabbare vilket gör att den klarar av att emulera en Intel 8080 processor i full hastighet.

Det är intressant att jämföra CP/M maskinen ovan med kapaciteten hos en typisk persondator av idag.

Programminne RAM är 25 000-50 000 ggr större än hos en CP/M maskin.

Skivutrymmet på en modern dator är 20 000 000 ggr större än hos ett typiskt CP/M system med en skivenhet.

Processorn är idag ungefär 4000 ggr snabbare med en ordlängd d.v.s. storleken på de datapaket datorn behandlar är 8 ggr större.

 


Pointman's

A lagrange point in life

THE HOCKEY SCHTICK

Lars Silén: Reflex och Spegling

NoTricksZone

Lars Silén: Reflex och Spegling

Big Picture News, Informed Analysis

This blog is written by Canadian journalist Donna Laframboise. Posts appear Monday & Wednesday.

JoNova

Lars Silén: Reflex och Spegling

Climate Audit

by Steve McIntyre

Musings from the Chiefio

Techno bits and mind pleasers

Bishop Hill

Lars Silén: Reflex och Spegling

Watts Up With That?

The world's most viewed site on global warming and climate change

TED Blog

The TED Blog shares interesting news about TED, TED Talks video, the TED Prize and more.

Larsil2009's Blog

Lars Silén: Reflex och Spegling

%d bloggare gillar detta: