Archive for the ‘Fysik’ Category

Moore’s lag

29/09/2026

Sedan slutet av 1700-talet har man kunnat följa en nästan ofattbar utveckling på datateknikens område. Charles Babbage visade att man i princip kunde skapa en mekanisk programmerbar dator. En praktisk mekanisk dator skulle ha varit mycket stor, tänk en fotbollsplan, och samtidigt ur modern synvinkel extremt långsam. Det har visat sig att Babbages mekaniska dator var korrekt konstruerad och med tillräcklig finansiering och långvarig utveckling skull den ha varit möjlig att bygga. Babbage fick finansiering för att bygga datorn 1823 men den färdigställdes aldrig.

Matematikern Ada Lovelace (1815-1852) uppfattas som världens första programmerare. Tillsammans med Babbage utvecklade de idéer kring program, variabler och vilkorliga hopp i ett datorprogram, idéer som fortfarande är gångbara.

Senare studerade man Babbages idéer och insåg att Babbages mekaniska dator skulle vara mycket enklare att implementera i elektronisk form. De första elektroniska datorerna använde mekaniska reläer och elektronrör men då transistorn uppfanns kunde en mycket snabb miniatyrisering inledas, först så att elektronrör byttes mot transistorer men relativt snabbt lärde man sig att lägga in många transistorer på samma kiselbit d.v.s. man började skapa integrerade kretsar. Efter några år had man lärt sig att skapa centralenheter för enkla datorer som innehöll några tusen transistorer, Utvecklingsprocessen fortgår fortfarande men på en kiselbit ryms idag miljarder transistorer.

Det har visat sig att ”kapaciteten” hos en dator fördubblades på ca 2-3 år. Då utvecklingen fortgår under många år kommer kapacitetsökningen att vara ofantlig. Fördubblingen av kapaciteten under en given tidrymd kallas Moores lag.

Då vi ser vad en fördubbling följd av en fördubbling följd av … leder till kommer att tänka på legenden om uppfinnaren av schackspelet Sissa Ibn Dahir som av kungen bad om en enkel belöning för det fantastiska spelet … sätt ett sädeskon på den första rutan, två på den andra rutan, fyra på följande o.s.v. så att mängden sädeskorn fördubblas för varje varje följande ruta. Resultatet blev att det på den sista sextiofjärde rutan fanns ungefär 1844600000000000000 sädeskorn och kungen gick i konkurs.

Det är skäl att komma ihåg att Moores lag inte går att tillämpa på godtycklig teknik. En förutsättning för att Moores lag har fungerat under lång tid är en teknisk utveckling av miniatyrisering kopplad till extremt effektiv serieproduktion. Det är alltså inte möjligt att se samma utveckling gällande t.ex. vindkraft där man startar från en 2000 år gammal teknik och där miniatyrisering inte är möjlig eftersom man samlar in vindenergi över ett stort område.

Under 1960-talet hade man utvecklat programmerbara datorer som gick att programmera i programmeringsspråk som fortfarande används t.ex. FORTRAN. Kapaciteten var mycket mindre än kapaciteten i en modern mobiltelefon. Hjärnan i en modern mobiltelefon skulle med glädje ha utnyttjats som centraldator för ett helt universitet på 1960-talet.

För några veckor sedan råkade jag se en reklam för ett litet mikrokontrollerkort d.v.s. egentligen en liten dator med storleken 25 * 20 mm som lätt kan kopplas till en konventionell dator för programmering. Det speciella med just den här mikrokontrollern är att den har en inbyggd bildskärm som i praktiken kan visa två korta rader text. Jag kunde naturligtvis inte motstå frestelsen att prova den så jag beställde tio stycken till ett styckepris på 1.52 Euro.

Fig. 1 Mikrokontrollern ESP32-C3 OLED.

För att ha något vettigt att göra med min lilla kontroller beslöt jag att utnyttja en koldioxidsensor jag råkade ha liggande i miljonlådan och bygga en koldioxidmätare som på den pyttelilla bildskärmen kontinuerligt kunde visa koldioxidhalten i luften.

Det gick väldigt snabbt och enkelt att få fram kod för att avläsa sensorn och skriva ut det mätta värdet på bildskärmen. Jag gissar att jag fick det hela att fungera på mindre än en halv timme. Då kommer naturligtvis följande fråga. Om jag vill följa med hur coldioxidhalten förändras under en längre tidsperiod så vore det kul att kunna lagra mätvärdena på ett mikro SD minneskort.

Följande steg visade sig vara något besvärligare. Mikrokontrollern är dåligt dokumenterad. Det visade sig att jag försökte koppla in SD kortet på In/Ut pinnar som användes internt av mikrokontrollern. Efter diverse sökande hittade jag ovanstående bild som visar att det inte lönar sig att använda GPIO6 och GPIO5 eftersom de redan används av bildskärmen som är kopplad via en såkallar I2C seriedatabuss.

Då jag nu kunde skriva CO2 mätvärden till SD-minneskort visade det sig att mätningarna ”drev” tidsmässigt väldigt mycket d.v.s. det gick inte att tvinga fram mätningar med ett enkelt regelbundet mätintervall på t.ex. 5 s per mätning. Lösningen var att starta en timer (klockfunktion) som jag ställde in så att den skulle meddela att det var tid att mäta med 5 s intervall. Arbetsslingan ”loop” i programmet måste i viss mån modifieras så att mätintervallet inte styrdes av väntefunktionen längst ner i programmet. Funktionen delay() väntar en tiondels sekund innan huvudslingan loop() startas på nytt automatiskt. Väntefunktionen är relativt kort för att jag inte skall behöva vänta på kommandon jag skriver över USB serieporten. Att sköta mätningarna via interrupt visade sig fungera bra.

Eftyer ett antal successiva förbättringar kom jag fram till ett mätprogram som, om mikrokontrollern är kopplad till en dator, kan tömma mätfilen, skriva ut innehållet i filen, stoppa och återstarta mätningarna samt att starta mätningarna så att det bokförs tid/datum då mätningarna startas. Tanken är att jag senare enkelt skall kunna rita ut grafer över hur CO2 halten förändras över lång tid kanske några veckor.

Fig. 2 Det färdiga systemet kopplat på ett prototypkort. Längst ner på bilden ses USB-anslutningen till min dator. USB matar den ström mikrokontrollern behöver. Man ser den pyttelilla bildskärmen på processorkortet. Strax ovanför mikrokontrollern syns ett litet kort från vilket det sticker ut ett SD-minnskort till vänster. Överst finns en silverfärgad enhet som är en optisk koldioxidmätare.

More’s lag igen

Då man ser på den extremt lilla mikrokontrollern så kan man plötsligt reagera på hur otroligt mycket tekniken har gått framåt. Operativsystemet UNIX utvecklades på minidatorn PDP-8 som har en ordlängd på 12-bitar. Ordlängd betyder att en instruktion har längden 12-bitar i det binära systemet där det finns endast två siffror 0 och 1. I en 12 bitars minnesplats kan man lagra tal mellan 0 och 4095.

Den maximala minnesstorleken i form av magnetkärnor var 32 000 12-bitars minnesplatser. Program kunde lagras på pappersremsa eller på magnetband men PDP-8 frontpanel, se fig 3, användes till att mata in ett kort program för att läsa in program från t.ex. hålremsa. Program skrevs i assembler d.v.s. direkt i symbolisk maskinkod. Vi kan jämföra denna PDP-8 minidator från 1965 som kostade 18500 dollar med min lilla mikrokontroller. PDP-8 hade en instruktionscykel på 1.5 mikrosekunder vilket motsvarar ungefär 600 000 minnesoperationer per sekund.

Fig. 3 Bilden visar en PDP-8 minidator från datormusét i Stuttgart. Notera att kringutrustningen i form av läsare av hålremsa, Teletype terminal och eventuellt en bandstation saknas.

Fig. 4 Dennis Ritchie och Ken Thompson, utvecklarna av UNIX, arbetar på en något mera kraftfull PDP-11 minidator. I bilden syns två Teletype terminaler. Man se mängder av rullar med hålremsor. Uppe till vänster ser man en serie magnetband.

Mikrokontroller ESP32-C3 är en RISC processor som är konstruerad för att köra en operation per klockcykel. Ett minnesord i ESP32-C3 är 32-bitar långt d.v.s. 2.6 ggr. längre an PDP-8 12-bitar. ESP32-C3 kör på en klockfrekvens på 160 MHz d.v.s. ungefär 270 ggr snabbare än PDP-8. Programminnet i mikrokontrollern är maximalt ca. 1 000 000 miljon ord jämfört med PDP-8 32 000 ord skillnaden är ungefär 30 ggr till mikrokontrollerns fördel.

Prisskillnaden mellan mikrokontrollerns 1.52 Euro och PDP-8 pris på 18500 dollar är svår att uppskatta. Om man uppskattar vad PDP-8 skulle ha kostat i dagens pris får man alltså lägga till ungefär en faktor tio d.v.s. priset omräknat till modernt pris blir ungefär 200 000 dollar. PDP-8 skulle alltså ha varit ungefär 130 000 ggr dyrare än mikrokontrollern ESP32-C3.

Om vi kombinerar hur mycket mera kapacitet den lilla ESP32-C3 har än PDP-8 på vilken den första Unix varianten skrtevs, Unix är förebilden för Linux som nu dominerar världens datorer, så kommer vi fram till en kapacitetsförbättring tekniskt och prismässigt på ungefär 1 000 000 000 ggr.

Uppskattningen av en kapacitetsförbättring pris/snabbhet/minne etc. på en miljard gånger är, tycker jag, ett bra exempel på vad Moore’s lag är!

Programkoden till CO2-mätaren finns nedan. Notera att det är ett snabbt hack där det bl.a. finns funktioner relaterade till SD-minnet som inte används i detta skede. Programmet innehåller mycket kommentarer d.v.s. det torde vara möjligt att förstå koden utan någon djup erfarenhet av programmering.

Några kommentarer till koden:

En rad som börjar med // är en kommentar avsedd att läsas av människor. En kommentar körs inte av processorn.

En funktion har utseendet namn()

Då man hanterar hårdvara behöver man veta vilka ”ben” på processorn man vill styra. De flesta ben är logiskt kopplade till generell In/Ut funktionalitet ofta kallad GPIOxx där xx är in/ut enheten nummer se fig. 1 ovan där det i bilden anges vilka GPIO som är kopplade till vilka ben.

Det är mycket lättare att läsa ett program om man hänvisar till t.ex. den inbyggda blå lysdionen med LED_BUILTIN i stället för In/Ut funktionens nummer som är 8. Jag kan alltså definiera att på varje plats i programmet där jag styr lysdioden så byter kompilatorn ut LED_BUILTIN mot talet 8 exempelvis kan vi definiera:

#define LED_BUILTIN 8

På motsvarande sätt har jag gett namn på in/ut ben för att controllera bildskärmen och SD minneskortet.

Funktionen setup() körs alltid automatiskt då processorn startar. Funktionen används för att ställa in önskad funktionalitet t.ex. serieportens hastighet innan processorn börjar köra sin eviga slinga loop() . Olika funktioner, i vårt fall i huvudsak kopplade till kontroll av SD minnet, finns definierade mellan setup() och loop().

// Name: ESP32_Mini_OLED.ino
//
// This is a hoppy project to test a ESP32-C3 with built in ultra miniature
// LCD display. A C8-CO2-5K CO2 sensor is used to produce some data to display. The CO2
// sensor produces pulse width modulated square wave pulses. The sensor is connected
// to GPIO 0.
// The result is written to USB serial and written to the miniature
// LCD display of the type U8G2_SSD1306_72X40_ER_F_HW_I2C.
// Measurement data is logged to a SD memory card if available.
//
// The display uses the pins SDA_PIN = 5 and SCL_PIN = 6 for I2C communication. If several
// devices use I2C then make sure they use different I2C addresses.
// Notice that there is no automatic line feed and everything has to be
// written to positions set by program setCursor() or drawString()
//
// The SD memory is connected through a SPI interface. The connections are:
// CS_SD 3
// MOSI_SD 7
// MISO_SD 2
// CLK_SD 9
//
// To connect several devices to SPI use different pins as chip select. MOSI, MISO and CLK
// are common to all units using the SPI interface.
//
// The internal bnlue LED is connectewd to LED_BUILTIN (GPIO8). It is blinking when the system runs normally.
// The Blue led is on when LED_BUILTIN = LOW and off when LED_BUILTIN = HIGH.
//
// Measurements are done once every 5 seconds and logged to screen. Logging to
// SD memory is done once every 15 minutes controlled by the cnt=180 counter variable
// in line.
// The number of the measurement is logged in the variable meas. To get the actual time in
// seconds since start multiply the first number of the number pair with 5.
//
// Remember that:
// 60 s --> 1 minute
// 3600 s --> 1 hour
// 86400 s --> 1 day
//
// Example when was the measurement 896 , 838 taken?
// The first number 896 is the number of the measurement. Measurements are done at 5 seconds
// intervals which means that the measurement was done 5*896 seconds since start = 4480 seconds
// since measurement start roughly = 1 hour 15 minutes sincew start.
//
// Adding USB-serial control to start/stop measurements, clear the /log.txt file
// and dump the /log.txt to the serial monitor.
// file to the serial monitor.
// Commands:
// HELP print a list of known kommands.
// LOG print the contents of the log file.
// CLEAR erase the log file and generate a new one.
// START Comment including start of measurement.
// PAUSE pause measurements to dump file to USB serial.
// In PAUSE mode it is safe to remove the SD memory.
// CONTINUE contyinue measurements after PAUSE.
//
// Measurements are controlled by interrupt to ensure a reasonably accurate clock
// when no RTC is in use. The measurement interval is set to 5 seconds ensuring
// that the previous measurement is processed before starting the next measurement.
//
// Lars Silen 2026. Feel free to use on your own risk.
#include <Arduino.h>
#include <Wire.h>
#include <U8g2lib.h>
#include "FS.h"
#include <SPI.h>
#include <SD.h>
#include <sd_defines.h>
#include <sd_diskio.h>
// Needed for the real time clock and temperature
#include <Wire.h>
//#include <RTClib.h> // Possibly added later.
// Initialize the U8g2 library for the 72x40 SSD1306 display using hardware I2C
// Pin connections on "The Egg" ESP32-C3: SDA = GPIO5, SCL = GPIO6 I2C address 0x78 (actually 2*0x3C)
U8G2_SSD1306_72X40_ER_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
#define SDA_PIN 5
#define SCL_PIN 6
#define CO2_PIN 0
#define CS_SD 3
#define MOSI_SD 7
#define MISO_SD 2
#define CLK_SD 9
#define LED_BUILTIN 8
#define FALSE 0
#define TRUE 1
// If test is defined debugging information is written to USB serial.
//#define TEST
// No real time clock is presently used. THis means that when we start measurements and logging CO2
// we need to enter the start time of the measurements. The clock in the microcontroller is probably
// accurate enough to measure for weeks or months without major timing errors. A RTC uses its own
// battery to keep the clock running even when the micro controller is powered down.
//RTC_DS3231 rtc;
unsigned long duration;
int cnt = -1; // We want to make measurements stable before starting to log
int meas = 0; // Number of measurements since start
int shortCnt = 0; // Used for update interval on LCD
uint8_t cardType = 0; // Not known yet.
int SD_available = FALSE;
String line="Dummy";
String inputLine="";
int timerTrig=FALSE;
int tmpPause = FALSE;
const int ledPin = LED_BUILTIN;
hw_timer_t *MyTimer = NULL;
void IRAM_ATTR onTimer() {
timerTrig = TRUE;
}
void setup(void) {
// Set up control pins for the display
Wire.begin(SDA_PIN, SCL_PIN);
u8g2.setI2CAddress(0x78); // Actually 2*0x3C
u8g2.begin();
// Allow debugging asnd control over USB serial
Serial.begin(115200);
while (!Serial); // Ensure that USB serial is running.
// We use pin 0 to read the pulse width from the C8-CO2-5K CO2 sensor
pinMode(CO2_PIN, INPUT);
// Set up SPI for the SD memory
SPI.begin(CLK_SD, MISO_SD, MOSI_SD, CS_SD);
if (!SD.begin(CS_SD)) {
Serial.println("Card Mount failed!");
SD_available = FALSE;
} else {
Serial.println("SD Card initialized.");
Serial.print("SD Card Type: ");
Serial.println(cardType);
}
pinMode(LED_BUILTIN, OUTPUT); // LED is on when the pin is LOW off when HIGH.
cardType = SD.cardType(); // Card types not checked at the moment. Max size 32 GB.
// Initialize the timer with a 1 MHz frequency (1 tick = 1 microsecond)
MyTimer = timerBegin(1000000);
// Attach the interrupt service routine (ISR). The ISR should be kept very short. We simply set the
// state of the timerTrig to TRUE indicating that a measurement should be taken. The time accuracy of
// the measurement is in the order of one second because the frequency of the PWM output from
// the sensor is roughly 1 Hz. For a slowly changing signal like the CO2 concentration this is perfectly OK.
timerAttachInterrupt(MyTimer, &onTimer);
// Set the alarm limit in microseconds (e.g., 5000,000 us = 5 s) and enable auto-reload (true)
// As can be seen in the main loop below measurements are stored to SD memory at 15 minutes intervals.
// The measurements done at 5s intervals are only used to update the display and USB serial.
timerAlarm(MyTimer, 5000000, true, 0);
// Start the timer
timerStart(MyTimer);
}
// Presently not used.
void listDir(fs::FS &fs, const char * dirname, uint8_t levels){
Serial.printf("Listing directory: %s\n", dirname);
File root = fs.open(dirname);
if(!root){
Serial.println("Failed to open directory");
return;
}
if(!root.isDirectory()){
Serial.println("Not a directory");
return;
}
File file = root.openNextFile();
while(file){
if(file.isDirectory()){
Serial.print(" DIR : ");
Serial.println(file.name());
if(levels){
listDir(fs, file.name(), levels -1);
}
} else {
Serial.print(" FILE: ");
Serial.print(file.name());
Serial.print(" SIZE: ");
Serial.println(file.size());
}
file = root.openNextFile();
}
}
// Presently not used.
void createDir(fs::FS &fs, const char * path){
Serial.printf("Creating Dir: %s\n", path);
if(fs.mkdir(path)){
Serial.println("Dir created");
} else {
Serial.println("mkdir failed");
}
}
// Presently not used.
void removeDir(fs::FS &fs, const char * path){
Serial.printf("Removing Dir: %s\n", path);
if(fs.rmdir(path)){
Serial.println("Dir removed");
} else {
Serial.println("rmdir failed");
}
}
// Dump CO2 measurements to USB serial.
void readFile(fs::FS &fs, const char * path){
Serial.printf("Reading file: %s\n", path);
File file = fs.open(path);
if(!file){
Serial.println("Failed to open file for reading");
return;
}
Serial.print("Read from file: ");
while(file.available()){
Serial.write(file.read());
}
file.close();
}
// Log measurements to the SD memory. If the file doesn't exist create it.
void writeFile(fs::FS &fs, const char * path, const char * message){
Serial.printf("Writing file: %s\n", path);
File file = fs.open(path, FILE_WRITE);
if(!file){
Serial.println("Failed to open file for writing");
return;
}
if(file.print(message)){
Serial.println("File written");
} else {
Serial.println("Write failed");
}
file.close();
}
// Write measurements to the end of the file (append).
void appendFile(fs::FS &fs, const char * path, const char * message){
Serial.printf("Appending to file: %s\n", path);
File file = fs.open(path, FILE_APPEND);
if(!file){
Serial.println("Failed to open file for appending");
return;
}
if(file.print(message)){
Serial.println("Message appended");
} else {
Serial.println("Append failed");
}
file.close();
}
// Not presently used.
void renameFile(fs::FS &fs, const char * path1, const char * path2){
Serial.printf("Renaming file %s to %s\n", path1, path2);
if (fs.rename(path1, path2)) {
Serial.println("File renamed");
} else {
Serial.println("Rename failed");
}
}
// Clear the file.
void deleteFile(fs::FS &fs, const char * path){
Serial.printf("Deleting file: %s\n", path);
if(fs.remove(path)){
Serial.println("File deleted");
} else {
Serial.println("Delete failed");
}
}
// The main loop of the program. A program in a micro controller never stops. When the end of
// the main loop is reached all local variables, local to loop() are cleared and execution starts
// from the beginning of the loop(). Global variables are not cleared.
void loop(void) {
digitalWrite(LED_BUILTIN, HIGH);
// Measurements are timer trigged at set interval for example 5 s see setup.
if(timerTrig==TRUE){
duration = 0;
while(duration == 0){
duration = pulseIn(CO2_PIN, HIGH, 1004000);
}
cnt++;
meas++;
shortCnt++;
//duration = pulseIn(CO2_PIN, HIGH, 1004000);
if ( duration != 0) {
duration = ((duration -2000)*5)/1000;
//if(shortCnt>=5){
if(tmpPause==FALSE){
Serial.println(duration);
}
//shortCnt = 1;
}
u8g2.clearBuffer(); // Clear the internal memory
u8g2.setFont(u8g2_font_ncenB08_tr); // Choose a suitable font
//u8g2.drawStr(0, 10, "LASSE"); // Write text to x=0, y=10
u8g2.setCursor(0,30); // set cursor position
u8g2.print(duration);
u8g2.drawStr(0, 10, "CO2 ppm"); // Write text to x=0, y=30
u8g2.sendBuffer(); // Transfer internal memory to the display
// Log data interval in seconds is 5* limit below.
// Limit=12 --> interval 60 s. 180 --> 15 minutes.
if (((cnt>=180) || (cnt<1)) && (tmpPause==FALSE)){
// Convert time to seconds since start. %s measurement interval
line = String(meas*5)+String(" , ")+String(duration);
File dataFile = SD.open("/log.txt", FILE_APPEND);
if (dataFile) {
//Serial.println("File opened");
//dataFile.println(duration);
dataFile.println(line);
#ifdef TEST
Serial.print("Wrote:");
Serial.println(line);
#endif
dataFile.close();
//Serial.println("File closed");
} else {
Serial.println("File append failed!");
}
cnt = 1;
}
timerTrig = FALSE;
}
// Check for commands over the USB serial the main loop runs at 1/10 of a second
// Measurements are done at 5 s intervals controlled by the timer.
// CO2 is displayed at every measurtement but storage is done
if(Serial.available()){
String inputLine = Serial.readStringUntil('\n'); // Read until newline
inputLine.trim();
inputLine.toUpperCase();
#ifdef TEST
Serial.println(inputLine);
#endif
if(inputLine.substring(0,3)=="HEL"){
Serial.println();
Serial.println("\nCommands:");
Serial.println("HELP print a list of known kommands.");
Serial.println("LOG print the contents of the log file.");
Serial.println("CLEAR erase the log file and generate a new one.");
Serial.println("START Comment including start of measurement.");
Serial.println("PAUSE pause measurements to dump file to USB serial.");
Serial.println(" In PAUSE mode it is safe to remove the SD memory.");
Serial.println("CONTINUE contyinue measurements after PAUSE.");
}
if(inputLine.substring(0,3)=="CLE"){
#ifdef TEST
Serial.println("Command CLEAR");
#endif
deleteFile(SD,"/log.txt");
// Generate a new empty file
writeFile(SD,"/log.txt","\n");
}
if(inputLine.substring(0,3)=="LOG"){
#ifdef TEST
Serial.println("Command LOG");
#endif
tmpPause = TRUE;
readFile(SD, "/log.txt");
tmpPause = FALSE;
#ifdef TEST
Serial.println("Printed the log file to USB serial");
#endif
Serial.println();
}
if(inputLine.substring(0,3)=="PAU"){
#ifdef TEST
Serial.println("Command PAUSE");
#endif
tmpPause = TRUE;
}
if(inputLine.substring(0,3)=="CON"){
#ifdef TEST
Serial.println("Command CONTINUE");
#endif
tmpPause = FALSE;
}
if(inputLine.substring(0,3) == "STA"){
#ifdef TEST
Serial.println("Command START");
#endif
appendFile(SD,"/log.txt",inputLine.c_str());
appendFile(SD,"/log.txt","\n");
tmpPause = FALSE; // Ensure that measurements start regardless of history.
}
inputLine = "";
}
delay(100);
digitalWrite(LED_BUILTIN, LOW);
}

Matstrupscancer alternativ 3 bestrålning

20/03/2026

Om vi vill lägga in strålbehandling i den medeltida medicinens palett så ser vi en modern variant av den medeltida behandlingsformen bränn. Vid amputation av t.ex. ett ben så brände man sårytan bl.a. för att stoppa akut blodflöde samt utan att känna till det också förhindra direkt infektion till följd av förorenade verktyg vid ingreppet. Man kunde bränna sårytan med ett hett järn eller med het olja. Resultatet var naturligtvis att man förhindrade direkt infektion av det brända området men man skapade samtidigt en eventuellt relativt stor brännskada som kombinerad med shock naturligtvis kunde vara dödlig. En brännskada omfattande 30% av kroppsytan ansågs vara dödlig inom några dagar.

Idag används bränning för att stoppa blödning från mindre blodkärl. Olika instrument finns tillgängliga som kan bränna mycket exakt och på ett litet område. Min uppfattning är att denna typ av bränning sannolikt är ett bra och viktigt verktyg för en kirurg, inga negativa kommentarer här!

Dagens bränning av större områden använder bestrålning. Man vet, efter mängder av experiment och olyckor i röntgen- och kärnfysik, att olika typer av kortvågig strålning såsom röntgenstrålning och gammastrålning och partikelstrålning i hög dos dödar celler. Typen av strålning inverkar i hög grad på strålningens effekt.

De första försöket att använda strålning var Victor Despeignes en fransk läkare som bestrålade en tumör med röntgenstrålning under en veckas tid. Resultatet var att smärtorna minskade och tumören blev mindre. Slutresultatet var dock att patienten dog.

Något senare började man undersöka effekterna av Radium som man kunde ge som salter eller föra in i t.ex. en tumör i en liten kapsel. Vid sönderfall ger radium alfa, beta och gammastrålning. Jag gissar att effekten av radium främst är gammastrålning eftersom både beta (elektroner) och alfa (Heliumkärnor) absorberas mycket snabbt. Jag antar att själva radiumbehållaren absorberade både alfa och beta strålning och det som blev kvar är gammastrålning som kan uppfattas vara mycket energirik röntgenstrålning.

Problemet med bestrålning är att både kroppens friska celler och cancerceller påverkas. För att bestrålningen skall bli lyckad måste cancern få en betydligt högre dos än de friska cellerna i närheten. Detta kan man idag med datrostyrda system göra så att strålningen kommer ur maskinen i ett mycket smalt knippe/stråle. Genom att bestråla tumören fron olika riktningar så att strålen alltid riktas genom cancern kan man sprida ut dosen som träffar friska celler medan cancern oberoende av varifrån strålen alltid träffas. Resultatet blir att cancersvulsten kan utsättas för mångdubbel stråldos som kan vara tillräckligt hög för att döda eller krympa ner en cancersvulst.

I många fall kan strålbehandling förbättra livskvaliteten temporärt genom att en cancersvulst minskar i storlek. Det finns dock många bieffekter som är beroende av vilket område på kroppen som bestrålas.

Vad tänker jag själv om strålbehandling

Jag ser strålbehandling som ett hjälpmedel som sannolikt inte botar cancern men som i vissa fall betydligt kan förbättra livskvaliteten genom att temporärt krympa en tumör då inga andra alternativ finns. Om man ser på nobelpristagaren Warburgs teorier från 1930 talet så finns det, som jag ser det, ett stort problem som är speciellt besvärligt vid bestrålning av tumörer i hjärnan. Bestrålningen leder till att kroppen levererar både mera glukos (socker) till tumören men också mera glutamin. Man försöker alltså döda cancern med bestrålning men man levererar samtidigt precis de ämnen till den bestrålade cancern som får cancern att växa d.v.s. glukos och glutamin. Situationen förbättras inte av att de steroider man använder, till exempel efter bestrålade hjärntumörer, för att förhindra svullnad i den bestrålade vävnaden, tenderar att betydligt öka tillgången till glucos även om tillgången på glutamin sannolikt minskar i viss mån. Man göder alltså kvarvarande cancerceller som inte har dött av bestrålningen. Detta område är inte nödvändigtvis undersökt tillräckligt.

Bilden visar hur man genom att bestråla från olika riktningar maximerar dosen på tumören och minimerar skadorna på omgivande vävnader och organ. Bilden är genererad av ChatGPT. Notera att de fyra ”strålhuvudena” i verkligheten är en enda strålenhet monterad på en vridbar arm som kan roteras runt en liggande patient. Patienten kan också under datorkontroll flyttas i längdled så att hela systemet lätt kan programmeras att bestråla flera relativt exakt definierade punkter i kroppen med någorlunda god precision. Under samma behandling kan flera olika tumörer behandlas om så önskas. Speciellt #4 nedan kan vara värd att titta på gällande användning av cortisteroider för att sköta symptomen efter bestrålning.

Avsnitt 2.2 konstaterar:

Similarly, a recent systematic review and meta-analysis of 4,045 patients found that steroid use in individuals undergoing immune checkpoint inhibitor (ICI) therapy increased the risk of disease progression and death by 34% and 54% respectively, compared to non-steroid users (Petrelli et al., 2020). Additionally, another meta-analysis demonstrated that CSs administration for cancer-related indications was significantly associated with worse PFS (HR = 1.735, 95% CI: 1.381–2.180) and OS (HR = 1.936, 95% CI: 1.587–2.361) in ICI-treated patients (Wang et al., 2021).

Några länkar

Reparation av ett elpiano

19/09/2021

Jag råkade av en slump se att ett elpiano av typen Behringer Eurogrand EG2180 fanns till salu. Annonsen konstaterade att ett par tangenter inte riktigt gick tillbaka efter nedslag. Det begärda priset var 55 Euro d.v.s. ca. 500 SEK. Jag träffade säljaren som visade sig vara en trevlig utländsk studerande som studerar teknik på den avdelning på Aalto universitetet där jag själv i tiderna har undervisat. Säljaren var tydligen rätt förvånad över att jag var ganska ointresserad av att provspela instrumentet efter att jag såg att elektroniken tydligen fungerade. Jag var ju medveten om att jag sannolikt skulle vara tvungen att plocka isär instrumentet helt. Jag visste mycket väl att det fanns många fel.

Det blev affär och jag prutade upp priset till 60 Euro för att en student nog behöver pengarna…

Fig. 1 Utgångmgsläget då instrumentet var inburet men stativet kvar på kärran. De blå tejpbitarna visar tangenter som inte går tillbaka efter nedslag eller tangenter där känslan tydligt var fel men där tangenter trots viss tvekan själv gick tillbaka.

Det första skedet var att kartlägga så många fel som möjligt. Kartläggningen gick ut på att trycka på en knapp i taget och observera hur tangenten uppför sig. Det visade sig naturligtvis att det fanns betydligt fler tvivelaktiga tangenter än vad som angivits i annonsen … inget problem och egentligen helt väntat. Fig. 1 visar den första kartläggningen av fel. Notera att ett par tangenter som inte går tillbaka blev femton i detta skede. I ett senare skede kom det till ett antal fel då inte alla tangentsensorer fungerade korrekt.

Fig. 2 Skyddslocket över tangenterna, samt övre delen av instrumentet är demonterade. Kontrollpanelen som normalt ligger vid bakändan av tangenterna ligger upp och ned över högtalarna (det långa blå kretskortet). Ungefär på mitten, strax nedanför flatkablarna ser man ett litet nästan kvadratiskt elektronikkort som utgör instrumentets hjärna. Jag gissar att kortet i stort sett i fråga om datorkraft motsvarar en Raspeberry Pi dator som kostar 30-40 Euro. Ovanför flatkablarna ser man nätaggregatet.

För att kunna fixa tangentbordet måste det tas loss. Under framkanten av tangentbordet ungefär där limlapparna sitter finns en rad kanske 50 mm långa maskinskruvar skruvade underifrån in i tangentbordet. Genom att ställa instrumentet att stå på bakkanten var det inga problem att lossa skruvarna.

Längs den inre kanten av tangentbordet finns en rad skruvar som håller fast tangenbordet från insidan. En del av dessa skruvar saknades eftersom någon eller flera tidigare ägare har varit inne i instrumentet. Innan man lyfter ut tangentbordet är det skäl att lossa de två smala flatkablarna till processorkortet. Jag märkte kablarna V och H för att veta i vilken ordning kablarna skall moteras. Om man byter plats på kablarna så får man ett intressant instrument där diskanten klingar till vänster för att mitt på instrumentet byta till bas … ingenting går dock sönder om man kopplar fel. Av detta kan man naturligtvis dra slutsatsen att jag åtminstone en gång kopplade fel trots att kablarna var märkta, ”errare humanum est” d.v.s. det är mänskligt att fela. Uttrycket fortsätter ”perseverare autem diabolicum” som man antagligen kan översätta med att om man fortsätter att fela så hör det fan till …

Fig. 3 Det tunga(!) tangentbordet kan då skruvarna har lossats försiktigt lyftas ur och ligger nu på bordet. På undersidan av tangentbordet finns falska klubbor vars uppgift är att ge rätt känsla vid anslag som också slår mot tangentens hastighetssensor. Klubborna är monterade i modulen som i bilden ligger ovanpå tangentbordet. Tangenterna kan enkelt demonteras genom att lossa ett metallstöd och en svart ”kilribba” som fixerar tangenternas bakändor. I bilden har alla tangenter i den losstagna oktavmodulen demonterats. Tangenterna sjuts försiktigt bakåt varefter de kan lyftas bort.
Fig. 4 Tangenterna är fixerade på plats med en metallprofil samt en kilribba i plast. Då kilribban tas loss kan en tangent skjutas bakåt och sedan lyftas bort. Det visade sig att det speciellt vid återmonteringen ofta var lättare att montera vissa svarta tangenter före vita tangenter eftersom de vita tangenterna annars låg i vägen vid montering.

För att klubborna skall kunna demonteras måste de två långa gula kretskorten med tangentsensorer tas bort. Totalt blir det då att lossa 66 skruvar …

Fig. 5 Klubbornas moduler (en oktav) är skruvade till de två kretskorten. Det är inte möjligt att lossa en modul utan att lossa kretskorten. I bilden har det ena kretskortet redan demonterats. Längden på ett kretskort är halva längden av tangentbordet, det är alltså skäl att hantera kretskorten med försiktighet så att de inte skadas.

De två kretskorten utgör två enkla scannade brytarmatriser. Antalet kontakter är dubbla antalet mot antalet tangenter eftersom en tangenttryckning alltid aktiverar två kontakter. Kontakterna är monterade på olika avstånd från kretskortet och processorn uppskattar nedslagets hastighet genom att mäta tiden mellan de två kontaktaktiveringarna. I fig. 5 ser man uppstickande gummiben (grå samt genomskinlig) från kontakterna som utgörs av kontaktytor av grafit i gummibubblor som trycks mot spår i kretskortet. Mer om sensorerna senare i texten.

Fig. 6 Klubborna löper mycket dåligt. Notera hur fyra klubbor inte faller tillbaka av egen vikt. Det är också självklart att det inte hjälper att smörja in tangenterna eftersom friktionen finns i klubborna inte i tangenterna. Jag tror inte att det fanns en enda oktavmodul som inte hade kärvande klubbor. Resultatet var att jag servade alla klubbor.

Det är rätt enkelt astt fixa de kärvande klubborna. Man tar en lämplig metalldorn med diametern mindre än 8 mm och slår försiktigt ut axeln som går genom alla hamrarna. Det lönar sig att knacka loss axeln med modulen liggande på ett bord så att man inte blir med en grupp hamrar i famnen. Den urknackade axeln används nu som testverktyg då man med fil, borr eller brotch försiktigt vidgar axelhålet i de olika hamrarna. Jag ökade försiktigt på håldiametern tills klubban löpte lätt utan att kärva men fortfarande utan glapp. Det kan också vara skäl att försiktigt fila klubbans plastdel från sidorna eftersom problemet tydligen är att den gjutna plastdelen sväller med tiden då spänningar från tillverkningen släpper.

Fig. 7 En demonterad klubba. Problemet med kärvande klubba verkar vara att plasten med tiden sväller som en jäsande deg vilket ökar friktionen i hålet i den vita plastdelen överst. Då man jobbar med klubban kan det vara skäl att demontera den lilla triangelformade svarta plastdelen i närheten av axeln. Man kan mycket lätt tappa denna del och jag vet inte var man skulle hitta reservdelar. Lägg den åt sidan då du jobbar med tangenten. Jag tappade en av dessa svarta delar på golvet i den inte välstädade snickarboan men jag hittade den!

Jag behövde ungefär en och en halv timme för att fixa den första oktaven. De följande oktaverna krävde sedan ca. 20 minuter per oktavmodul. Övning ger färdighet.

Efter att de kärvande klubborna var fixade … jag kontrollera alla klubbor inte endast de som ursprungligen märkts med tejp, plockade jag ihop tangentbordet och kopplade det temporärt till instrumentet. Tangenterna fungerade nu perfekt. Det fanns inga kärvande tangenter och touchen var bra. Jag hittade dock ett antal tangenter som uppförde sig konstigt vid en tangenttryckning.Det fanns tre kategorier av fel:

  • Tangenten gav ett mycket kraftigt ljud helt oberoende av hur kraftigt jag tryckte på tangenten.
  • Tangenten gav ett svagt ljud då man tryckte på den och ett kraftigt ljud då man släppte upp den.
  • Tangenten gav ett svagt ljud oberoende av anslagets styrka.

Orsaken till ovanstående fel är följande:

Då tangenten ger ett kraftigt ljud oberoende av hur svagt man trycker på tangenten så betyder detta att den kontakt som ligger längre ifrån kretskortet gör kontakt medan den närliggande kontakten inte gör det. Processorn tolkar då anslagshastigheten som mycket hög med hög ljudvolym som resultat. Lösningen är att kontrollera att det inte finns fett, olja eller damm på kontaktytorna.

Då tangenten endast ger ett svagt ljud oberoende av anslagets styrka så betyder detta att kontakten närmare kretskortet ger kontakt korrekt men den andra kontakten längre ifrån kretskortet sluter inte vilket processorn tolkar som ett extremt långsamt anslag och resultatet blir en mycket svag ton.

Dubbeltonen svag/stark beror sannolikt på kontaminering med t.ex. olja som någon tidigare reparatör hade använt rikligt av. Då tangenten trycks ner så sluter endast den närliggande kontakten till kretskortet med resultatet att vi får en svag första ton. Då jag släpper upp tangenten så har oljan hunnit pressas undan och kontakten längre ifrån kretskortet sluter vilket tolkas som en separat kraftig knapptryckning.

Fig. 8 En tidigare reparatör hade tydligen inte förstått hur avkänningen av knapptryckningar fungerar utan man hade försökt korrigera något fel genom att lägga till ”dämpning?) i form av skumplastbitar. Sensormodulen till vänster är korrekt medan den gula skumplasten till höger inte hör dit.

I fig. 7 har sensorkretskorten monterats loss och vi kan se undersidan och de runda kontakttornen som klubban slår mot. Varje runt torn består av två kontakter. Mitt i ett torn finns en liten rund kontakt kanske en mm från kretskortet. Runt basen på ett torn finns en kontakt som går runt tornet och som ligger mycket nära kretskortet. Då man trycker på sensorn så kommer tydligen ringelektroden först att göra kontakt och sedan centralelektroden. Som jag nämnde ovan så verkar standardkonstruktionen i andra elpianon vara en dubbelrad sensorer med en kontakt per torn.

Man kan utan problem dra loss sensormodulerna för putsning men det blir en del pillrande för att få dem tillbaka på plats. Det är igen skäl att notera att jag inte vill skada någon gummimodul eftersom det kan vara extremt svårt att hitta reservdelar.

Fig. 9 En del av de bortplockade skumplastbitarna som inte skall finnas i sensorerna. Det fanns betydligt mer …

Den jobbigaste delen av reparationen var att hitta problemtangenter. Tangentbordet måste vara hopbyggt för att man skall kunna testa det. För att putsa en kontakt måste jag skruva loss det gula kretskortet i tangentbordet d.v.s. 33 skruvar. Det är skäl att alltid provspela hela tangentbordet och märka konstiga tangenter med tejp och en beskrivning av symptomen. Jag gissar att jag blev tvungen att öppna tangentbordet för justering fyra gånger innan jag fick alla fel fixade.

Fig. 10 Det hade använts rikligt med tunnflytande olja vid tidigare reparationsförsök tydligen för att fixa de kärvande klubborna. Resultatet var att det under en del av sensorerna fanns olja. Notera hur kretskortets svarta kontaktytor är våta av olja och olja finns naturligtvis också på gummidelens grafitytor.

Jag tog loss sensordelen av gummi på två ställen för att fixa kontaktproblem (se beskrivning av symptomen ovan). I fig. 10 ser man hur mittkontakten ser torr ut medan ringkontakten är nerkladdad av olja. Resultatet torde ha varit att ifrågavarande tangenter endast gav ett mycket kraftigt ljud eftersom processorn tror att anslaget sker med nästan oändlig hastighet.

Det visade sig att Biltemas elektronikrengöring på sprayburk fungerade bra. Jag använde vaddstickor fuktade med rengöringsmedel för att putsa kretskortet. Jag tog helt loss sensordelen av gummi och sprutade rikligt av rengöringsämne vid kontaktytorna. I ett skede såg det lite skrämmande ut då rengöringsmedlet tydligen reagerade med gummit vilket fick som resultat att gummidelen rullade ihop sig som en mask. Då jag monterade tillbaka sensordelarna och satte ihop tangentbordet så visade det sig ingen tangent i den genomskinliga sensormodulen i bilden ovan fungerade … uups! Då jag provspelade några timmar senare så hade tvättmedlet avdunstat helt och tangenterna fungerade korrekt.

Fig. 11 Sensormodulen från insidan. Vi ser ringelektroden som i viloläget är väldigt nära kretskortet och tydligen sluter kontakt genast vid en knapptryckning och således sätter igång en hastighetsmätning. I centrum finns en annan elektrod som är moterad kanske en mm högre och som ger inform om när hastighetsmätningen är slut. Notera hur den tvättade sensormodulen försöker rulla ihop sig. Spänningar i gummiblandningen gör ringelektroden elliptisk i stället för cirkelrund. Lyckligtvis så återfick sensorn sin ursprungliga form då allt lösningsmedel hade avdunstat.
Fig. 12 En annan sensor som har tagit stryk av olja. Notera hur tre av fyra ringelektroder helt eller delvis är oljiga.
Fig. 13 Motsvarande sensormodul innan tvättning. Vi ser att tre av fyra sensorer är nedsölade av olja.

Vad blev resultatet

Efter två dagars arbete är instrumentet hopmonterat och allt fungerar perfekt såvitt jag vet. Resultatet blev ett mycket trevligt elektriskt piano med, som jag uppfattar det, ett härligt ljud och mycket realistisk touch i tangenterna till ett pris på ca. 70 Euro då jag blev tvungen att satsa en tia på elektronikrengöringsmedel.

Projektet var väldigt lärorikt. Jag hade ingen aning om att ett elektriskt piano har hammare i likhet med ett riktigt piano. Felsökningen av starka/svaga och dubbla toner gjorde att jag nu förstår hur instrumentet känner av anslagshastigheten och jag kan genom att lyssna på en spelad ton höra om allt är ok eller om det finns ett sensorfel. Jag uppfattar att användningen av två kontakter för varje tangent är genialisk genom sin enkelhet. Ett sensorfel går att känna igen direkt på ljudet d.v.s. jag vet på förhand vilken typ av fel jag kan förvänta mig d.v.s. jag vet vilkendera sensorn som är orsak till problemet.

Notera att de flesta elektriska pianon har sensorerna placerare som två separata mittelektroder ovanför varandra inte som i Behringerinstrumentet kombinerade. Fördelen med den vanligare konstruktionen är att det är möjligt att hitta reservdelar till andra instrument medan det tydligen inte finns mycket reservdelar tillgängliga för Behringer.

Ett jättetrevligt projekt som inte blev sämre av att jag på slutändan fick ett fullt fungerande instrument som jag annars sannolikt hade varit tvungen att betala 500-700 Euro för. Projektet visar också väldigt konkret att en fullständig genomgång av ett modernt elpiano inte är billigt. Då jag Googlade så hittade jag en prisuppskattning gällande service som gick på $500 vilket nog inte är något rövarpris för ett jobb som jag uppskattar att jag, om jag skulle göra om det, skulle kunna göra på en dag. Det stora jobbet var de kärvande tangenterna/hamrarna. Putsning av sensorerna krävde på slutet ungefär en halv timme mellan varven men innan allt fungerade så blev det några varv.

Gott nytt år du sköna nya värld

01/01/2021

Intressant lågmäld diskussion kring censureringen av SWEBBTV. En intressant detalj är kommentaren att samtidigt som SWERBBTV stängdes ner så försvann dokument relaterade till SWEBBTV från molntjänsten. Betyder detta att det har varit människor involverade som har valt ut de dokument som leverantören ansett att borde försvinna.

Min personliga uppfattning är att inget företag och ingen organisation borde basera sin IT på molntjänster levererade av Google. Det verkar självklart att Google har fri tillgång till allt material d.v.s. alla dokument som lagras i molnet, tillgång till all e-post och sannolikt så att detta gäller också e-post som användaren raderar.

Länknamnet används i framtiden

Den allt hårdare censuren (Google (=Youtube) och facebook) där icke önskvärt material plötsligt försvinner kräver idag att länkat material är tillräckligt beskrivet i textform så att användaren senare kan använda alternativa sökmotorer för att hitta borttaget material. Notera att material ofta publiceras också på alternativa mediaplattformar d.v.s. materialet kan fortfarande hittas även om Youtube raderar det.

Nedanstående länk kan sökas med hjälp av alternativa sökmotorer:

”Censuren av SWEBBTV | Mikael Willgert gästar Jonas …”.

Jag uppfattar Mikael Willgert som en lågmält fysiker som tänker igenom det han säger minst två gånger innan orden kommer över hans läppar. Argumentet Youtube använder för att blockera SWEBBTV är att det skulle förekomma ”hatretorik” något jag har mycket svårt att se i något av SWEBBTV:s program. Däremot är det självklart att att det säkert svider många gånger i skinnet på makteliten (med socialdemokraterna i centrum) som som största sannolikhet är beställaren som ligger bakom censuren av alternativmedia i Sverige. Ingen tror väl att en rabatt på elskatten, som sjunker från 29 öre/kWh till 0,5 öre/kWh (kan variera något mellan de stora spelarna Google, Facebook och Amazon), kommer utan krav på motprestationer?

Miniprojekt: Metronom i klockan

02/09/2020

Jag har köpt en del småsaker, främst elektronik, från Banggood som är ett kinesiskt företag. Hittills har beställningarna kommit ungefär enligt beräknad tid men COVID-19 ställer till med problem. Tidigare beställningar

 
  • Visningar
  • Besökare

leder till att Banggood via facebook synbarligen aktiverar reklam aktuell för mig.

Jag råkade stöta på reklam för en ny aktivitetsklocka Lilygo T-Watch-2020. Klockan är baserad på en ESP32 mikroprocessor med två kärnor. Klockan innehåller WiFi funktionalitet med bl.a. en webbserver och också Bluetooth funktionalitet. Det speciella med den här klockan är att den från början är avsedd att hackas d.v.s. källkoden finns på github och den programmeras direkt över USB-anslutningen.

Då man får en ny programmeringsleksak så uppstår naturligtvis genast problemet med vad man skall göra med apparaten.  Färdiga funktioner är bl. a.

  • Väderapp
  • Stoppklocka
  • Kryptovaluta
  • Navigering via kart-API

Då jag sysslar med folkmusik som hobby så slog det mig att det kunde vara praktiskt att ha en enkel metronom i klockan som innan jag börjar spela ett stycke slår t.ex. tio slag med hjälp av klockans vibrationsmotor. Tanken är alltså inte att jag skulle spela hela stycken med klockan som metronom utan klockan skulle endast upplysa mig om ungefär vilket tempot är, att mentalt tänka sig ett tempo kan ibland leda fel rejält eftersom hjärnan inte i alla sammanhang går i realtid …

Operativsystem

Klockan kör ett kompakt realtidsoperativsystem FreeRTOS som stöder multitasking d.v.s. jag kan köra flera applikationer parallellt. Det är också i princip möjligt att ladda in nya program medan klockan är i gång eller stänga av obehövliga program. Den senare funktionaliteten används inte utan gör jag förändringar så kompilerar jag om rubbet och laddar upp allt som ett paket till klockan.

Man hittar FreeRTOS dokumentation på nätet.

Metronom

Jag plockade hem en klockversion från Github. Då jag ögnade igenom applikationerna som fanns färdigt så såg jag att det fanns en exempel app som inte gjorde någonting men som visade vilken struktur en app har.

Jag beslöt att försöka göra en extremt enkel applikation där användaren använder sig av en slider d.v.s. en funktion där man drar en indikator i sidled för att ställa in tempot. Jag tänkte mig att tempot kan ställas mellan 50 och 200 slag per minut. Det finns inga tekniska problem med att använda lägre tempon men jag uppfattar 50 slg/minut som väldigt långsamt. Då klockan startar är det förinställda värdet 100 slag/minut och klockan kommer ihåg det senast valda värdet mellan olika körningar av appen.

I princip borde applikationen ha varit väldigt enkel att realisera men det visade sig att indikatorhuvudet som samtidigt användes för att visa valt tempo var alltför litet d.v.s. det var svårt att se det valda tempot. Jag försökte kringgå problemet genom att lägga till ett separat textfält som skulle innehålla det valda värdet. Det nya textfältet förorsakade en omedelbar crasch.

Efter att jag två dagar hade slagit huvudet i väggen beslöt jag att byta ut slidern mot en spinbox där man i mitten har ett textfält och på vardera sidan tryckknappar som sänker/höjer det valda värdet. Det var tydligen något problem med slidern för nu fungerade val av tempo som det skulle.

Jag modifierade setupdelen i exempelapplikationen så att man väljer tempot med spinboxen och då man går ur tempofunktionen så gör klockan tio slag i det valda tempot varefter det sker retur till appens huvudnivå.

Call back funktioner

static void exit_example_app_setup_event_cb( lv_obj_t * obj, lv_event_t event );
static void example_app_metr_spinbox_event_cb(lv_obj_t * obj, lv_event_t event );
static void lv_spinbox_increment_event_cb(lv_obj_t * obj, lv_event_t event );
static void lv_spinbox_decrement_event_cb(lv_obj_t * obj, lv_event_t event );

Då användaren trycker på olika funktioner måste användargränssnittet kunna ”skicka signaler” till användarens kod så att den kan köras. För detta ändamål behöver vi såkallade callback funktioner. Om jag t.ex. trycker på knappen ”-” så stegas det valda tempot ner med ett steg (systemet anropar lv_spinbox_decrement_event_cb). Trycker jag på ”+” så stegas värdet upp med ett steg( lv_spinbox_increment_event_cb anropas).

Då jag trycker på återgång till appens huvudnivå så anropas exit_example_app_setup_event_cb. Denna funktion anropar funktionen execute_taps() som vibrerar telefonen tio gånger i önskat tempo.

// Let the metronome do ten taps
static void execute_taps(int taps, int tempo){
  int i;
  int taplen=0;
  int fixed = 100;
  float ms=60000;
  taplen = ms/tempo; 
  // Buzzer pin output BUZZER=4
  for(i=0; i< taps; i++){ 
    pinMode(BUZZER,OUTPUT);
    digitalWrite(BUZZER,ON);
    delay(fixed);
    digitalWrite(BUZZER,OFF);
    delay(taplen-fixed);
  }
}

Spinnboxen

Då klockan programmeras så har man tillgång till ett enkelt grafiskt användargränssnitt lvgl vilket i ytterst hög grad förenklar programmeringen. Problemet är dock att det finns rätt många olika grafiska gränssnitt och det kräver alltid en del läsande att börja använda ett nytt gränssnitt … så även denna gång.

Koden för att sätta upp en spinbox är:

// Create a spinbox center box with value
lv_obj_t *example_app_metr_spinbox_cont = lv_obj_create(example_app_setup_tile,NULL);
lv_obj_set_pos(example_app_metr_spinbox_cont,90,100);
example_app_metr_spinbox = lv_spinbox_create(example_app_metr_spinbox_cont, NULL ); 
lv_spinbox_set_range(example_app_metr_spinbox,50,200);
lv_spinbox_set_digit_format(example_app_metr_spinbox,3,0);
lv_spinbox_set_value(example_app_metr_spinbox,100);
lv_obj_set_event_cb(example_app_metr_spinbox,example_app_metr_spinbox_event_cb);
// Create increment button
lv_coord_t h = lv_obj_get_height(example_app_metr_spinbox);
lv_obj_t * btn = lv_btn_create(example_app_setup_tile, NULL);
lv_obj_set_size(btn, h, h);
lv_theme_apply(btn, LV_THEME_SPINBOX_BTN);
lv_obj_set_style_local_value_str(btn, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_SYMBOL_PLUS);
lv_obj_align(btn, example_app_metr_spinbox, LV_ALIGN_OUT_RIGHT_MID, -20, 0);
lv_theme_apply(btn, LV_THEME_SPINBOX_BTN);
lv_obj_set_style_local_value_str(btn, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_SYMBOL_PLUS);
lv_obj_set_event_cb(btn, lv_spinbox_increment_event_cb);
// Create decrement button
btn = lv_btn_create(example_app_setup_tile, btn);
lv_obj_align(btn, example_app_metr_spinbox, LV_ALIGN_OUT_LEFT_MID, -30, 0);
lv_obj_set_event_cb(btn, lv_spinbox_decrement_event_cb);
lv_obj_set_style_local_value_str(btn, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_SYMBOL_MINUS);

Klockans skärm har upplösningen 240×240 pixlar. Först skapas ett kontext för spinboxen i filen example_app_setup.cpp utgående från specifikationer i appens huvudfönster. Därefter placeras spinnboxen på önskat ställe och programmet ställer in hurudant värdeområde (50-200 slag/minut) som är tillåtna. Programmet ställer också in vilket standardvärde (100 slag/minut) jag vill ha. Därefter skapar jag två tangenter/knappar som stegar spinboxens varde uppåt respektive nedåt.

Grafiska änvändargränssnitt fungerar så att skapade vidgetar själv detekterar om det händer något. I ovanstående fall så kommer tangenterna upp/ner att skicka en ”signal” som säger att en knapptryckning har detekterats. För att programmet skall kunna reagera på knapptryckningen så måste vi definiera såkallade callback funktioner d.v.s. funktioner som användargränssnittet anropar då aktivitet detekteras. I vårt fall är funktionen enkel:

static void lv_spinbox_increment_event_cb(lv_obj_t * obj, lv_event_t event ){
  if(event == LV_EVENT_SHORT_CLICKED || event == LV_EVENT_LONG_PRESSED_REPEAT) {
    lv_spinbox_increment(example_app_metr_spinbox);
  }
}

static void lv_spinbox_decrement_event_cb(lv_obj_t * obj, lv_event_t event ){
  if(event == LV_EVENT_SHORT_CLICKED || event == LV_EVENT_LONG_PRESSED_REPEAT) {
    lv_spinbox_decrement(example_app_metr_spinbox);
  }
}

När spinnboxens kontrollknappar detekterar aktivitet så anropas ifrågavarande funktioner ovan som i sin tur stegar upp spinboxens värde eller stegar ner det.

Aktivera metronomen

Jag valde att aktivera metronomen då man går ut ur inställningen av tempo tillbaka till appens huvudsida. Alternativet skulle ha varit att definiera en separat knapp för att aktivera metronomen. Jag har valt att begränsa antalet slag till tio helt enkelt för att jag uppfattar att jag då har hunnit uppfatta tempot tillräckligt bra.

static void exit_example_app_setup_event_cb( lv_obj_t * obj, lv_event_t event ) {
  switch( event ) {
    case( LV_EVENT_CLICKED ): 
      delay(2000);
      execute_taps(10,lv_spinbox_get_value(example_app_metr_spinbox));
      mainbar_jump_to_tilenumber( example_app_get_app_main_tile_num(), LV_ANIM_ON );
      break;
  }
}

Koden för execute_taps() finns litad tidigare i texten.

Att använda appen

IMGP7532

Fig. 1  Metronomappen syns till höger om väderappen nedanför tiden 20:57.

IMGP7533

Fig. 2  Applikationen metronom (Metr) huvudsida efter att man har valt applikationen genom att trycka på Metr i föregående bild. Kugghjulet leder till val av tempo. I framtiden lägger jag antagligen till t.ex. fyra knappar med fördefinierade tempon på denna sida.

IMGP7534

Fig. 3  Inställning av tempot med en spinbox. Det valda tempot stannar i minnet. Då man väljer retur (trycker på symbolen överst till vänster) så vibrerar telefonen tio gånger i det angivna tempot.

 

Vattentorn kan flyga!

05/08/2020

Gratulationer till SpaceX! Det är imponerande att se hur bra programvara man tydligen har för styrning av en raket. Det är klart att den första 150-metersflygningen är extremt förenklad jämfört med en riktig flygning till omloppsbana men det här är ett steg som måste tas. Testkörningarna av SpaceX nya Raptor raketmotor tyder på att den är väl testad och att förväntningarna på att den skall kunna köras många gånger på samma sätt som den betydligt mindre motorn i Falcon 9 antagligen uppfylls.

Rubrikens ”Vattentorn kan flyga” är vald eftersom många av de experter som bygger SpaceX Starship har en bakgrund som vattentornsbyggare.

Vid den första flygningen har man testat åtminstone:

  • Bränsletanken och motorfästet
  • Bränsletillförseln till motorn under realistiska förhållanden dock utan kraftig acceleration
  • Styrning av motorn (vinkling) i sidled i olika riktningar. Endast en motor användes eftersom motorns dragkraft är mycket stor.
  • Verifiering av styrprogramvara som antagligen helt är baserad på motsvarande program för styrning av Falcon 9.
  • Verifiering av tankningsprocessen
  • Verifiering av sensorer etc. för landningen
  • Verifiering av landningsbenen som bör kunna kompensera i viss mån för ojämnheter i marken.

Den riktiga Starship som skjuts upp i omloppsbana kommer att få en noskon och två par fenor. För det första hoppet behövdes fenorna inte men nästa hopp som kommer att gå till 20 km höjd kommer att testa hur väl fenorna fungerar i praktiken. Paketet överst på raketen i dagens flygning är massa som simulerar de saknade komponenterna på den slutliga raketen men som är mycket billigare om något skulle ha gått fel. Den riktiga Starship kommer att ha tre stycken Raptor motorer optimerade för användning i atmosfären och tre stycken såkallade vacuummotorer som har ett mycket större raketmunstycke även om motorerna i övrigt i princip torde vara identiska. För att man skall få bästa möjliga verkningsgrad hos en raketmotor så bör motorn konstrueras så att det dynamiska trycket i de utrusande gaserna vid den yttre ändan av av raketmunstycket skall vara lika med det yttre atmosfärtrycket. Om trycket i de heta gaserna är större än atmosfärtrycket så kommer gasplymen att breda ut sig i sidled vilket ger sämre verkningsgrad.

En mycket kort video av det första hoppet visas nedan. Än en gång gratulationer till SpaceX!

SWEBBTV:s bästa program någonsin?

26/04/2020

SWEBBTV:s grundare Mikael Wilgert blir intervjuad av Erik Berglund. Vi har under hela den tid som SWEBBTV har existerat kunnat se Mikael Wilgert som den lågmälda analytiska programledaren som lockar fram intressanta sidor och kommentare från personer som inbjudits till intervju.

Mikael Wilgert brukar inleda sina program ungefär med ”Innan vi börjar tänkte jag be dig att ge en kort presentation av dig själv”. I det här programmet får han samma fråga själv och hans svar är som alltid lågmälda men mycket väl genomtänkta och analytiska.

Har vi idag nått en vägs ände i den politik som förts i Sverige och, även mindre extremt, i övriga nordiska länderna av vilka jag bäst känner Finland eftersom det är där jag själv bor. Coronaepidemin har kraftigt rört om i den politiska gröten och de gamla ämnen som tidigare fyllde de statliga propagandakanalerna har nästan helt försvunnit.

Det är väldigt spännande att se den kappvändning Socialdemokraterna plötsligt har genomfört. Plötsligt finns Sveriges flagga så synlig att man nästan tror att konceptet har lånats av Sverige demokraterna. EU-flaggan har plötsligt förpassats till någon dammig garderob.

Intervjun med Mikael Wilgert berör alla samhällets områden men ett mycket viktigt område är media som helt tydligt i många år har gått i maktens ärenden och ljugit fullständigt hämningslöst eftersom det inte har funnits någon risk att bli ställd till svars. Betyder den plötsliga politiska omställningen och det faktum att SWEBBTV har en stor mängd tittare att media måste börja se om sina egna hus och åtminstone ibland tala sanning eller är dagens situation, för att citera Star Wars endast ”en fluktuation i kraften”.

 

Vägen är intressant … inte nödvändigtvis målet

16/01/2020

Jag älskar att fixa olika saker. I början av hösten köpte jag (billigt) en högklassig drönare alltså en radiostyrd helikopter med fyra rotorer. Drönaren är utrustad med GPS så att den flyger tillbaka till startpunkten om kontakten till den bryts. Den är också försedd med högupplösande kamera (4k HD) som är stabiliserad i tre riktningar och kan styras från marken. Det fanns dock ett litet men …

P1010280

Fig.  Drönaren Dji Phantom 3 Pro har en högupplösande kamera stabiliserad i tre axlar. Storleken framgår ur ”tändsticksasken” d.v.s. Samsung S6 mobiltelefonen av normalstorlek som är kopplad till styrenheten.

Drönaren hade kraschat vilket i sig inte är så ovanligt. Vid kraschen hade kamerans 3d upphängda kamera gått sönder så att en av de rörliga upphängningsarmarna hade gått av och de tunna kablar som styrde kameran och genom vilka kamerasignalen överfördes till drönaren för behandling hade slitits av.

P1010246.JPG

Fig.  Problembarnet kameran vridbar i tre riktningar och automatiskt stabiliserad så att drönarens rörelser t.ex. till följd av vindpustar kompenseras. Armen strax under kamerahuset i riktning NO på bilden hade brutits. Kameran motsvarar kvalitetsmässigt en riktig Go-Pro (mycket bättre än en kinesisk kopia).

Jag träffade försäljaren och kunde verifiera att drönaren flög utan problem men att kameran var helt död. En komplett begagnad kamera kostar $300 – $500 (utan verklig garanti att den fungerar) eller en ny från tillverkaren som är dyrare om en sådan finns att köpa men jag hoppades naturligtvis undvika det utlägget med teknisk analys/funderande och vid behov mikroreparation av elektroniken.

Den tidigare ägaren hade fixat kameraupphängningen och beställt flatkabelknippet men tydligen hade reparatören misslyckats med kopplingen till kamerans styrenhet. Då jag plockade isär kameran kunde man se att flatkabelkopplingarna på kamerans moderkort hade tagit stryk tydligen till följd av att reparatören hade missat att kablarna är låsta med ett snäpp … våld hade använts vilket i sådana här sammanhang alltid brukar vara mindre bra … för mig betydde det att jag kom över en mycket bättre drönare än jag hade kunnat drömma om. Nu gällde det att hitta en reservdel.

P1010279.JPG

Fig.   Kamerans moderkort. De två konnektorerna för (film) flatkablar ses uppe i NO. Ett begagnat moderkort som försäljaren påstår vara testat (tro det den som vill) kostar strax under $100.

P1010279_part.png

Fig.   Man ser tydligt hur någon med skruvmejsel eller liknande har försökt peta loss den fastlåsta restbiten av flatkabeln, egentligen en flatkabel kopplad till två olika konnektorer. De svarta plastdelarna överst på konnektorerna är låsmekanismer. På bilden är låsen öppna. Avståndet mellan kontakterna i konnektorerna är endast 0,3 mm och kontaktstiften böjs mycket lätt varför petande med skruvmejsel inte är att rekommendera.

Det finns två sätt att försöka fixa problemet det överlägset billigaste skulle vara att byta flatkabelkonnektorerna på moderkortet. Att byta en ytmonterad komponent av denna typ skulle ha varit intressant och utmanande. Problemet är att jag inte trots rätt omfattande sökande hittade korrekt ytmonterad konnektor, dubbelsidig med 35 kontakter … tydligen rätt ovanlig. Avskriver reparation av moderkortet för tillfället och börjar söka alternativ på nätet. Hittar jag en lämplig konnektor så fixar jag kortet som en övning i att löda ytmonterade komponenter.

Det visade sig att det finns ett antal säljare både i Kina och i USA som säljer begagnade delar till den här drönarmodellen.  Jag beställde ett billigt kort från Kina samt ett lite dyrare i princip identiskt kort från USA. Kortet från USA kom inklusive skal och motor varför det var ok att betala lite mera … nu har jag en motor i reserv. Det kan vara skäl att notera att drönaren Dji Phantom 3 finns i flera modeller. De enklare modellerna har en mindre avancerad kamera och ett enklare moderkort. Skillnaden rent utseendemässigt är att Pro-versionens kort har två flatkabelkonnektorer medan de billigare varianterna har endast en. Det är alltså skäl att kontrollera att den del man beställer är kompatibel med den drönare den skall användas till.

Jag fick det kinesiska kortet först. Lite lödande/petande med förstoringsglas krävdes för att hitta kontakterna till den lilla fläkt som kyl kortet. Kontakterna är mycket små och gömda under en limklick … inget större problem. Efter bytet av kort så kände systemet tydligt igen kameran som kalibrerade sig själv då man slog på strömmen men jag fick ingen bild och drönaren meddelade att kamerans programvara måste uppdateras. Slutsatsen är att någon signal mellan kortet och kameran hade saknats till följd av de skadade kontakterna. Systemet angav att kamerans programvara var version 1.03.0020+ där ”+” tydligen anger att någon programmodul inte är kompatibel och sannolikt från någon nyare varsion.

Det verkade alltså klart att systemet i något skede hade nedgraderats d.v.s. man hade backat mjukvaran till en tidigare version men att detta hade misslyckats. Jag såg kommentarer på nätet att någon av de nyaste versionerna av programvaran bl.a. införde flygförbud över t.ex. idrottsplatser något som slog hårt mot vissa professionella användare vilka av denna orsak försökte nedgradera mjukvaran med dåligt resultat. Notera alltså att drönaren själv med hjälp av GPS i princip håller koll på var det är tillåtet att flyga. Det verkar sannolikt att vissa moduler inte kan backas vilket gör kameran oanvändbar så länge programvaran innehåller konflikter. Min uppfattning är att många av de moderkort som cirkulerar på nätet sannolikt är helt i skick men de är resultat av misslyckade uppgraderingar som har lett till att användaren har gett upp och köpt kortet som reservdel från tillverkaren, mera om detta senare.

Jag försökte först uppgradera kameran till den nyaste versionen av programvaran men stötte ideligen på problem d.v.s. systemet meddelade att uppgraderingen misslyckades. Orsaken var eventuellt att kamerasystemet överhettades då det var igång en längre stund (en uppgradering går på ca. 30 min) , vid flygning kommer kamerapaketet att kylas av luftdraget från propellrarna. Jag hittade av en slump en kommentar på nätet som konstaterade att det lönar sig att kyla elektroniken under uppgraderingen. Jag tog en liten datorfläkt som jag kopplade till en justerbar strömkälla så att jag kontinuerligt kylde kamerapaketet med fläkten … nu började uppgraderingarna fungera bättre men jag fick fortfarande ”+” varianter och uppgraderingarna krävde mycket lång tid … mycket längre än den angivna 25-30 min.

I det här skedet anlände kortet från USA och jag satte in det kortet i stället eftersom jag inte helt litade på den kinesiska säljaren. Problemet kunde ju vara att det kort jag fick från Kina var defekt. Sannolikt fungerar det kinesiska kortet korrekt. Det nya kortet fungerade igen genast så att kameran kalibrerade sig själv … men ingen bild överfördes till kontrollenhetens display och … programvarans version var 1.03.0020+ (smile, oh shit)!

Efter en hel del experimenterande med olika programversioner, det gick åt mycket tid, beslöt jag att försöka starta uppgradering från den äldsta version jag hade tillgänglig och inte bry mig om att en uppgradering misslyckades utan helt enkelt stegvis gå vidare från version till version.

Det kan vara skäl att notera att det finns odokumenterade hjälpmedel för uppgraderingen. Det går att få mer detaljerade felmeddelanden gällande uppgraderingen genom att kopiera en tom  fil med namnet P3X_FW_DEBUG till roten på SD-kortet med den nya mjukvaran. Jag kan också försöka tvinga systemet att göra uppgradering trots konflikter genom att medan jag slår på strömmen till drönaren håller reset intryckt (litet hål i sidan av stommen). På SD kortet finns den nya mjukvarufilen samt eventuellt P3X_FW_DEBUG inga andra filer får finnas. Det kan vara skäl att formatera SD-kortet mellan olika försök så att det inte blir kvar skrot från tidigare försök formatet skall vara FAT32 (inte NTFS för windows).

Jag fick många ”+” varianter på vägen men jag gissade att pluset skulle försvinna då jag kom upp till den version från vilken den alltför nya ”+” versionen hörde hemma. Mot slutet av en serie uppgraderingar så började plötsligt kameramodulen ge alarm beep-beep-… något den inte hade gjort tidigare men som den enligt instruktionerna borde ge vid misslyckad uppgradering. Jag upprepade då uppgraderingen för den version som gav felmeddelande och fortsatte sedan uppgraderingarna och plötsligt meddelade systemet att uppgraderingen var OK. Om jag minns rätt så var det den nästsista versionen som meddelade att uppgraderingen hade lyckats.

Jag provade versionen tillsammans med fjärrkontrollen och nu fick jag bild till mobiltelefonen som var kopplad till fjärrkontrollen. Fjärrkontrollen meddelade nu att kamerans programvara måste uppgraderas ytterligare varefter jag laddade in den sista versionen … nu fungerade länken till fjärrkontrollen men de bilder jag tog med drönarens kamera var strimmiga, förvridna och oanvändbara.

Videolänken fungerar men bilder på SD-kortet förvrängs

Jag misstänkte nu, delvis efter andra användares diskussioner på nätet, att problemet var SD-minneskortet. En 4k HD kamera (högupplösande TV kvalitet) skickar ofantliga datamängder till SD-kortet. Eftersom systemet omformar videoströmmen till lågupplösande video som skickas över radio till fjärrkontrollen (720p) och dessutom lagrar en annan videoström till SD-kortet så kan man gissa att allting måste tajma perfekt. Det finns inga resurser till onödiga felkontroller.

Jag hade först testat standard SD-kort av klass 10 d.v.s. samma typ av kort som jag har använt i min systemkamera (Pentax K3 och K5) utan problem. Resultat: Endast störningar, video helt svart och stänger av sig efter någon sekund.

Följande försök var SanDisk Ultra 16GB från två olika försäljare (det finns alltid risk för förfalskningar). Resultatet var marginellt bättre men fortfarande helt oanvändbart.

SD_too_slow.png

Fig.  Användning av ett SunDisk Ultra 16GB gav det här resultatet. Man kan se hur några linjer verkar lagras någorlunda korrekt överst i bilden därefter blir det problem … gissningsvis flödar kameraenhetens buffert över då systemet inte hinner dumpa data till SD-kortet. Situationen blir antagligen ännu mycket värre vid video då dataströmmarna är mycket större.

Nästa kort var ett SanDisk Extreme Pro 64GB. Stillbilder gick nu bra att känna igen men det fanns kraftiga horisontella linjer. Mätning av detta korts snabbhet visade att det borde ha fungerat … marginellt.

störningar_DJI_0215.png

Fig.  Störningar då ett marginellt långsamt SD-kort används. Långsammare kort visar endast en smal rand av bilden överst.

Följande kort var ett 64GB SanDisk Extrem från en kamerabutik specialiserad på kameror och drönare. Plötsligt fungerar systemet! Jag kan fortfarande se slumpmässiga störningar ibland men systemet kör och kan kan både ta stillbilder och videofilma. Det blir antagligen skäl att ytterligare experimentera med olika snabba SD-kort men jag kan leva med systemet som det ser ut nu!

Minneskortens begränsningar

Observera!

Mätningarna har uppdaterats eftersom minneskortsläsaren var undermålig. Mätningarna visade läsarens begränsningar för de snabba korten. Jag bytte till en Kingston MobileLite G4 för USB3. Resultatet förändrades rätt mycket.

Rött-svart  SanDisk Extreme PRO 64 GB verkar (ibland) gå att filma upp till 2700K. Fungerar allmänt taget sämre än nedanstående Extreme kort.

Rött-guld  SanDisk Extreme 64GB verkar gå att filma upp till 2700P dock så att slumpmässiga störningar kan ses.

Rött-grått SanDisk Ultra 16GB verkar gå att filma på 720P samma kommentar som föregående kort.

Mätningar:

SanDiskRedBlk

Fig.  Röd-Svart SanDisk SD minne mätt med hjälp av Linux Mint ”Disk” verktyg. Notera hur skriv och läshastigheten är bra medan åtkomsttiden varierar inom relativt vida gränser. Är den opålitliga åtkomsttiden problemet då kortet används på en DJI Phantom 3 Professional?

SanDiskRedGold

Fig.  Röd-guld SanDisk Extreme. Skriv- och läshastigheten är i princip densamma som hos PRO versionen ovan medan åtkomsttiden är mycket bättre. Skrivhastigheten är något lägre än föregående kort men kortet fungerar bättre i drönaren. Är orsaken att åtkomsttiden är bättre på detta kort medan skrivhastigheten fortfarande är adekvat?  Detta kort fungerar någorlunda.

SanDisk16GBRedGray

Fig. Röd-grått SanDisk Ultra 16GB. Notera att skrivhastigheten är betydligt lägre än de stora SanDisk minnena. Detta kort verkar kunna spela in på 720P vilket tyder på att åtkomsttiden är tillräckligt bra medan överföringshastigheten inte räcker till för högupplösande video. Notera dock de stora kasten i åtkomsttid.

Kinesisk8GBC10

Fig.  Billigt namnlöst kort 8 GB från kina. Skrivhastigheten är bättre än för SanDisk 16GB medan åtkomsttiden är betydligt sämre. Jag har inte testat kortet i drönaren eftersom jag utgår från att det inte fungerar. Notera de intressanta variationerna i skrivhastighet mot slutet av testet.

Kingston16GBC10U1

Fig.  Kingston 16GB minneskort. Läshastigheten är OK men skrivhastigheten och åtkomsttiden är erbarmlig. Notera att det förekommer mycket förfalskningar av SD-kort vilket betyder att detta kan vara en förfalskning. Kortet är inte testat i drönaren.

Biltema8GBC10U1

Fig.  Biltema 8GB är inte alls speciellt dåligt. Åtmomsttiden är dock inte speciellt bra och det finns enstaka mycket långa åtkomsttider. Kortet är inte testat i drönaren.

Jag kommer inom den närmaste framtiden att uppdatera ovanstående mätningar med något Lexar-kort (som bör vara snabbt).

Video. Man kan se att det ännu finns vissa problem som jag antar beror på SD-kortet. Det blir aktuellt att fortsätta att söka efter ett snabbt SD-kort både vad gäller skrivhastighet och åtkomsttid.

Ryckigheten i vid panorering är en följd av att jag har för lite erfarenhet av att flyga drönaren. Störningarna gissar jag är en följd av enstaka störningar med lång åtkomsttid till SD-kortet… se fig för Rött-Guld SD-kort.

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 guldtrå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 fotodetektor. 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.

 

 


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

Canadian journalist Donna Laframboise. Former National Post & Toronto Star columnist, past vice president of the Canadian Civil Liberties Association.

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 news about TED Talks and TED Conferences.

Larsil2009's Blog

Lars Silén: Reflex och Spegling