Search
1000 results for “Data_Ranger”
-
Mini 8×8 LED Matrix
I have a few neat 20x20mm square 8×8 LED matrix modules that I want to drive.
Quite some time ago I tried to hook them up with a HT16K33 based 16×8 I2C LED matrix driver, but it was all on stripboard and not only was it quite messy, actually it really didn’t work very reliably either, so this is another attempt. Eventually this resulted in a small driver PCB.
The LED Matrix Module
The fundamental point of an LED matrix module is the matrix bit. The LEDs are arranged in a grid of some sort and consequently it isn’t possible to light up all LEDs at the same time. They have to be “scanned” and if they are scanned quickly enough then persistence of vision kicks in and it appears as if all LEDs are lit at the same time.
There are a whole range of 8×8 LED matrix modules to choose from, and often it isn’t obvious what the type or pinout for them is. At least it isn’t when they’ve been kicking around in your parts drawer for some time.
Options are:
- Size of module. I’m using a square mini module which is 20x20mm (often described as 19x19mm). A larger 8×8 version is the 32x32mm module. There are also asymmetrical arrangements too, for example 5×7 LEDs.
- Type of LED. I’m using single colour LED modules, but they are often available in different colours. There are also dual-colour versions (usually red and green, which also gives an orange option when both are lit) and even RGB versions. The RGB can be “programmable” LEDs or simply direct connections to each LED colour – so with RGB, that is 4 pins per LED…
- Common Anode or Common Cathode. This refers to which leg of a row/column or LEDs is common to that entire row/column.
- Number of pins and pinout. Different matrices are mapped onto pins differently. I’ve seen some with 14 pins and some with 16, both in DIP format.
- Arrangement of the “grid”. There are two main variants here – a grid with the same number of LEDS per common connection, or a “Charlieplexed” arrangement which is a clever way of driving more LEDs from less IO pins. I have a square grid of 8 rows and 8 columns of LEDs.
Here is a schematic with LED arrangement and pinouts for a common 8×8 LED module found very cheaply online.
The left shows a common cathode, and the right a common anode. I’m pretty sure I have common anode LEDs from an old note I found lying around, so I’m going to start with that.
I’ve used the following simple circuit to verify which pin is which. The resistor is there to limit the current passing through each LED.
In the final circuit, I’d be looking at maybe using a 1K resistor so limiting the LED current to around 3-3.5mA (assuming 5V supply and forward voltage of 1.7-2.2V for a typical red LED). For a maximum of 8 LEDs per common connection, that would still only be less than 50mA so I don’t think current would be an issue in any of the approaches I’ll be looking at. But I also have to take into account that if there are 8 scan cycles for a complete display, then each LED will only be on for 1/8th of the time of the scan, so will appear 1/8th as bright anyway.
I do seem to have a module that follows the pinout as shown above (right). In the following diagram, the pins are numbered with pins 1 to 8 along the bottom (left to right) and pins 9 to 16 across the top (right to left).
In this orientation, the ROWs and COLUMNs as described above are mapped as shown below.
Just to bring all this together, the pin functions of my matrix are as follows (row = anode; column = cathode):
PinPinR5116C8R7215C7C2314R2C3413C1R8512R4C5611C6R6710C4R389R1LED Matrix Driving
The fundamental principle for a common anode configuration is that if a positive voltage is patched onto a ROW and GND is connected to a COLumn then that LED at that position will light up. However of course, different ROWs and COLs will have different states so some kind of “scanning” will be required.
A microcontroller can do this without any additional support if it has 16 IO pins. For example, the following algorithm could be used to scan each ROW in turn, setting the appropriate COL values:
Initialise ROW and COL pins as OUTPUT
Set all ROWS and COLS to LOW
FOR EACH ROW:
FOR EACH COL:
Set HIGH or LOW according to required output pattern for that ROW.
Momentarily set ROW HIGH then return it LOWEvery COL/ROW LED will light up when the combination ROW=HIGH, COL=LOW is reached. If the ROWs are scanned quickly enough, then persistence of vision means that the LED matrix appears to be fully illuminated.
As I say, given suitable current limiting LEDs (one per ROW) and enough IO pins a microcontroller could do this directly, but it uses a lot of GPIO and is likely to reach the current limits of the microcontroller pretty quickly if lots of LEDs are illuminated at once.
The answer is to utilise an additional chip as an LED matrix driver, both freeing up the microcontroller’s GPIO and providing the option for a higher current draw.
LED Matrix Drivers
There are a number of options. Some are general IO expanders, some are dedicated to supporting LED matrices, some include higher current sinks or sources as required.
A key benefit of these types of devices is that in some the scanning is performed by the device itself, so the MCU only has to send it the data for the complete display and then let it just get on with things.
MAX2719 Segment Display Driver
This is a “Serially Interfaced, 8-Digit LED Display Driver” (more here). From the MAXIM datasheet:
“The MAX7219/MAX7221 are compact, serial input/output common-cathode display drivers that interface microprocessors (µPs) to 7-segment numeric LED displays of up to 8 digits, bar-graph displays, or 64 individual LEDs.”
They interface to a MCU using SPI and have additional features to directly support 7 or 8-segment displays. As they support up to 8 digits with up to 8 segments, they could also perfectly support my 8×8 LED matrix.
Key parameters:
- 24 pin DIP.
- MCU Interface: Serial IO (chainable).
- Power: 4.0V – 5.5V.
- DIG sink current: 500mA; SEG source current: 100mA. Max current supply (all segments on): 330mA.
These are often paired up with a 32mm 8×8 LED display on a cheap PCB kit. For my purposes though, there is an issue – these are designed to be used with common cathode displays.
I suspect this is due to the current ratings for the digit/segment pins. The datasheet expands:
“Eight-Digit Drive Lines that sink current from the display common cathode. The MAX7219 pulls the digit outputs to V+ when turned off.”
“Seven Segment Drives and Decimal Point Drive that source current to the display. On the MAX7219, when a segment driver is turned off it is pulled to GND.”
If the LEDs are in a matrix, in principle it ought to be possible to have an arrangement that could work with a common anode display if the current limits can be balanced.
The common cathode (DIG) will assume a worst case of all 8 LEDs illuminated, meaning a maximum sink of up to 500mA or up to around 60mA per LED. The individual anode (SEG) supports up to 100mA current source per LED. These are both pretty high, especially as I’m not anticipating more than a total of around 50mA for 8 LEDs.
But can a common cathode scanning chip be used with a common anode display? As it stands it will be assuming that it can set a single cathode line LOW and drive all 8 anode lines according to the required pattern. But as the LEDs are displayed in a matrix, looking back at the circuit diagrams, I think it just means that the cathodes are the columns and the anodes are the rows. So instead of scanning rows, it will be scanning columns, so I think it would be fine.
So to summarise, for my LED matrix, the ROWs will be the anode, so connected to SEG and the COLs will be the cathode so connected to DIG.
There is one other key advantage to using the MAX7219. It supports a single “current setting” resistor (Rset in the datasheet). A single resistor between the ISET pin (18) and VCC. Looking at the table in the datasheet I think using a ~60-80K resistor would keep he current down to <10mA for the LEDs, although I must admit I’m not quite following how the values are calculated.
IS31FL3731 LED Driver
The actual IS31FL3731 driver chip is a QFN-28 or SSOP-28 surface mount device, so I won’t be using these directly, but they are available in a breakout board from Adafruit (more here and here). From the datasheet:
“The IS31FL3731 is a compact LED driver for 144 single LEDs. The device can be programmed via an I2C compatible interface. The IS31FL3731 offers two blocks each driving 72 LEDs with 1/9 cycle rate. The required lines to drive all 144 LEDs are reduced to 18 by using the cross-plexing feature optimizing space on the PCB. Additionally each of the 144 LEDs can be dimmed individually with 8-bit allowing 256 steps of linear dimming.”
I believe by “cross-plexing” they are talking about “Charlie Plexing”. The breakouts have the following key parameters:
- SMD but available as a breakout.
- MCU Interface: I2C with 4 address options.
- Power: 2.7V – 5.5V.
- Pinout compatible with Adafruit 16×9 Charlieplexed LED modules.
These are available relatively cheaply (~£6 each) but they aren’t geared up for use with a common LED matrix like mine, so they won’t be considered further either. But I do have some of the modules and the corresponding LED boards, and I can confirm they are very neat and possibly the highest density LED matrix I have.
HT16K33 LED Controller
This is the driver chip Adafruit use on their own 20x20mm 8×8 LED matrix “backpacks” (more here). From the datasheet:
“The HT16K33 is a memory mapping and multi-function LED controller driver. The max. Display segment numbers in the device is 128 patterns (16 segments and 8 commons) with a 13*3 (MAX.) matrix key scan circuit. The software configuration features of the HT16K33 makes it suitable for multiple LED applications including LED modules and display subsystems. The HT16K33 is compatible with most microcontrollers and communicates via a two-line bidirectional I2C-bus.”
Key operational parameters:
- SMD but available as a breakout.
- MCU Interface: I2C with 8 address options (although only 4 are available on some of the backpacks themselves).
- Power: 4.5V – 5.5V (although the Adafruit backpacks look like they can be powered from 3V3 too).
- Available in 8×8 (20 pin), 8×12 (24 pin) and 8×16 (28 pin) variants, although Adafruit modules are only available in 8×16 format.
- 16x ROW = anode (active HIGH to display); 8x COL = cathode (active LOW to display)
- COL sink current: 200mA; ROW source current: <40mA
These are the modules I’d originally used with my first attempt (undocumented) at driving these LED matrix displays. If I was to use them again, then it would be a case of including the footprint on a PCB for a pair of LED matrices and then providing a connector for I2C and power.
Note: I can’t just use the Adafruit LED matrix breakouts directly as I want to cascade them up to each other and these breakouts have exposed PCBs top and bottom that stops the LED matrix from being positioned right next to each other.
MCP23017 IO Expander
This is a generic 16-way GPIO I2C expander providing access to an additional 16 GPIO pins over I2C (more here) – a “16-Bit I/O Expander with Serial Interface” according to the datasheet:
“The MCP23X17 consists of multiple 8-bit configuration registers for input, output and polarity selection. The system master can enable the I/Os as either inputs or outputs by writing the I/O configuration bits (IODIRA/B). The data for each input or output is kept in the corresponding input or output register. The polarity of the Input Port register can be inverted with the Polarity Inversion register. All registers can be read by the system master.”
Key parameters:
- 28 pin DIP.
- MCU Interface: I2C (23017) or SPI (23S17).
- Power: 1.8V to 5.5V.
- Max current sink/source for IO pins: 25mA; Max through VSS/VDD: 150mA/125mA.
These devices have two 8-bit GPIO ports, so it would seem a simple matter of hooking up one port to the rows and one to the columns and then it would work fine as a matrix driver. There are a couple of issues though:
- Each common connector IO pin to be scanned should allow for up to the maximum of 8 LEDs to be illuminated. If there is a 25mA limit per IO pin, that isn’t much per LED. It could be done, e.g. by using a 2K resistor with my red LEDs, but they might not be very bright. But they still might be bright enough depending on what is required.
- There is no built-in scanning, the microcontroller will have to constantly send the new IO values over I2C for each row or column scan. That will add up pretty quickly to become a limiting factor I suspect, especially as that has to be maintained at a suitable refresh rate.
Given the current limits and lack of automated scanning, whilst these could work, they offer very little advantage, and some disadvantage, compared to the other options.
74HC595 Shift Register
Whilst it is possible to drive LEDs directly from a microcontroller (assuming they can support the current), it is more usual to use a shift register to save IO pins.
“The SNx4HC595 devices contain an 8-bit, serial-in, parallel-out shift register that feeds an 8-bit D-type storage register.”
This means that 8-bits provided over a serial link get turned into 8 IO pin outputs and as these devices can be cascaded together, they can be expanded to 16-bits, 24-bits, etc.
Operating parameters:
- 16 pin DIP.
- MCU Interface: Serial/clock IO.
- Power: 2V – 6V.
- Max IO current 20mA; max total current via VCC/GND 70mA.
In principle these could work well with a matrix, using two devices, one for rows and one for columns, but the current could be an issue. When driving (say) a single row, the device driving the row will need to support up to 8 LEDs worth of current on a single IO pin, and the device driving the columns would have to allow for up to 8 LEDs illuminated on 8 IO pins. If the currents are limited as previous described, the latter would be ok (up to 50mA total, around 3mA per LED), but the combined total for a row would be too much for a single IO pin.
Typically such devices might be used with something like a ULN2803 current sink which can sink up to 500mA in total. This would have to be provided on the cathodes and the cathode would be the scanned column in the code.
Current limiting resistors should be put in the anode side of the circuit, meaning that the resistors serve only a single LED at a time. If they were placed in the cathode side, then if multiple LEDs are lit, the brightness would change if sharing a resistor.
Using a shift register only has a minor advantage over using direct MCU IO pins – it reduces the pin count required. But in all other respects is not so different. It will still have current limitations which really need an additional chip to overcome; and all scanning will have to be handled by the microcontroller and kept at a suitable refresh rate.
Summary of Options
- MAX7219: unsurprisingly this is a device dedicated to driving segment and matrix displays. The fact it is designed for common cathode displays shouldn’t be an issue for my LED matrix. Driven via a serial IO link (SPI) and chainable.
- Disadvantages: One device is required per matrix. They are not particularly cheap. They are quite large in DIP format.
- IS31FL3731: designed for LED matrices.
- Disadvantages: This is a surface mount device, so requires a breakout for me to use it. Designed for a Charlieplex matrix, so not really suitable.
- HT16K33: again dedicated device for driving LED matrices. Can support two 8×8 matrices. Driven over I2C.
- Disadvantages: Surface mount again, but breakouts are available, but again not particularly cheap.
- MCP23017: general purpose I2C IO expander.
- Disadvantages: unlikely to support current required. Needs MCU to perform scanning.
- 74HC595: general purpose serial to parallel shift register. Can be chained.
- Disadvantages: likely to require additional current sink device. Needs MCU to perform scanning.
The choice for me is going to have to be either the MAX7219 or HT16K33. Both are too large for my mini displays, but if I can design a board for several displays at the same time there might be options to overlay chips and displays in a useful manner.
The HT16K33 is perhaps the more useful device, with each supporting two displays but I would have to design a board to accept the footprint of the breakout or attempt a SMD PCB…
Mini LED Matrix MAX2719 PCB
In the end, rather than mess around with breakouts, I just dived right in and tried to design a PCB that would support a MAX7219 and one of my mini LEDs. I went with the MAX7219 over the HT16K33 as it seemed a simpler choice at this point in time. I had to create a custom symbol for my LED matrix following the pinout as shown previously.
In terms of connecting to the MAX7219, I have the following:
- SEG A – G + DP -> ROWS 1 – 8
- DIG 0 – 7 -> COLS 1 – 8
There was no way I would get a DIP version on – and I did try. One thought was if I had a PCB for several matrices at the same time, then I would have more layout options – but it just wouldn’t go.
So I decided to go with the surface mount version of the MAX7219. This comes in a SOP-24 package which looks just about hand solderable.
I have two board designs – one for two matrices and one for four. My first four-matrix design was a 2×2 square, but I just could not get traces between pins between the two sets of boards, so in the end I went with a 1×4 layout which gives plenty of room between the two long rows of LED matrix pins.
Unfortunately I managed to get the pitch wrong for my LED matrix and the rows are one pin-row-header too wide. But to be honest, I’m not sure I’d have been able to route it with them any narrower, so maybe this is just the way I’ll have to do it!
Each MAX7219 has a 0805 footprint 62K resistor and 100nF capacitor, although when it came to it, I only had 75K resistors in my parts box, so I used those.
There are IN and OUT headers so the idea is that the boards can be chained. I’ll have to see how well that works in practice.
I initially went with standard pin header sockets for the matrix as they can be bent fairly easily, but unfortunately they don’t make very good contact with the pins on the matrix, so I switched to round-hole pin headers instead.
Example Code
Driving the displays is relatively straight forward, it is just a case of hooking it up to an Arduino’s SPI and sending a number of addr-data pairs, one for each chained MAX7219, detailing either commands or DIGIT data to be displayed.
There is one problem however.
When it comes to programming the MAX7219, the register address corresponds to a DIGIT, which for me is a “column” value; and the data programmed corresponds to the SEGMENTS to illuminate, which for me is a “row”. Recall the MAX7219 is designed for common cathode 7-segment displays, but I’m using it to drive a common anode LED matrix.
So this means I am scanning columns and setting rows. But as the matrix is rotated through 90 degrees on the circuit board, it appears that I’m scanning rows and setting columns. It gets more confusing…
Mapping to segments, I’ve made a mistake. I thought DP was the last segment, but when it comes to setting the SEGMENT values in the registers for the MAX7219, they are encoded in an 8-bit value as follows:
I’ve hooked them up as follows in the schematic
Which means that to get R8, R7…R1 in the right “column” I need the 8-bit value written to be in the following format:
MAX7219 Register Bit: 7 6 5 4 3 2 1 0
MAX7219 Segment: DP A B C D E F G
LED Matrix "ROW": R8 R1 R2 R3 R4 R5 R6 R7
Physical Column: 1 8 7 6 5 4 3 2This corresponds to the LED matrix being oriented with pin 1 top left. This makes the top left LED correspond to physical (row 1, column 1) and the bottom right LED is (row 8, column 8).
This means that when creating a bit pattern for the column values, they are swapped compared to bit numbers, and DP needs inserting into bit 7.
val = ((val & 0xff)>>1) | ((val & 0xff)<<7);
It does, ironically, mean that to scan columns in the order left->right, I can simply use:
for (int r=0; r<8; r++) {
for (int c=0; c<8; c++) {
// to scan columns 1 to 8
uint8_t val = (1<<c);
// adjust for DP
val = ((val & 0xff)>>1) | ((val & 0xff)<<7);
// Convert rows 0-7 to register address 1-8
sendToSPI(r+1, c);
}
}It’s quirky, but it works!
But if I stick with this approach, then any bitmaps (or fonts!) stored in memory for display will have to be stored horizontally mirrored.
The final test code for an Arduino Uno or Nano, using the standard SPI pins (13=clock; 11=data out):
#include <SPI.h>
#define SS_PIN 10
#define NUM_MAX7219 2
#define MAX7219_TEST 0x0f
#define MAX7219_BRIGHTNESS 0x0a
#define MAX7219_SCAN_LIMIT 0x0b
#define MAX7219_DECODE_MODE 0x09
#define MAX7219_SHUTDOWN 0x0C
void maxCommand (uint8_t address, uint8_t value) {
digitalWrite(SS_PIN, LOW);
for (int i=0; i<NUM_MAX7219; i++) {
SPI.transfer(address); // Send address.
SPI.transfer(value); // Send the value.
}
digitalWrite(SS_PIN, HIGH); // Finish transfer.
}
void maxData (uint8_t row, uint8_t value) {
digitalWrite(SS_PIN, LOW);
for (int i=0; i<NUM_MAX7219; i++) {
SPI.transfer(row+1); // ROW registers address 1-8
uint8_t val = value;
val = ((val & 0xff)>>1) | ((val & 0xff)<<7);
SPI.transfer(val); // Send the value.
}
digitalWrite(SS_PIN, HIGH); // Finish transfer.
}
void setup() {
pinMode(SS_PIN, OUTPUT);
SPI.setBitOrder(MSBFIRST);
SPI.begin();
maxCommand(MAX7219_TEST, 0x01); // Test mode on
delay(1000);
maxCommand(MAX7219_TEST, 0x00); // Test mode off
maxCommand(MAX7219_DECODE_MODE, 0x00); // Disable BCD mode.
maxCommand(MAX7219_BRIGHTNESS, 0x00); // Turn brightness right down
maxCommand(MAX7219_SCAN_LIMIT, 0x0f); // Use all digits
maxCommand(MAX7219_SHUTDOWN, 0x01); // Turn on
// Start with everything off
for (int r=0; r<8; r++) {
maxData(r, 0);
}
for (int r=0; r<8; r++) {
maxData(r, 255);
delay(500);
maxData(r, 0);
}
for (int c=0; c<8; c++) {
for (int r=0; r<8; r++) {
maxData(r, (1<<c));
}
delay(500);
}
for (int r=0; r<8; r++) {
maxData(r, 0);
}
}
void loop() {
for (int r=0; r<8; r++) {
for (int c=0; c<8; c++) {
maxData (r, (1<<c));
delay(200);
}
maxData (r, 0);
}
}Conclusion
I haven’t published the PCBs as I wasn’t sure many would accept the issues with them, and I didn’t want to spend ages attempting to explain them away in my GitHub repository, but if are of interest, given all the above, ping me a message somehow (via Mastodon is probably easiest) and I can send on Gerbers or KiCad files.
I’ve only tested the two-way board so far. I’m working up to soldering four devices on a PCB.
I’d like to get a whole block of 20 or so LED matrices all tied together. I’ll post back here if I manage it.
Software wise, I’ve proved the principle but can’t decide at the moment if it is more intuitive to think of the columns going left to right, or right to left. With hindsight it would have been a lot simpler to map them onto the SEGMENTS already bit-swapped. And with DP in the right place of course.
Still, amazingly, the PCBs work.
Kevin
-
INL is Microreactor Central for Testing Designs & Fuels
- INL is Microreactor Central for Testing Designs and Fuels
- Serial Deployment of SMRs Will Bring Down Their Costs
- Newcleo and Denieli to Use Nuclear Energy to Produce “Green Steel”
- Newcleo Plans MOX Fuel Center for Its Advanced Reactor
- Thorizon Secures €20M to Advance Molten Salt Reactor Development
- Rostom has Eight RITM-200 Reactors in Production
INL is Microreactor Central for Testing Designs & Fuels
A scan of multiple announcements by companies developing microreactors, e.g., less than 20 MW of electrical generation capacity, shows that eight of them, so far, have developed or are in the process of developing arrangements with the Idaho National Laboratory (INL) to test their designs and, for some, also the fuels for their reactors.
As the nation’s nuclear energy research laboratory, INL is working with developers, private industry, regulators, to develop, demonstrate, test, and validate a new generation of microreactors so they can be made available to customers.
As part of its research mission, INL is also helping to develop new fuels for microreactor designs. Many of these advanced designs also require higher concentrations of U-235 than the fuel used in the current fleet of operating light water commercial reactors. The new generation of microreactors under development is focused on key design principles which are that they are simple to use, easy to transport and set up, and can go years without having to be refueled.One of the reasons for the significant interest in microreactors is anticipated lower costs to build and operate them. The costs for these new generation microreactors are still uncertain, although it is anticipated that microreactors can be cost competitive for niche applications such as high-resilience needs, including military applications, remote and geographically difficult locations, e.g., mining and remote communities, and disaster relief. Also, data centers are inking nonbinding MOUs with microreactor developers based on long-term plans to decarbonize the power supplies for their operations.
https://youtu.be/KW0zUeHhMdo?feature=shared
Competitive Costs of Power from Microreactors
A recent report by the Nuclear Energy Institute: “Cost Competitiveness of Micro-Reactors for Remote Markets,” estimates the cost to generate electricity from the first microreactor will be between $0.14/kWh and $0.41/kWh. In some remote Alaskan areas that are dependent upon diesel generators, electricity prices are more than $1/kWh.
Future costs are estimated to decrease to between $0.09/kWh and $0.33/kWh. Costs are expected to decrease after demonstration, licensing and initial deployment and will depend on the location and type of owner, whether private or public. If one more of these developers can generate enough demand to build their reactors in “fleet mode” via factory production, the costs could come down even further.Which Microreactors Are Expected to Test Designs and/or Fuels at INL?
A short list, which is incomplete, includes in no particular order, Project Pele, Aalo & MARVEL, eVinci, Radiant, Mobile Nuclear, and Nano Nuclear. Here are snapshots of these projects and their work at the Idaho lab. There are many moving pieces for each of these microreactor developers. This post contains highlights of recent milestones for each of them.
Conceptual image of a transportable microreactor. Image: US Department of EnergyProject Pele: In September 2024 the DOD broke ground on the Project Pele transportable microreactor project at Idaho National Laboratory, which could become one of the first advanced reactors to operate in the United States as early as 2026. DoD is planning to design, build, and demonstrate a transportable high-temperature gas reactor that will operate at the lab’s Critical Infrastructure Test Range Complex.
The reactor will be manufactured by BWX Technologies and connected to INL’s microgrid producing 1 to 5 MW of electrical power.
According to DOD, the prototype reactor facility will be transported in 20-foot shipping containers and tested at the lab. They then plan to transport the reactor module by truck for placement at the complex during the 2026 timeframe to conduct safety reviews and initial planning and testing.
Oklo: In February 2025 Lightbridge Corporation (Nasdaq: LTBR), announced the signing of a Memorandum of Understanding (MOU) with Oklo Inc. (NYSE: OKLO) to conduct a feasibility study for co-locating a Lightbridge Commercial-scale Fuel Fabrication Facility at Oklo’s proposed commercial fuel fabrication facility and to explore opportunities for collaboration in recycling nuclear waste. Oklo plans to license, build, and operate the facility on a site at at the Idaho National Laboratory, located on the Arco desert 25 miles west of Idaho Falls, ID.
In November 2024 Oklo checked off a significant milestone in its path forward toward building a first of a kind micro reactor on a site at the Idaho National Laboratory. This was the environmental review processes of the Department of Energy (DOE) and the Idaho National Laboratory required for construction of the firm’s first micro reactor on the federal site. It is targeting its first deployment at INL in 2027.
Aalo: In December 2024 DOE identified a piece of land at Idaho National Laboratory (INL) as a potential site for Aalo Atomics to build a new experimental reactor facility. The new facility will be used to advance the company’s commercial Aalo-1 microreactor design that the company hopes to deploy before the end of the decade. It plans to submit to the NRC a combined construction and operating license application (COLA) for the project in 2026.
Aalo Atomics is developing a 10 MW sodium-cooled microreactor inspired by DOE’s MARVEL microreactor design which in October 2023 achieved 90 percent final design, a key step that will allow the project to move forward with fabrication and construction.
In May 2024 Aalo announced it had completed its conceptual design of the Aalo-1 – a factory-fabricated 10 MWe sodium-cooled microreactor that uses uranium zirconium hydride (UZrH) fuel elements.
The Austin, Texas-based company is working to optimize the reactor for mass manufacturing and plans to use existing commercial supply chains to deliver clean, low-cost heat to power everything from data centers to industrial facilities.
MARVEL Microreactor: Now in the fabrication stage on the Arco desert 25 miles west of Idaho Falls, ID, MARVEL (short for Microreactor Applications Research Validation and Evaluation) is a distinctive test platform that will aid a rapidly growing nuclear industry as the world searches for dependable low-carbon energy sources. MARVEL will help advanced nuclear developers in several key ways:
- Provide experience with design, start-up, operation and eventual decommissioning of a new reactor, one of the first built at INL in five decades;
- Development and demonstration of key technologies for microreactor development;
- Testing of key operation functions of a microreactor; and
- Enabling nuclear developers to test microreactor applications and access data to refine their designs on the path to commercialization.
eVinci: In September 2024 Westinghouse Electric Company completed the front-end engineering and experiment design (FEEED) phase to test a prototype of its eVinci microreactor at Idaho National Laboratory. The FEEED process is intended to support developers in design and planning for the fabrication, construction, and potential testing of fueled reactor experiments at the DOME test bed operated by the National Reactor Innovation Center (NRIC).
The commercial heat-pipe cooled microreactor is designed to produce 5 MW of electricity on sites as small as two acres of land and will operate for 8 or more years before refueling. The eVinci microreactor is expected to support broad applications ranging from powering remote communities to mining operations and data centers.
Radiant Industries: In November 2024 Radiant Industries completed the front-end engineering and experiment design phase (FEED) to test a prototype of its Kaleidos microreactor at Idaho National Laboratory. The FEEED process supports developers in designing and planning for the fabrication, construction, and potential testing of fueled reactor experiments at the DOME microreactor test bed.
Radiant was competitively selected last year to complete the FEEED process, which includes developing a detailed schedule, budget, design, and test plan for the experiment, as well as a detailed preliminary safety report on its design to ensure safe operations during testing.
The high-temperature gas-cooled reactor (HTGR) is designed to produce 1.2 MW of electricity and operate for 5 or more years before refueling.
The Kaleidos microreactor is expected to support broad applications ranging from replacing diesel generators in remote areas, to providing backup power to hospitals, military installations, and data centers.
MobileNuclear Energy, LLC: In March 2025 MobileNuclear Energy LLC (MNE) announced that it has entered into a Cooperative Research and Development Agreement (CRADA) with Battelle Energy Alliance, LLC (BEA), the operator and manager of the U.S. Department of Energy’s Idaho National Laboratory (INL).
Under this CRADA, INL will support MNE across key aspects of reactor development, demonstration, and deployment. The collaboration will focus on reactor design, testing, safety validation, licensing support, advanced computational modeling, fuel qualification, and commissioning activities. INL’s support will be provided through the National Reactor Innovation Center (NRIC), BEA staff, and other specialized INL facilities.
According to a company supplied list of specifications, the Mobile Power Module (MPM) comes with an integrated turbine-generator produces and 1 MW thermal energy and 350 kW electrical power. Add-on modules integrate with the MPM to provide atmospheric water generation, heating/cooling, hydrogen-based fuel production, EV charging, and other mission-tailored capabilities. MPM and add-on modules are equivalent in size to a 20′ ISO shipping container.
Nano Nuclear: The company has asked the INL to complete reviews of two of its conceptual designs for microreactors. In 2023 a panel of INL scientists and engineers completed a pre-conceptual design review of NANO Nuclear’s “ODIN” low-pressure coolant microreactor design.
In September 2024 Nano Nuclear announced it will collaborate with Idaho National Laboratory to evaluate the heat exchanger design of Zeus, a modular microreactor, through computational modeling and sensitivity analysis via a GAIN Voucher.
GAIN voucher recipients do not receive direct financial awards. Vouchers provide funding to DOE laboratories to help businesses overcome critical technological and commercialization challenges. All awardees are responsible for a minimum 20 percent cost share, which could be an in-kind contribution.
In December 2024 Nano Nuclear signed an MOU with DOE to establish a framework for the collaboration between NANO Nuclear and the DOE to evaluate the feasibility of siting, construction, commissioning, operation and decommissioning of the Company’s ‘ZEUS’ and ‘ODIN’ experimental microreactors at the Idaho National Laboratory (INL).
The company describes its technology offerings in technical development are “ZEUS”, a solid core battery reactor, and “ODIN”, a low-pressure coolant reactor, each representing advanced developments in clean energy solutions that are portable, on-demand capable, advanced nuclear microreactors.
~ ~ ~
There are other microreactor developers working on unique advanced designs who may yet come forward seeking testing capabilities for them and the fuels to power them. Right now it is a crowded field which means that despite the “advanced” nature of their work, the old school measures of technological differentiation and cost competitiveness will sort a few things out.
& & &
Serial Deployment of SMRs Will Bring Down Their Costs
- Alphabet, Google’s corporate parent, says the firm’s partnership with Kairos power to build seven advanced reactors to power the search engine’s data center is a key project for the firm.
(NucNet) Google parent company Alphabet is seeking to reduce the cost of constructing new nuclear reactors by deploying a series of small modular reactors (SMRs) through its partnership with developer Kairos Power, according to a recent media statement bt Alphabet’s president and chief investment officer Ruth Porat.
Google and Kairos Power announced a deal in October 2024 that would see the tech company buying power generated by seven reactors to be built by Kairos, a seven-year-old California-based startup.
The agreement targets adding 500 MW of nuclear power starting at the end of the decade, the companies said. The first reactor could be online by 2030 and additional reactors by 2035. The units for Google will include a single 50-MW reactor, with three subsequent power plants that would each have two 75-MW reactors.
Kairos is developing advanced fluoride salt-cooled high-temperature reactor (KP-FHR) technology. Construction of Hermes 1, a pilot 35-MWt version of the KP-HFR, began in July at the Oak Ridge site after a construction permit was issued in December 2023.
In November 2024, Kairos received greenlight from the Nuclear Regulatory Commission to proceed with construction of the two-unit Hermes 2 facility. It will be the first electricity-generating Generation IV plant to be approved in the US and will build on learnings from the Hermes 1 demonstrator.
Alphabet’s Porat was quoted by CNBC as telling the CERAWeek conference in Houston, US, that the public and private sectors should move “as soon as possible” to build a series of new plants that replicate the construction process to drive down costs.
“If we don’t start now in a focused way and replicate a number of them, which is why the Kairos multi tranche is an important kind of proof point, we’re not going to be able to drive down the cost curve,” Porat said.
& & &
Newcleo and Denieli to Use Nuclear Energy to Produce “Green Steel”
- Companies have signed a Memorandum of Understanding to explore the integration of newcleo’s LFR technology with Danieli’s Green Steel Technology and Plants.
- Agreement lays the groundwork to decarbonize steel production through combined electricity and heat from nuclear energy.
Italy’s Danieli & C. Officine Meccaniche S.p.A., a world-leader in iron and steel making plants, and Newcleo SA, the nuclear energy innovator, the nuclear energy innovator, have signed a Memorandum of Understanding (MOU) to explore the integration of newcleo’s Lead-cooled Fast Reactors (LFR) with Danieli’s steelmaking technology to make a further step in combining the production of green steel with nuclear energy production.
By leveraging the distinctive capability of LFRs to provide a combination of electricity and high temperature heat, the companies will focus on developing potential integrated solutions where Newcleo’s innovative LFRs provide both the electricity and high-temperature heat required to feed some of the Danieli Technologies processes for green steel production.
The initiative aligns with the Danieli vision of providing high quality green steel and has the potential to contribute to steelmaking in Europe. The agreement could lead to energy supply solutions across the iron and steel value chain, including in applications linked to the Danieli Digital Melter and possibly the production of Green Hydrogen to power Danieli’s Energiron Direct Reduction Technology to produce metallic iron.
The understanding comes at a defining moment for the European steelmaking and manufacturing industry as demonstrated by the EU Commission’s Strategic Dialogue on the Future of the Steel sector and the Clean Industrial Deal adopted in February, where the EU Commission took bold action to help energy-intensive industries lower their energy costs while also creating markets for low carbon and pledging over €100 billion in support of EU-made clean manufacturing.
The Commission also pledged to accelerate the development and deployment of small modular reactors (SMRs), recognizing their integral contribution to Europe’s competitiveness in global markets and decarbonization strategies.
Recently, the Italian government has taken concrete steps towards the reintroduction of nuclear energy in its energy mix. In this context, these agreements will generate future opportunities for the Italian and European industry to access clean energy at competitive and stable costs over the long term, allowing the continent to deliver on its net zero pledges while maintaining its competitive edge in the global scenario.
& & &
Newcleo Plans MOX Fuel Center for Its Advanced Reactor
(WNN) Reactor developer Newcleo has acquired a site in Chusclan in the Gard department in southern France on which it will build an R&D innovation and training center supporting the development of its future fuel assembly manufacturing facility in France.
Newcleo said the FASTER (Fuel process Assembly Storage Training and Enhanced Reality) center, which will not store or handle any radioactive materials, will play a key role in its strategy to close the nuclear fuel cycle.
FASTER will host: dedicated spaces for testing engineering solutions and maintenance, including office areas; advanced training facilities, featuring rooms equipped for virtual and augmented reality, simulators, and a training workshop with real production equipment; and development and qualification workshops designed to test and optimize manufacturing processes using cutting-edge technologies, such as 3D printing, within a high-tech environment dedicated to innovation and precision engineering. The FASTER centre will be developed in collaboration with leading Italian design company Pininfarina
Newcleo plans to directly invest in a mixed uranium/plutonium oxide (MOX) plant to fuel its small modular lead-cooled fast reactors. In June 2022, the company announced it had contracted France’s Orano for feasibility studies on the establishment of a MOX production plant.
According to Paris-headquartered Newcleo’s delivery roadmap, the first non-nuclear pre-cursor prototype of its reactor is expected to be ready by 2026 in Italy, the first reactor operational in France by the end of 2031, while the final investment decision for the first commercial power plant is expected around 2029.
Newcleo said its first-of-a-kind 30 MWe lead-cooled fast reactor will “serve as an industrial demonstrator, a showcase for Newcleo’s technology, and contribute to the development of the nuclear sector in France”.
Last month, Newcleo announced it had started the land acquisition process for its demonstration LFR-AS-30 small modular reactor in Indre-et-Loire in the Chinon Vienne et Loire community of municipalities in western France.
& & &
Thorizon Secures €20M to Advance Molten Salt Reactor Development
Deep-tech startup Thorizon, pioneering molten salt reactor technology, has secured €20 million in funding to accelerate the development of its advanced small modular reactor, Thorizon One. This includes €16 million as the first tranche of its Series A round, led by the Dutch National Promotional Institution, Invest-NL, backed by an InvestEU guarantee from the European Commission for the research part, with strong backing from Positron Ventures, PDENH, and Impuls Zeeland. All of Thorizon’s existing shareholders have reinforced their commitment in this investment round.
Thorizon recently secured an additional €4 million grant from the Dutch Province of Noord-Brabant in consortium with VDL Groep and Demcon. The recent investments follow an earlier €10 million grant from the France 2030 Innovative Reactor Program of the French government in 2024. In total, including its first equity round, Thorizon has raised €42.5 million to drive the commercialization of its innovative reactor technology.
This funding milestone brings Thorizon halfway to its Series A target, with a focus on attracting European investors to strengthen Europe’s energy security and leadership in nuclear innovation. The capital will drive the prototyping and demonstration of Thorizon One’s groundbreaking “cartridge” fuel system, designed to safely and cost-effectively generate power by recycling nuclear waste. Additionally, Thorizon will finalize the reactor’s basic design, advance licensing, and prototype key components as it progresses toward starting construction in 2030.
With this funding, Thorizon is advancing the development of the Thorizon One, a next-generation reactor that overcomes all traditional reservations against nuclear energy. The Thorizon One is engineered to deliver carbon-free energy while repurposing long-lived nuclear waste as fuel. Its modular design and innovative cartridge-based fuel system provide a scalable pathway to a circular nuclear economy. By harnessing molten salt technology, Thorizon is developing reactors that are inherently safe, cost-efficient, and faster to deploy than conventional nuclear plants—offering a practical solution to Europe’s clean energy transition.
Thorizon has laid a strong foundation for advancing its molten salt reactor technology, securing funding through equity and grants while building a team of 50 engineers across Amsterdam and Lyon. It has forged key partnerships with Orano for fuel development, Tractebel for engineering, and VDL Groep for prototyping, while collaborating with EPZ for early operator input, and with EDF on R&D.
Dutch and French nuclear regulators have initiated a joint preparatory review of the Thorizon One design, and the company is conducting pre-feasibility studies at three nuclear-designated sites in France and the Benelux, targeting construction by 2030.
& & &
Rostom has Eight RITM-200 Reactors in Production
(WNN) Russia’s Rosatom has begun assembling the RITM-200 reactor vessel for the Leningrad nuclear-powered icebreaker, bringing the total number of RITM reactor units currently being produced at its ZIO-Podolsk plant to eight.
The RITM-200 is a pressurized water reactor with a thermal capacity of 175 MW, which converts to 30 MW at the propellers. It is 7.3 meters high with a diameter of 3.3 meters and an integral layout which its manufacturers say means it is lighter, more compact and 25 MW more powerful than previous generations used on nuclear-powered icebreakers. The service life is 40 years.
As of March 2025 there are 8 RITM type reactors are under construction at different stages (for floating power units and for icebreakers). Project 22220 icebreaker each uses 2 of RITM-200 reactors
The new generation of Russian nuclear-powered icebreakers – the Project 22220 vessels – each feature two RITM-200 reactors and the ZIO-Podolsk plant, part of Rosatom’s machine-building division, has already manufactured 10 of them for the icebreakers Arktika, Sibir, Ural, Yakutia and Chukotka.
The RITM-200 reactors, having demonstrated their suitability for Arctic conditions, are also going to be used in floating power plants which are being built to supply electricity for a large industrial consumer in Chukotka. Another project will use the RITM-200N as part of a land-based small modular reactor nuclear power plant in Yakutia. There is also an agreement for six such reactors in Uzbekistan.
The nuclear-powered icerbreakers are a key part of Russia’s plan to develop the Northern Sea Route, the shipping lane along its north coast, which can cut the distance and speed for shipping goods by sea from northern Europe to Asia.
Rosatom’s proposed floating nuclear power plants, with power capacities of 100 MW and 106 MW, have been designed using reactors based on the RITM-200 ones used in the icebreaker fleet. Under a contract signed in 2021, Rosatom’s Machine Engineering Division is supplying four floating power units, each with a capacity of up to 106 MW of electric power, for the Baimsky Mining and Processing Plant. Three of the FPUs will be primary units, while the fourth will serve as a backup and the project is designed to be the first “serial” reference for floating power units and the world’s first experience in electrification using a floating power unit for mineral extraction projects.
The nuclear power plant agreement with Uzbekistan is for a six-unit small modular reactor project featuring the 55 MW RITM-200N, adapted from that used in the icebreakers. The Yakutia plant, which was granted a construction license in April 2023 and which has a commissioning target of 2028, is also due to feature one or two RITM-200N 55 MW reactors, with a service life of 60 years and a five-year refueling schedule. The proposed RITM-400 is an 80 MW pressurized water reactor and is an option for a 320 MW four-SMR plant in Norilsk.
# # #
-
More than 4,000 terrestrial religious radio stations broadcast across the United States, making up about a quarter of all FCC-licensed stations, according to new Pew Research Center analysis. Nearly all US adults live within range of at least one religious station, and 45% of Americans say they listen to religious audio programming. https://www.pewresearch.org/data-labs/2026/03/26/religious-radio-across-america/ #Media #SocialMedia #LiveAudio #PewResearch
-
Why I’m a reductionist
The SEP article on scientific reductionism notes that the etymology of the word “reduction” is “to bring back” something to something else. So in a methodological sense, reduction is bringing one theory or ontology back to a simpler or more fundamental theory or ontology. The Wikipedia entry on reductionism identifies different kinds: ontological, methodological, and theory reductionism. I think the ontological one is the most interesting here, the proposition that all of reality consists of a small number of building blocks.
Most reductions aren’t particularly controversial, at least not in science. There aren’t many arguments that chemistry doesn’t reduce to physics, or geology to both those sciences. Today it’s not controversial that biology reduces to them as well, although this is a relatively recent development.
As late at the early 1900s there were people arguing that life was somehow different, that it was distinguished by a vital force, an ancient idea. Few talk about vital forces today. Biologists learned about evolution through natural selection, genetic inheritance, proteins, DNA, RNA, and overall organic chemistry. Life is now seen as largely a molecular chemical enterprise, albeit a hideously complex one.
This raises an important point. Most reductions are conservative, retaining the reduced concept, but not all. Sometimes it’s eliminative, as in the case of a vital force, or other things like phlogiston or a luminiferous ether. It seems to depend on whether the reduced concept remains useful.
Today there remain at least two areas where people tend to resist reductionist accounts: consciousness and quantum measurement.
The consciousness one goes back to Rene Descartes’ famous distinction between mental and physical substances. Descartes saw no issue with a mechanistic understanding of reality, except for the mind, which he could not conceive of being reducible to mechanisms. He was far from alone. Gottfried Leibniz presented his mill thought experiment, that if the mind were a mill which we entered, we wouldn’t find anything there that explained perception. The mind, he agreed with Descartes, had to be a different kind of thing entirely.
Although a lot of what these guys saw as irreducible has been reduced. Today, psychological concepts like memory and cognition are understood to be neural processes, albeit with still many unanswered questions. But contemporary philosophy of mind often draws a new line at perceived characteristics, typically called qualities or qualia. Because these characteristics are introspectively opaque, they seem irreducible. And studying some of them has proven hard, therefore many assume they’re fundamentally inaccessible to anyone but the subject.
The question is whether the notion of fundamental qualia really explains anything. Does it convey meaningful information? Certainly qualities understood as just perceived characteristics seem useful enough. But regarding them as fundamental seems to obscure rather than convey information.
As a reductionist, I think of qualities as categorizing conclusions. (If that seems radical, consider that the etymology of the Latin root phrase “qualis” is “of what kind.”) Our nervous system qualifies a stimulus for a category when a particular range of neural firing patterns trigger a galaxy of associations, some innate, but many learned, which collectively add to the richness of the experience of that perceived characteristic (redness, sweetness, pain, etc).
Am I completely confident this is the answer? No, but as an explanation, it seems like a more fruitful place to explore. I suspect future scientific studies will validate some aspects of it, but not others. But even if it’s completely wrong, these kinds of theories seem to spur more experimental work than simply assuming qualities are fundamental and inaccessible.
In the case of quantum mechanics, it’s observation that’s often taken to be fundamental. In its strongest forms, this ends up pairing with the idea of consciousness being fundamental. Although the more cautious variants see just measurement as fundamental (or interaction). This can be the idea that quantum states don’t really exist, that measurement itself creates reality, or that quantum states do exist but physically collapse in a measurement, a fundamental change in reality.
In the early years of quantum theory, something like these views seemed inescapable, and most of the physics community closed ranks around them. But there were holdouts, including Albert Einstein and Erwin Schrὅdinger, who kept digging, discovering the phenomenon of entanglement, which would later be used by David Bohm and Hugh Everett to posit mechanistic explanations for the disappearance of quantum effects. But it was the work of H. Dieter Zeh and Wojciech H. Zurek in the 1970s and 80s that really fleshed out the detailed explanation we now call decoherence.
Today, few question whether entanglement and decoherence happen, although many do continue to argue that they’re only useful mathematical tools. Even if they are real physical processes, whether they serve as a full explanation of what’s happening in measurement depends on your preferred interpretation of quantum mechanics. But the key thing is it’s an explanation that wasn’t found by those who were satisfied with measurement being fundamental.
Which gets to why I’m a reductionist. I can’t prove that ontological reductionism is true. Maybe there are unique aspects of reality that aren’t built on a few common building blocks. But there seems to be a lot of history showing that assuming it’s true is far more fruitful than assuming complex concepts are fundamental. From Thales positing that water was the fundamental substance to later Greeks assuming there were four fundamental elements, the history of assuming anything is fundamental seems cautionary at best.
Which is why when I hear “X is fundamental,” I’m reflexively skeptical. We can’t even confidently say that about “elemental” particles, quantum fields, space, or time. We only seem able to talk in terms of something being more fundamental or less fundamental. Scientific theories are always provisional, subject to change on new data. Absolute fundamentality seems like an assumption we can never justify. Calling something fundamental seems to say, “There’s nothing left to explain here. Stop digging.” A lot of progress seems to happen from the people who ignore these prescriptions.
What do I mean by “progress”? None of this is to argue that higher level concepts aren’t useful; thermodynamics, for instance, didn’t cease being a useful concept once it was reduced to particle physics. Or that holistic takes on phenomena can’t be beneficial. Or that in art or daily life, we can’t appreciate things without reducing them.
But reduction aids in acquiring more structurally or causally complete explanations, while assuming something is fundamental often seems to paper over structural or causal gaps. Closing these gaps, when achievable, provides more reliable knowledge, knowledge which gives us new abilities, abilities such as medical scanners, drugs, computers, and many other things. Yes, that does include nuclear weapons and other ills. It doesn’t seem like we can have the good without the bad, although usually the bad can be managed with more reliable knowledge.
At least that’s my view today.
What do you think? Are there benefits to non-reductive approaches I’m overlooking? Or drawbacks to reductionism I’m missing? If you think an alternative approach is better, what are the benefits of that alternative?
#Philosophy #PhilosophyOfMind #PhilosophyOfScience #reductionism #Science
-
Gadget Review: Topdon TS004 Thermal Monocular
https://shkspr.mobi/blog/2026/02/gadget-review-topdon-ts004-thermal-monocular/I love thermal imaging cameras. They're great for spotting leaking pipes, inefficient appliances, and showing how full a septic tank is. The good folks at Topdon have sent me their latest thermal camera to review - it is specifically designed for spotting wildlife.
This is the TS004 Thermal Monocular:
Let's put it through its paces!
Hardware
This is a chunky bit of kit and fits nicely in the hand. It's well weighted and feels sturdy.
The rubber seal fits tightly around your eye and is excellent at keeping light out. The screen is set a little way back, so is easy to focus on. Taking a photo of the screen itself was a little tricky - here's what you can expect to see when using the settings menu:
The focus knob near the viewfinder is a little stiff, but it turns silently.
There's a rubber lens cover which is attached and can be easily tucked away next to the standard tripod mount. It comes with a lanyard strap, so you're unlikely to drop it. The buttons are well spaced and respond quickly.
The USB-C port has a rubber flap to keep out moisture.
OK, let's take some snaps!
Photos
Photo quality is pretty good - although limited by the technology behind the thermal sensor. The TS004 has a thermal resolution of 256x192 and images are upscaled to 640x480.
One thing to note, the user-interface is burned in to the photos. So if you want the battery display on screen, it will also appear on the photo. Similarly, things like the range-finder appear in the image.
There's a reasonable AI built in. It is designed to tell you what sort of wildlife you've spotted. In some cases, it is pretty accurate! A woman walked by me while I was looking for wildlife - here's her photo:
Nifty!
Here's a photo of a fox:
There are remarkably few wild boars in London!
Video
Video is also 640x480. It is a very smooth 42.187 FPS and a rather chunky 2,162 Kbps - leading to a file size of around 20MB per minute. With around 30GB of in-built storage, that shouldn't be a problem though. There's no audio available and, just like the photos, the UI is burned into the picture.
Here are a couple of sample videos I shot. In them, I cycle through the colour modes and zoom levels.
First, an urban fox foraging in London:
https://shkspr.mobi/blog/wp-content/uploads/2026/02/fox.mp4Second, some parakeets flapping around a tree:
https://shkspr.mobi/blog/wp-content/uploads/2026/02/Birds-In-Flight.mp4I'm impressed with the smoothness of the video and how well it picks up heat even from relatively far away.
Linux
Bizarrely, on Linux it shows up as
1d6b:0101 Linux Foundation Audio Gadget. It presents as a standard USB drive and you can easily copy files to and from it. 100% compatibility!You can't use it as a WebCam - for anything more complicated than copying files, you need to use the official app.
App
The TopInfrared App for Android is reasonably good. It connects to the camera via WiFi and offers some useful features. Most impressively, it live-streams the camera's view to your phone.
From there you can take photos or videos and have them saved straight onto your device. Handy if you've set the camera up outside and want to view it from somewhere warmer.
Frustratingly, it isn't possible to set all the options on the camera using the app. For that you need to go back to the menu on the camera - which is slightly laborious.
The app isn't mandatory for most operations - thankfully - but it is the only way to set the time and date on the monocular. You will also need it if there are any firmware updates.
If you don't need the app, you can turn off the WiFi to save some battery life.
Drawbacks
The device works - and is great for wildlife spotting - but there are a few little niggles. I've fed these back to the manufacturer and have included their responses.
There's no EXIF in the photos, or any way to get thermal data out of the images.
- "These products focus on image clarity, high sensitivity, and low latency. For example, temperature-measurement thermal cameras typically run at 25 Hz, while the TS004 operates at 50 Hz for smoother viewing. Devices that include EXIF temperature data, raw thermal export, and analytical tools are measurement-focused thermal cameras, which are based on a different design and use case."
As mentioned, having the UI burned into the photos and videos is slightly annoying.
- You can turn off the UI elements on screen which stops them appearing in the photo.
The range-finder only works in yards and, while seemingly accurate, isn't overly helpful to those of us who think in metric!
- "Unit switching will be available in the March firmware update"
Once you sync the time with the monocular, all the filenames are timestamped like
2026_02_09_12345678but it appears to be hardwired to Hong Kong Time (UTC+8) - so your dates and times might be a little out.- "We will investigate it and see if it can be implemented in a future update"
The AI detection feature doesn't seem particularly tuned for the UK.
- "Due to hardware limitations, the current recognition is relatively basic, so there is limited room for significant improvement"
In terms of hardware limitations, there's no GPS. I would expect a device in this price-range to have basic GPS functionality to allow you to easily tag photos.
None of these are show-stoppers, but for a device this expensive they are an annoyance.
Price
OK, so you want to spot birds in trees and wild boars foraging in the forest - what'll this cost you?
Close to £400 - you can use code
TERENCE15for a 15% discount until 16 February 2026.The price of thermal imaging equipment is high and this is a fairly niche form-factor. It is easy to use, has a great range, and the rubber eyepiece is much nicer than staring at a bright phone screen. The battery life is excellent and you certainly can't complain about the generous storage space.
There are some minor irritations as discussed above, but it is an exceptional bit of kit if you like to explore the environment. Are you going to spot any cryptids with it? Who knows! But you'll have lots of fun discovering the natural world around you.
#camera #gadget #infrared #review #thermal -
#AstroSoftwareDevelopment #AstronomySoftware #ScienceSoftware
Random #Debian Astro package of the week is libstarlink-ast-dev. AST implements an object oriented model for describing physical coordinate systems, and the transformations that exist between them.
It provides a comprehensive range of facilities for attaching world coordinate systems (WCS) to astronomical data and for retrieving and manipulating that information.
It has built-in intelligence for identifying types of
1/2⤵ -
The #California #Policy Lab has an opening for a Ph.D.-level Senior Researcher in Applied #Microeconomics and #Quantitative Public Policy, which has a salary range is $105k-$155k. See their full posting at https://www.capolicylab.org/careers/senior-researcher/
#jobs #hiring #PublicPolicy #SocialScience #SocialPolicy #Econ #QuantMethods #data #ResearchDesign #ResearchMethods #EconJobMarket #AltAc #AltAcJobs #AppliedEcon
-
The Billion-Pound Ghost: Why Project Pathfinder is the Economic Firewall Scotland’s Games Sector Needs
Project Pathfinder: Last week, the Herald published its list of the 50 most powerful people in Scottish arts and culture. It was an impressive collection of talent – but it was also a perfect snapshot of why the interactive sector remains a ‘billion-pound ghost’ in our national policy.
Despite being one of the most successful and high-value creative industries we possess, not a single person from the games industry made the list. This invisibility was not a cultural snub; it is a systemic and ingrained risk to our economy.
The Reality Check
For the first time in 14 years, the UK games market is in retreat. Recent data from TIGA shows a sharp 4.5% fall in development jobs, with over 1,500 roles lost in a single year. We are navigating a global market that is increasingly volatile, saturated, and facing increased competition.
As I recently noted in the PocketGamer.biz Mobile Mavens discussion, government support has moved from a ‘nice-to-have’ benefit to a priority. In 2026, a region without a dedicated strategy (or Games Action Plan) isn’t just less competitive – it is effectively invisible in the global market.
A Step in the Right Direction, but Only a Step
We genuinely welcome the UK Government’s recently announced £30 million Games Growth Package. This investment is a vital vote of confidence in the sector. However, it is important to note that this funding addresses only one of the five key recommendations within “Level Up: Scotland’s Games Action Plan“- specifically, the need for a dedicated IP fund.
While funding for new games is essential, it does not address the fundamental need for strategic recognition, knowledgeable business support, education & skills alignment, or the industrialisation of games technologies and techniques. Rather than simply funding more products, we must build the infrastructure that allows our talent to thrive across the entire economy.
Introducing Project Pathfinder
As the author of Level Up, I have argued that we must bridge the ‘Translation Gap’ between games and the wider economy. Today, the Scottish Games Network (SGN) is moving beyond advocacy into industrial delivery with the launch of Project Pathfinder.
We have formally applied for Ecosystem funding to support this initiative and are currently securing letters of support from organisations across Scotland’s other key industries, includeing: Healthcare, Energy, Fintech, Cyber, Data, Creative Industries, Space and more.
Project Pathfinder is not just another games project – it is the only approach currently active in the UK that treats games as an innovation engine for the wider economy and an integral part of the country’s digital future.
By industrialising the connection between game-native technologies, such as Real-Time 3D, simulation, visualisation, engagement and creative design with other critical industries, we are creating a blueprint for the future. Project Pathfinder is a pilot for Scotland (and the proposed National Games Innovation Centre), but it offers a scalable model for the UK as a whole.
(It also offers the opportunity for revenue outside the hit-driven consumer games market, which could potentially make the country’s game developers more investment-friendly).
What Is Project Pathfinder?
It’s simple. Project Pathfinder looks for ways to bring the country’s games ecosystem together with other industries and sectors, and explore opportunities to build connections, opportunities for collaboration and projects where ‘games’ offer an approach that is not yet present in those other sectors. The goal is for Scotland’s games companies, using their unique range of skills, to work with other organisations across the country to develop and deliver paid projects outside the consumer game market.
This does not stop game companies from working on videogames. Instead, it takes the unique skills and approach from the games world and makes them relevant to the challenges and opportunities in other key parts of our economy.
The project aims to deliver three major pieces of work:
- The MTG (More Than Games) Registry: A national digital directory allowing global organisations to find and understand the technical capabilities, skillsets and commercial benchmarks of Scottish games studios.
- The Public Sector Interactive Procurement Toolkit: A bespoke framework to help government departments, public sector bodies, local authorities and corporations understand how to procure interactive services.
- Industrial Activation Sprints: Tailored sessions, connecting game studios with industrial leaders across multiple sectors outside the games ecosystem. This could be a delegation going to a trade event, a tailored workshop to gather data from both sectors, or a dedicated business development sprint.
The Call to Action
The reality is that we simply do not need yet another ‘test-and-finish’ review, which pushes any sort of support another two years down the road. We need the infrastructure that turns our elite £151,382 GVA-per-head potential into a resilient and integrated national asset.
SGN is looking for Founding Industrial Partners to lead our first Activation Sprints. If you are a leader in a high-growth sector and you are struggling with complex data, engagement, or simulation, the games sector may have the solution.
We already have letters of support from some of the country’s leading innovation organisations, including: the Digital Health & Care Innovation Centre (DHI), Social Enterprise Academy (SEA), ScotlandIS, and Tech Scaler with many other organisations lining up to support the project. We’ll be sharing the letters as they are agreed and showing the appetite across Scotland’s economy for collaboration.
If your organisation is interested in exploring ways to understand and work with the games ecosystem please get in touch for an exploratory conversation.
The era of invisibility ends now. It is time to press start on the future of the UK’s interaction economy.
Photo by Jonny Gios on Unsplash
#appliedGames #cyber #data #film #Fintech #games #GamesActionPlan #ProjectPathfinder #scotland -
Ocean souring?
The “Critical Review of Impacts of Greenhouse Gas Emissions on the U.S. Climate” came out last week. I’ve made some broad comments on it already, but I’ve been reading the section on ocean acidification – they call it “The Alkaline Oceans” – in more detail, mostly because it is very short. I’m not an expert on ocean acidification but it seems that anyone with a basic scientific background and access to the relevant papers can spot some significant holes in the presentation. I might go so far as to say that the presentation is mostly hole. What follows is pulled out of the footnotes from my previous post and expanded.
There are two subsections. The first regards the physical changes and explains the choice of title for the whole section, “The Alkaline Oceans“. You see, ocean acidification is “a misnomer because the oceans are not expected to become acidic“. I think we all agree that the pH is declining. This is shown in their Figure 2.3 which comes from CMEMS and they don’t seem to dispute that.
Time series of annual global mean surface sea water pH using a reconstruction methodology. Trend and uncertainty are defined as the slope and its residual standard deviation estimated with a linear least-squares regression.The first subsection builds towards the conclusion in the summary that “ocean life is complex and much of it evolved when the oceans were acidic relative to the present”. Leaving aside the vacuity of this argument for the moment – life itself evolved when there was little oxygen in the atmosphere, the biochemical innovations that flooded the atmosphere with oxygen were catastrophic for life then, but see how we would do without it now – their citations are spare and strange particularly within the context of later arguments about the value of models and the contention that this is some sort of meaningful “Critical Review”.
The first paper they cite regarding long term change in ocean pH is Krissansen-Totton et al., 2018 which uses a model to constrain climate and ocean pH of the early Earth up to the present. They find that Ocean pH evolves monotonically from 6.6 (see the abstract of the paper for the broad uncertainty ranges) at 4.0 Ga to 7.0 at the Archean–Proterozoic boundary, and to 7.9 at the Proterozoic–Phanerozoic boundary reaching a modern value of 8.2. While we might raise an eyebrow that the “Critical Review” finds models are good enough for the herculean task of reproducing almost the whole of Earth’s climate history, but not for understanding the past 200 years, the eyebrow is likely to go shooting off your face when you reach the sentence in the “Critical Review” that says “Even if the water were to turn acidic, it is believed that life in the oceans evolved when the oceans were mildly acidic with pH 6.5 to 7.0“. I derive little comfort from the fact that simple life forms evolved in such conditions. The gist of the “Critical Review” isn’t that simple life forms will survive the current warming, but that human society supported by a flourishing biosphere will not just survive but thrive. Anyway, this is only part of an argument and the whole of the argument is never really spelled out. It seems to go something like this: pH of the ocean varied in the past and we exist today, therefore we will always exist and pH of the ocean is unimportant.
The second, shorter, long-term perspective which feeds into this argument mixes up surface pH (as shown in Figure 2.3 from the CMEMS dataset) with deep ocean pH (from Rae et al. 2018) who (according to their abstract) “present deep-sea coral boron isotope data that track the pH—and thus the CO2 chemistry—of the deep Southern Ocean over the past forty thousand years“. “Deep” and “track” are the operative word here. The estimated changes are “deep”, from a depth of around 750m and not the surface. Regarding “track”, the numbers quoted in the “Critical Review” – pH of 7.4 to 7.5 20,000 years ago – came presumably from Figure S1 in the Rae paper which provides an approximate conversion of the boron isotopes to pH. How very very approximate they are is shown by an inset uncertainty range which extends from well below 7.4 to well above 7.6 suggesting great care is needed in the interpretation of the absolute pH values.
The relevant bit of Figure S1 from Rae et al. (2018). The large grey error bar on the far left of the graph shows the uncertainty associated with pH calibration.Rae et al. don’t themselves use the pH values because the calibration uncertainty is so large, instead they rely on changes in the boron isotopes as indicative of relative changes (hence “track” – I got there eventually).
Furthermore, Figure 1 in Rae et al. (2018) shows that the pH decreases with depth, so, even absent the large uncertainties, it’s not possible to directly compare surface measurements to deep Southern Ocean measurements as the “Critical Reviewers” do (or at least invite their readers to do ). At the lower cell site (the only one with a pH in the range 7.4 to 7.5 20,000 years ago in Figure S1) the modern pH is around 7.9, while the surface is above 8.0.
Extract from Figure 1 of Rae et al. (2018). The black contours are pH. The cross section is constructed from hydrographic stations across the Drake Passage. Steeply dipping isopycnals in this region (white contours) mean our sites fall into two groups spanning distinct volumes of the deep ocean 11. The green triangle marks the lower cell sites, which lie close to the Antarctic continental margin in the Shackleton Fracture Zone; the blue diamonds the upper cell sites, which lie at lower densities on the Sars (lighter blue) and Interim (darker blue) seamounts. Lower cell waters are rich in DIC (shading) with low pH (black contours); upper cell waters have higher pH and are more closely connected to the atmosphere. Coral locations on the section are given in coordinates of depth and neutral density, based on CTD data collected alongside the coral dredges. Note that there is no significant offset in our δ11B data between upper cell corals from different depths, and that differences in pH between these sites are small compared to the range seen in our records.Contrast the thin assessment of historical pH changes in the “Critical Review” with the statement from IPCC AR6 WG1 Technical Summary:
“A long-term increase in surface open ocean pH occurred over the past 50 million
years (high confidence), and surface ocean pH as low as recent times is uncommon in the last 2 million years (medium confidence). There is very high confidence that present-day surface pH values are unprecedented for at least 26,000 years and current rates of pH change are unprecedented since at least that time. Over the past 2–3 decades, a pH decline in the ocean interior has been observed in all ocean basins (high confidence)”Which is expanded on in Section 2.3.3.5 from Chapter 2 which builds on AR5 with around 70 references (some re-used mind) and one of those being to the earlier IPCC SROCC report which talks extensively about ocean acidification.
The second sub-section in the “Critical Review” is ostensibly on “coral reef changes” but it is (as they say) doing a lot of work as it has a much wider scope in the context of their loosey-goosey argument, standing in for the broader impacts of ocean acidification (or neutralisation, or whatever) on everything. If you want a usefully broad discussion, see IPCC AR6 WG2.
The first two paragraphs of the “Critical Review” are on that famous American landmark the Great Barrier Reef. And why not? Well. One “why not” can be found in the IPCC report (AR6 WG2). Chapter 11 has a box “Box 11.2 | The Great Barrier Reef in Crisis”. It doesn’t mention ocean acidification as a risk to the GBR at all (though OA is mentioned frequently elsewhere). The two big risks mentioned are bleaching in response to marine heatwaves and erosion caused by tropical cyclones. Neither of these factors is unconnected to climate change. Ocean acidification may not be a risk to the GBR, but climate change certainly is. The AIMS website which is referenced1 in the “Critical Review” even notes “a high tolerance in massive Porites to ocean acidification“. The GBR is introduced here as a 2300 km long straw man2.
The rest of the section concerns itself with the more general impacts of ocean acidification. But only glancingly. They cite Browman (2016) on the lack of null results in the literature and offer, as an example, Clements et al. (2021) which is about the direct effects of OA on the behaviour of fish specifically3 (not the reefs themselves) though it does have a juicy metascientific quote that serves their purpose of suggesting that discussion of the topic is one-sided. If anything, Clements et al. shows that the literature is no longer one-sided so it rather weakens the point they are trying to make. Yay science! Boo “Critical Review”.
The Browman article is also somewhat meta and points out that papers on Ocean Acidification were appearing at an average rate of 300 per year between 2006 and 2015, with around 600 articles per year in each of 2013, 2014 and 2015. How many are there now? I don’t know. The Browman and Clements articles are both old-as in the context of a fast-moving field. A simple Google Scholar search will show you that not only are there huge numbers of papers mentioning the topic in the past five years, but there are even lots of review papers and meta analyses on the topic which cover a much broader range of impacts4. Summarising that literature with just 12 references (including links to the data used) is not adequate by any definition.
And so, we reach the end of the Ocean Acidification section. Here is the summary of the section from the “Critical Review” in full:
“In summary, ocean life is complex and much of it evolved when the oceans were acidic relative to the present. The ancestors of modern coral first appeared about 245 million years ago. CO2 levels for more than 200 million years afterward were many times higher than they are today. Much of the public discussion of the effects of ocean “acidification” on marine biota has been one-sided and exaggerated.“
The factoid about coral appearing 245 million years ago is unreferenced and not previously mentioned in the section. The contention regarding “much of the public discussion” is likewise unreferenced and not mentioned elsewhere in the section. Public discussion and scientific discussion are two different things5. Public discussion isn’t discussed at all and, anyway, the “Critical Review” is supposedly reviewing the science. I think it’s safe to say it has failed there too.
-fin-
- They use an out of date set of graphs in Figure 2.4. It doesn’t change anything, but there is a newer report which was released this time last year. ↩︎
- Selective citation strikes again in this section, with the section citing Ridd et al. (2013) as a debunking of De’ath et al. (2009) without mentioning that there is a further response from the original authors, title “Yes — Coral calcification rates have decreased in the last twenty-five years!“. This kind of oversight is in keeping with the general failure of the “Critical Review” to engage meaningfully with the literature, but to do it in a paragraph complaining that Ridd et al. is under-cited approaches comedy. ↩︎
- My mental note for this paper when I read it a few years back was “Fish probably not confused”. ↩︎
- Google scholaring (is that a verb?) “Ocean Acidification” and selecting review articles since 2021 still gives over 2000 hits. Not all of these are reviews but you can still find a fair few this way. I bring this up only to show that the literature is big so the lack of citations is entirely the fault of the “Critical Reviewers”. ↩︎
- Elision between these points is often used by sceptics, with the imprecision of public perception used to imply imprecision in the science. ↩︎
#climate #climateChange #environment #globalWarming #oceanAcidification
-
The Quiet Erosion of Choice: Rethinking Digital Autonomy
Privacy has changed meaning. It used to refer to the information we wanted to keep private. Today the more important issue is the influence we do not notice. Intelligent systems now respond to our behaviour in real time. They do not simply track what we do. They anticipate what we are likely to do next. The shift seems small, but its impact on personal decision making is significant.This essay examines how digital autonomy is being shaped by prediction and personalisation, and why the consequences matter for individual freedom. It continues the discussion I began in my Brainz Magazine piece on the new privacy frontier, expanding the focus from external data concerns to the internal conditions of digital autonomy.
Prediction Before Intention
Modern platforms are designed to recognise patterns in human behaviour. A short pause, a small change in scrolling speed, or a repeated interaction can all be interpreted by an algorithm as indicators of future preference. Once the system forms a reliable model of these tendencies, it can present options before we actively search for them.
This is efficient, but efficiency is not neutral.
When recommendations lead a person toward a choice before they have fully formed their intention, the experience of choosing changes. It becomes less about deliberation and more about accepting what is presented first.
Most people do not feel this shift because it is subtle. A suggestion appears at the right moment. A notification seems timely. A recommendation aligns with something they vaguely recall wanting. The result is a gradual reduction in conscious decision making. The system does not force a choice. It simply gets there before we do.
Digital autonomy becomes harder to maintain when the path is laid out before we realise we were choosing one.
A Comfortable Capture
Many digital tools aim to remove friction. They reduce the need to compare, search, or weigh alternatives. This can save time, but it also reduces the conditions under which genuine reflection occurs.
Friction is not pleasant, yet it is often the moment in which thinking happens. When people encounter a barrier, they reconsider. They slow down. They ask what they want and why they want it. If technology removes these moments, it removes the opportunity for self-examination.
A frictionless environment is easier to navigate, but it can narrow awareness. People may believe they are directing their lives while the system is quietly shaping the path of least resistance.
This is not coercion. It is design. Intelligent systems respond to engagement signals, and those signals favour convenience. Over time, convenience becomes a default state. In that default state, critical evaluation weakens.
Digital autonomy requires active participation, yet many digital environments are built to encourage passive acceptance.
Identity in a Shaped Environment
Human identity forms over time through exposure, habits, and repeated interactions. When these interactions are filtered by algorithmic processes, the environment that shapes identity becomes mediated.
This does not mean people lose agency. It means agency must work harder to remain intact.
Preferences develop through what we see and what we pay attention to. If our view of the world is customised to match predicted preferences, those preferences can start to reinforce themselves. The loop becomes tighter. The range of possibilities narrows.
This is the part of digital autonomy that deserves more discussion. When recommendations define the boundaries of what feels familiar or acceptable, they also define the boundaries of curiosity. People may believe they have stable preferences, when those preferences have been shaped by invisible patterns in their feed.
Recognising this influence does not require abandoning technology. It requires a new level of self-awareness. People need to understand that identity is partly shaped by the information environment, and that environment is no longer neutral. I explored the moral dimension of this shift in an earlier reflection on privacy and the meaning of dignity, which connects directly to the concerns raised here.
The Return to Internal Privacy
Traditional privacy focuses on external protection. Laws and standards like those from the W3C aim to secure data, define consent, and establish transparency. These protections remain important, but they do not address the internal experience of being shaped by systems that adapt continuously.
Internal privacy is the ability to think without constant interruption or prediction. It is the capacity to make decisions without immediate algorithmic response. It gives a person a moment to examine their own intentions before technology reacts to them.
Maintaining internal privacy requires deliberate action. It might involve reducing notifications, taking time before responding to suggestions, or setting periods where digital systems are not allowed to guide behaviour. These actions create space for personal intention to form without interference.
Digital autonomy depends on these small boundaries. Without them, prediction slowly substitutes for preference.
A Closing Reflection
The future of privacy is not only about protecting information. It is about protecting the individual’s ability to form independent intentions. Intelligent systems will continue to evolve, and prediction will become more precise. The challenge is to ensure that human judgment does not weaken as a result.
A society remains strong when individuals are capable of thinking clearly about their own choices. Digital autonomy supports that clarity. It reinforces the idea that personal direction still matters, even when tools around us try to simplify every part of life.
The work ahead is straightforward. We need to understand how influence operates. We need to create room for reflection. And we need to value the ability to choose even when prediction makes it easy not to.
The question remains simple and relevant.
How much of our decision making do we want to guide ourselves?
The answer will shape the digital world we inherit.
#AIBehaviour #autonomy #dataInfluence #decisionMaking #digitalAutonomy #intelligentSystems #personalAgency #predictionModels #Privacy #technologyEthics -
The dollar-won exchange rate hovered in the mid-1,350 won range, rising 4.40 won, as markets awaited key U.S. manufacturing data and tracked movements in the dollar index.
#YonhapInfomax #DollarWon #ExchangeRate #DollarIndex #USManufacturingData #ForexMarket #Economics #FinancialMarkets #Banking #Securities #Bonds #StockMarket
https://en.infomaxai.com/news/articleView.html?idxno=70259 -
USD/KRW exchange rate trades in 1,390 won range during extended hours, influenced by US-Japan negotiations and Fed speeches, with slight support amid limited economic data releases.
#YonhapInfomax #USD/KRWExchangeRate #ExtendedTrading #FederalReserveSpeeches #DollarIndex #ForexMarket #Economics #FinancialMarkets #Banking #Securities #Bonds #StockMarket
https://en.infomaxai.com/news/articleView.html?idxno=64055 -
The dollar-won exchange rate traded in a narrow range around 1,380 won during after-hours, rising 4.30 won, as traders awaited key U.S. economic data and the dollar index remained steady.
#YonhapInfomax #DollarWon #ExchangeRate #USDollarIndex #PCEInflation #RangeBoundMarket #Economics #FinancialMarkets #Banking #Securities #Bonds #StockMarket
https://en.infomaxai.com/news/articleView.html?idxno=65663 -
USD/KRW exchange rate falls to 1,440 range, closing at 1,447.90 won, down 5.90 won, as market focuses on upcoming US retail sales data and central bank decisions
#YonhapInfomax #USD/KRWExchangeRate #ForeignExchangeMarket #USRetailSales #CentralBankDecisions #MarketSentiment #Economics #FinancialMarkets #Banking #Securities #Bonds #StockMarket
https://en.infomaxai.com/news/articleView.html?idxno=54426 -
Seoul forex dealers anticipate USD/KRW to test 1,430 level, influenced by weak U.S. retail data, falling interest rates, and geopolitical factors, with an expected trading range of 1,434-1,445 won.
#YonhapInfomax #USD/KRWExchangeRate #SeoulForexMarket #USRetailSales #RussiaUkraineNegotiations #DollarWeakness #Economics #FinancialMarkets #Banking #Securities #Bonds #StockMarket
https://en.infomaxai.com/news/articleView.html?idxno=51029 -
To protect our democratic system #3 To ensure the integrity of electoral processes
Yesterday’s reports cover measures taken by online platforms in February 2019 may put ourselves at ease when the EU shall keep controlling the social media as well as the working of the political parties and funding thereoff. These reports allow the EU Commission to verify that effective policies to ensure the integrity of electoral processes are in place before the European elections in May 2019.
The EU has to make sure she does not become ill in the same basket as the United States of America and Russia. The Commission may not only hope to see further progress in a number of areas by each of the platforms, she has to keep control over them. Naturally it shall take time to do so and therefore we want to be patient to see what the result may be by the end of 2019, when the Commission will carry out a comprehensive assessment of the Code’s initial 12-month period. Should the results prove unsatisfactory, the Commission may propose further actions, including of a regulatory nature.
Background
The monthly reporting cycle builds on the Code of Practice, and is part of the Action Plan against disinformation that the European Union adopted last December to build up capabilities and strengthen cooperation between Member States and EU institutions to proactively address the threats posed by disinformation.
The reporting signatories committed to the Code of Practice in October 2018 on a voluntary basis. In January 2019 the European Commission published the first reports submitted by signatories of the Code of Practice against disinformation. The Code aims to reach the objectives set out by the Commission’s Communication presented in April 2018 by setting a wide range of commitments:
- – Disrupt advertising revenue for accounts and websites misrepresenting information and provide advertisers with adequate safety tools and information about websites purveying disinformation.
- – Enable public disclosure of political advertising and make effort towards disclosing issue-based advertising.
- – Have a clear and publicly available policy on identity and online bots and take measures to close fake accounts.
- – Offer information and tools to help people make informed decisions, and facilitate access to diverse perspectives about topics of public interest, while giving prominence to reliable sources.
- – Provide privacy-compliant access to data to researchers to track and better understand the spread and impact of disinformation.
Ahead of the European elections in May 2019, the Commission is monitoring the progress of the platforms towards meeting the commitments that are most relevant and urgent ahead of the election campaign: scrutiny of ad placements; political and issue-based advertising; and integrity of services.
The Code of Practice also goes hand-in-hand with the Recommendation included in the election package announced by President Juncker in the 2018 State of the Union Address to ensure free, fair and secure European Parliament elections. The measures include greater transparency in online political advertisements and the possibility to impose sanctions for the illegal use of personal data to deliberately influence the outcome of the European elections. Member States were also advised to set up a national election cooperation network of relevant authorities – such aselectoral, cybersecurity, data protection and law enforcement authorities – and to appoint a contact point to participate in a European-level election cooperation network.
The first meeting at the European level took place on 21 January 2019, and a second one on 27 February. The next meeting will take place on 4 April.
Last week, Commissioner Jourová wrote to national political parties calling on them to ensure transparency of political advertising, to be ready to face cyberattacks and to respect European data protection rules during the campaign.
+
Preceding
To protect our democratic system #1 Danger of fake and malicious social media accounts
To protect our democratic system #2 Online platforms
Rate this:
#ActionPlanAgainstDisinformation #Advertisements #CodeOfPractice #Disinformation #EUInstitutions #EuropeanCommission #EuropeanElections #EuropeanUnion #FakeAccounts #IssueBasedAdvertising #OnlineBots #PoliticalAdvertising #ReliableSourceS_ #VeraJourova
-
USD/KRW expected to trade in 1,460 range amid lack of direction, with focus on U.S. PCE data and auto tariff impact on South Korean economy
#YonhapInfomax #UsdKrwExchangeRate #AutoTariffs #PceInflationData #SouthKoreanEconomy #ExportNegotiations #Economics #FinancialMarkets #Banking #Securities #Bonds #StockMarket
https://en.infomaxai.com/news/articleView.html?idxno=56038 -
GPU prices are rising again in 2026—but this time, the cause isn’t crypto or short-term shortages. The real driver is memory. As VRAM costs surge and AI data centers absorb a growing share of global memory supply, GPUs are becoming structurally more expensive across both high-end and mid-range segments.
#GPUPrices #GPUMarket #AIHardware #VRAM #Nvidia #DataCenters #AIInfrastructure #MemoryMarket #GDDR7 #HBM #GPUs #HardwareLifecycle #TechEconomics #SupplyChain #tech
-
And now, the moment you’ve all been waiting for…
Previously on “merging global temperatures”, we looked at different ways of hierarchically grouping global temperature datasets to get a reasonable best estimate and uncertainty range. There were three principle ways to do that grouping: by SST data set, by LSAT dataset, and by INERTPolation method (the errant capitalisation will have a purposed later).
I put these different groupings through my code for calculating an ensemble of ensembles and got the following summary statistics. I show here the annual means and a lowess smoothed series to highlight any differences in shorter and longer term behaviour.
First plot shows the means of the three ensembles and, as you can see, there is very little difference between them, so I won’t analyse this in detail.
Next up the standard deviation of the ensemble. There are some small differences here which are interesting.
The SST ensemble has a higher standard deviation in the 1880-1915 window possibly reflective of differences between marine datasets around this period. The LSAT ensemble has a larger standard deviation in the post 1930 period. Even though the differences are visible, they are still relatively small. The rule of thumb is that uncertainties in uncertainties are usually worse than 10% so we’re in that fuzzy zone where we can maybe explain why we see differences, but at the same time, we maybe don’t need to worry about them too much.
So, after all that, not much difference. This is a good thing though. It suggests that we’re not overly sensitive to reasonable choices about how to split up the ensemble.
We can also compare to what would happen if we just treated each dataset equally, as if they were all independent.
It doesn’t make much difference to the mean, but the uncertainty…
There’s a big difference there, with equal weighting generally coming in with a lower estimate of the uncertainty vs all the other combinations. This partly comes from burying DCENT in a mound of datasets that, for all their differences, are quite similar particularly in the early 20th century. I think this is a vote in favour of a more complex weighting.
-fin-
-
Bear with
It started with a trifling dissatisfaction with how the IPCC arrived at their composite global temperature series which then developed as new datasets came out. Or perhaps even before then, with a similarly trifling dissatisfaction on the very same topic. My blog doesn’t get a lot of comments, but the two more recent posts have had a lot of very interesting and technical comments from Bruce Calvert (Thanks Bruce) on how to formalise some of the ideas. My latest post on the topic largely ignored the formalisms because I have a preference for simple methods (and a small brain).
What both are trying to do is satisfy a bunch of criteria. We have a set of different global temperature datasets, but what we want is:
- A single dataset…
- That integrates all of the information that the individual datasets provide
- Also, integrating all the knowledge we have that isn’t necessarily tied up in those datasets
- With a reasonable central estimate
- And an uncertainty range that represents our uncertainty
- which can be used to generate samples that are representative of uncertainty at all time scales
- and are representative of actual global temperature variability
These criteria would make a useful dataset with broad utility.
My method (as it has developed) provides 1, 4, 5, and 6, but falls short on 2, 3 and 7 by throwing out some information and mixing together datasets that represent somewhat different things. One could quibble about 4, 5, and 6 of course.
The Guttorp and Craigmile method (see also) provides 1, 4, 6, and 7, but does less well (in my assessment, see the links above) on 2, 3 and 5. In places their central estimate is likely compromised by poor dataset choices and they ignore information that is available in the datasets. These issues could be remedied.
Is it reasonable? Well, it includes some older datasets (e.g. GETQUOCS) that have old bias adjustments because they have a nice uncertainty analysis. One might even argue that with the publication of DCENT, all other datasets are questionable. I would counter that by noting that the major compelling improvements from DCENT really affect the early 20th century warming, but prior to that it just widens the uncertainty range.
Does it really represent our uncertainty? Again, it’s hard to say. We have an ensemble of opportunity and rather a poor one at that. The hierarchical grouping I suggested is healthier than it was when I first suggested it. We now have DCENT and COBE-STEMP3, which broaden the range of estimates, but we are still trying to estimate a broad distribution with a handful of samples. My method is only as broad as the range of the datasets we have but this is partly by design. Another thing missing is the fact that we know that mixing and matching the land and ocean components of NOAAGlobalTemp and HadCRUT would widen the spread.
Does it use all the information? No. The hierarchy tries to encode the major covariances that define the structural uncertainties, assuming these come from the choice of SST (or marine temperature) dataset. We know that datasets use similar land temperature datasets and largely the same sea ice datasets. I also don’t use uncertainty ranges if they’re not represented by an ensemble. This is partly in order to avoid having to make assumptions about the correlation structures of the errors and partly because I don’t know what those structures are. I’m also missing information from the NOAAGlobalTemp ensemble. That would be a very useful addition. The Vaccaro dataset also has an ensemble and an interestingly different interpolation approach. And now there is a new dataset in preprint, GloSAT, which combines marine air temperatures with land air temperatures to give a completely new beast.
How to do better?
One obvious way is to get those missing ensembles.
Another is to employ the more formal statistical approach
Sticking with my simplistic approach, Bruce came up with an interestingly objective way to weight datasets using the estimated covariances between them. This would rely on expert judgement and it seems like this would be a difficult issue. There’s not a single covariance between datasets. Say two datasets use the same SST dataset, but different interpolation methods and land temperatures. At any time step, the two datasets will effectively give the SST dataset different weights and those weights will change over time. That means the covariance will change over time too. The temporal structure will also vary with time. It’s complex but we could come up with reasonable approximations. We could weight land and ocean as 30:70 representing the ratio, or have some simple smoothed representation. We could develop a hierarchy of hierarchies. We could take a survey of experts, asking them to make their covariance estimates. etc.
So, a first minimal extension is to include GloSAT and Vaccaro ensembles, because the data are just there begging to be used. I rearranged the hierarchy to put Vaccaro and GETQUOCS in the same category and separated them from the HadCRUT5 datasets. I also jacked the ensemble up to 50,000 members because I can and I want to make matplotlib explode.
The shape of the uncertainty curve might look odd, but it’s just a consequence of using 1850-1900 as a baseline. Uncertainty is generally smaller during the baseline period because each ensemble member is forced to average to zero during that period. It increases afterwards because there is a lot of uncertainty in the early 20th century.
Till next time…
-
Is your organization now more or less likely to experience a significant #cybersecurity event than it was 10y ago?
Well, that depends. Let's look at some data from Cyentia Institute's recent 2025 Information Risk Insights Study (IRIS).
The chart below depicts the annualized incident probability for firms in each revenue tier. I won't go into the details here of how we modeled this, but the methodology appendix in the report does get into that (link below). And if you want even more detail, Joran Elias has an excellent blog post for Cyentia Institute members (free account). For now, just assume we've used many incidents over many years to model the probabilities you see here.
From the chart, you can see why I say "that depends" to the lead question. The probability of a <$100M firm suffering a #securityincident has more than doubled, while the chance of a $100B+ megacorporation having an event has dropped by a third over the same time frame. Meanwhile, incident probability for organizations in $1B to $100B range have remained relatively static.
Unfortunately, our dataset is silent on the underlying factors behind these #cyberevent trends, but we can engage in some informed speculation. And LinkedIn is the perfect platform for it. I'll start.
To me, this chart hammers home Wendy Nather's concept of the security poverty line. Giant corporations with their giant budgets to hire the best people, buy the best technology, and implement the best processes, are finding success. But the pace of digitalization has outpaced SMBs’ ability to defend their growing attack surfaces and mitigate #cyberrisk .
I have many other thoughts regarding the factors underlying what we see here, but I'd rather hear from you. What do you see as key contributors?
****
Get the IRIS 2025 here: https://www.cyentia.com/iris2025/You'll have the option to just download it or get it or join Cyentia's free membership program for the report plus a bunch of bonus analytical content.
-
3) "But on the way to this we must take all the care we can to consider separately what each of these senses is, which together form the word’s range. This master rule applies to all words whatever.”
#IvorARichards #Semantics #WordSense #Meaning #General #Particular #Data #JohnTukey
-
2) "Later, after studying the various senses, we may go on to plot the word’s range and ask if anything is common to its senses, and if so what. A knowledge of the patterns of these rangings is—I have insisted—the most valuable thing we can learn from the inquiry, for it is knowledge of the make-up of the universe including our own."
#IvorARichards #Semantics #WordSense #Meaning #General #Particular #Data #JohnTukey
-
Arduino with Multiple Displays – Part 2
As I mentioned in my last post on Arduino with Multiple Displays I’m going to look at other microcontrollers too. This post takes a wander through my Waveshare Zero and similar format boards that each support one of the RP2040, ESP32-C3 or ESP32-S3.
Warning! I strongly recommend using old or second hand equipment for your experiments. I am not responsible for any damage to expensive instruments!
These are the key Arduino tutorials for the main concepts used in this project:
- Arduino with Multiple Displays
- https://emalliab.wordpress.com/2025/07/19/small-microcontroller-displays/
If you are new to microcontrollers, see the Getting Started pages.
Parts list
- A Waveshare Zero format board or similar
- 2x 0.96″ ST7735 60×180 SPI TFT displays.
- Breadboard and jumper wires.
Once again I’m using displays that look like this – note the order of the pins.
The Circuit
All circuits are a variation on the above, requiring the following ideal connections:
DisplayFunctionRP2040ESP32-C3ESP32-S3BLKBacklight control
(not required)N/CN/CN/CCSChip select
One per display.5 or any SPI0 CS1010DCData/Command888RESReset1499SDAData (MOSI)3 or any SPI0 MOSI6 or 711SCLClock (SCLK)2 or any SPI0 SCLK4 or 612VCCPower3V33V33V3GNDGroundGNDGNDGNDFor the explanations of the pin choices, and what it means for the code, see the following sections.
ESP32-S3 Zero
In the Arduino IDE, using board ESP32-> Waveshare ESP32-S3-Zero.
There are several SPI buses on the ESP32-S3, but they have fixed uses as follows (see the ESP32-S3 Technical Reference Manual Chapter 30 “SPI Controller”):
- SPI 0: Reserved for internal use.
- SPI 1: Reserved for internal use.
- SPI 2: General purpose use – often called FSPI in the documentation.
- SPI 3: General purpose use – often called SPI or SPI3.
Sometimes the two SPI buses are called VSPI and HSPI but I think that is really terminology from the original ESP32 rather than the ESP32-S3.
The ESP32 Arduino core for the Waveshare ESP32-S3 Zero variant defines the following:
// Mapping based on the ESP32S3 data sheet - alternate for SPI2
static const uint8_t SS = 34; // FSPICS0
static const uint8_t MOSI = 35; // FSPID
static const uint8_t MISO = 37; // FSPIQ
static const uint8_t SCK = 36; // FSPICLKBy default the Adafruit libraries will use the boards default SPI interface, as defined in the variants.h file – i.e. the above.
When it comes to assigning SPI devices to GPIO there are a few considerations (see the “ESP32-S3 Technical Reference Manual, Chapter 6 “IO MUX and GPIO Matrix”):
- In general, any GPIO can be mapped onto any SPI function. However…
- Some GPIO have special “strapping” functions so are best avoided.
- Some GPIOs have a default SPI function that bypasses the GPIO MUX routing, so allows for better performance (see section 6.6 “Direct Input and Output via IO MUX”).
From my reading of the reference manual I believe the following are default “non-MUX” SPI connections:
In the previous table, where SPI3 is mentioned, then the entry for “Direct IO via IO MUX” is set to “no”, so I’m guessing that isn’t available.
But now we can see why the Arduino core is using GPIO 34-37, but we can also see that GPIO 10-13 would be an alternative (fast) option too.
The problem is that not all of GPIO 34-37 are broken out on a Waveshare ESP32-S3 Zero, so I need to use the alternative pinouts. Aside: this makes no sense to me that these are the defaults in the Waveshare ESP32-S3 Zero’s “variant.h” file, but anyway…
To use a different SPI interface requires using a constructor that passes in an initialised SPI instance. There is an example in the ESP32 core for setting up multiple SPI buses here: https://github.com/espressif/arduino-esp32/blob/master/libraries/SPI/examples/SPI_Multiple_Buses/SPI_Multiple_Buses.ino
This leads to the pins as defined in the previous table, and the code below to setup one of the displays.
#include <Adafruit_GFX.h> // Core graphics library
#include <Adafruit_ST7735.h> // Hardware-specific library for ST7735
#include <SPI.h>
#define SPI_SS 10
#define SPI_MOSI 11
#define SPI_SCLK 12
#define SPI_MISO 13
SPIClass MySPI(FSPI);
#define TFT_CS SPI_SS
#define TFT_RST 9
#define TFT_DC 8
Adafruit_ST7735 tft = Adafruit_ST7735(&MySPI, TFT_CS, TFT_DC, TFT_RST);
void setup() {
MySPI.begin(SPI_SCLK, SPI_MISO, SPI_MOSI, SPI_SS);
pinMode(SPI_SS, OUTPUT);
tft.initR(INITR_MINI160x80_PLUGIN);
}ESP32-C3 Zero
In the Arduino IDE, using board ESP32-> ESP32C3 Dev Module.
Again there are several SPI buses on the ESP32-C3, with the same fixed uses as follows (see the ESP32-C3 Technical Reference Manual Chapter 30 “SPI Controller”):
- SPI 0: Reserved for internal use.
- SPI 1: Reserved for internal use.
- SPI 2: General purpose use – sometimes called GP-SPI in the documentation.
The ESP32-C3 also has a very similar SPI arrangement to the ESP32-S3, in that whilst any pin can be configured for SPI usage, there are certain hard-wired optional arrangements that bypass the GPIO routing matrix.
The faster (direct to IO MUX) pins are as follows (more here):
- CS0 – 10
- SCLK – 6
- MISO – 2
- MOSI – 7
Curiously, the general ESP32-C3 Arduino variant defines them as follows:
static const uint8_t SS = 7;
static const uint8_t MOSI = 6;
static const uint8_t MISO = 5;
static const uint8_t SCK = 4;From the Technical Reference manual, we can see that the default Arduino definitions above, do not support the non-routed, direct-to-IO MUX pin mappings, which from the table below do indeed map onto GPIO 2, 6, 7, 10.
In terms of using a Waveshare ESP32-C3 Zero, both combinations would be supported on the broken out GPIO, so from a software point of view, the Adafruit libraries could be used “as is” with the default mapping, or with a custom SPI definition (as shown above) with the more bespoke, but faster, mapping.
RP2040 Zero
This is using the (unofficial) RP2040 core from here: https://github.com/earlephilhower/arduino-pico, where this is an entry: RP2040 -> Waveshare RP2040 Zero.
The RP2040 has two SPI peripherals and the SPI functions are mapped onto specific sets of GPIO pins. This gives a range of flexibility, but not arbitrary flexibility. The board definition file for the Waveshare RP2040 Zero provides this as a default:
// SPI
#define PIN_SPI0_MISO (4u)
#define PIN_SPI0_MOSI (3u)
#define PIN_SPI0_SCK (2u)
#define PIN_SPI0_SS (5u)
#define PIN_SPI1_MISO (12u)
#define PIN_SPI1_MOSI (15u)
#define PIN_SPI1_SCK (14u)
#define PIN_SPI1_SS (13u)Note that the SPI1 pins for the Waveshare RP2040 Zero are not all on the standard header connections, some are on the additional pin headers across the bottom.
Using a bespoke configuration is possible using a series of calls to set the SPI pins as shown below.
SPI.setRX(SPI_MISO);
SPI.setCS(SPI_SS);
SPI.setSCK(SPI_SCLK);
SPI.setTX(SPI_MOSI);
SPI.begin(true);To use pins for SPI1, replace SPI above with SPI1. As long as this happens prior to the call to the Adafruit libraries, everything works fine.
A Common Option
It would be nice to find a set of physical pin connections that I know would always work regardless of the board in use: RP2040, ESP32-S3 or ESP32-C3.
With careful noting of the RP2040 limitations, I think that is largely possible with the following. Even though the GPIO numbers are different, the physical pins are common on all three boards.
DisplayFunctionWS PinRP2040ESP32-C3ESP32-S3BLKBacklight control
(not required)N/CN/CN/CCS1Chip select
Display 1H2 P6GP5GP9GP10DCData/CommandH2 P5GP4GP10GP11RESResetH2 P9GP8GP6GP7SDAData (MOSI)H2 P8GP7GP7GP8SCLClock (SCLK)H2 P7GP6GP8GP9VCCPowerH1 P33V33V33V3GNDGroundH1 P2GNDGNDGNDCS2CS Display 2H1 P9GP14GP5GP6CS3CS Display 3H1 P8GP15GP4GP5CS4CS Display 4H1 P7GP26GP3GP4A couple of notes:
- I’ve avoided pins 1-4 on header 2, as the ESP32-C3 can’t use them for SPI and they support either the UART or USB.
- I’ve had to include a MISO (SPI RX) pin in each configuration too, so I’ve just picked something that can be ignored. For RP2040 that has to be one of GP0, GP4 or GP16 however, which could clash with either the UART, the above configuration for DC pin, or the onboard WS2812 LED, but there isn’t much that can be done.
- I’ve allowed three consecutive pins on the first header for optional additional CS pins for displays 2 to 4.
Here is the full set of configurable code for the above:
#include <Adafruit_GFX.h> // Core graphics library
#include <Adafruit_ST7735.h> // Hardware-specific library for ST7735
#include <SPI.h>
//#define WS_RP2040_ZERO
//#define WS_ESP32C3_ZERO
#define WS_ESP32S3_ZERO
#ifdef WS_RP2040_ZERO
#define SPI_SS 5
#define SPI_MOSI 7
#define SPI_SCLK 6
#define SPI_MISO 4 // Not used
#define SPI_BUS SPI
#define TFT_CS1 SPI_SS
#define TFT_CS2 14
#define TFT_CS3 15
#define TFT_CS4 26
#define TFT_RST 8
#define TFT_DC 4
#endif
#ifdef WS_ESP32C3_ZERO
#define SPI_SS 9
#define SPI_MOSI 7
#define SPI_SCLK 8
#define SPI_MISO 0 // Not used
SPIClass MySPI(FSPI);
#define TFT_CS1 SPI_SS
#define TFT_CS2 5
#define TFT_CS3 4
#define TFT_CS4 3
#define TFT_RST 6
#define TFT_DC 10
#endif
#ifdef WS_ESP32S3_ZERO
#define SPI_SS 10
#define SPI_MOSI 8
#define SPI_SCLK 9
#define SPI_MISO 1 // Not used
SPIClass MySPI(FSPI);
#define TFT_CS1 SPI_SS
#define TFT_CS2 6
#define TFT_CS3 5
#define TFT_CS4 4
#define TFT_RST 7
#define TFT_DC 11
#endif
#ifdef WS_RP2040_ZERO
Adafruit_ST7735 tft1 = Adafruit_ST7735(TFT_CS1, TFT_DC, TFT_RST);
Adafruit_ST7735 tft2 = Adafruit_ST7735(TFT_CS2, TFT_DC, -1);
#else
Adafruit_ST7735 tft1 = Adafruit_ST7735(&MySPI, TFT_CS1, TFT_DC, TFT_RST);
Adafruit_ST7735 tft2 = Adafruit_ST7735(&MySPI, TFT_CS2, TFT_DC, -1);
#endif
void setup() {
#ifdef WS_RP2040_ZERO
SPI_BUS.setRX(SPI_MISO);
SPI_BUS.setCS(SPI_SS);
SPI_BUS.setSCK(SPI_SCLK);
SPI_BUS.setTX(SPI_MOSI);
SPI_BUS.begin(true);
#else
MySPI.begin(SPI_SCLK, SPI_MISO, SPI_MOSI, SPI_SS);
pinMode(SPI_SS, OUTPUT);
#endif
tft1.initR(INITR_MINI160x80_PLUGIN);
tft2.initR(INITR_MINI160x80_PLUGIN);
tft1.setRotation(3);
tft1.fillScreen(ST77XX_BLACK);
tft2.setRotation(3);
tft2.fillScreen(ST77XX_BLACK);
}
void loop() {
unsigned long time = millis();
tft1.fillRect(10, 20, tft1.width(), 20, ST77XX_BLACK);
tft1.setTextColor(ST77XX_GREEN);
tft1.setCursor(10, 20);
tft1.print(time, DEC);
delay(100);
time = millis();
tft2.fillRect(10, 20, tft2.width(), 20, ST77XX_BLACK);
tft2.setTextColor(ST77XX_MAGENTA);
tft2.setCursor(10, 20);
tft2.print(time, DEC);
delay(400);
}Closing Thoughts
It is a little annoying that these great boards don’t share a re-usable, common pinout in terms of naming and positions, but I guess that isn’t the main focus for these systems.
Still, it seems that a common hardware pinout can be made that supports many displays, which is great, as I’d really like to get a number of them onto a PCB!
Kevin
#arduinoUno #esp32c3 #ESP32s3 #rp2040 #st7735 #tftDisplay #WaveshareZero
-
CW: Using Human Pluripotent Stem Cells to Create Human Skeletal Muscle Organoids for Repair and Regeneration
Skeletal #muscle is a type of tissue that makes up a large part of the human body. It is made up of many different cells that are able to contract and move. Skeletal muscle has the ability to #repair itself when it is damaged due to #aging, exercise, or diseases like #MuscularDystrophy. A small group of cells called #SatelliteCell s help with the repair process. Scientists have been trying to create models to study how #Skeletalmuscle develops and regenerates. Recently, they have been using human pluripotent #StemCell to create 3D models of skeletal muscle tissue. However, these models have not been able to recreate the full process of muscle regeneration. In this research paper, the authors introduce a new method of using human pluripotent stem cells to create 3D models of skeletal muscle tissue that can retain the ability to repair itself.
Over the past decades, scientists have used #animalmodel to study #muscleregeneration, which is regulated by #stemcell s. These animal models have been very helpful in understanding the mechanisms of muscle #regeneration, but they don't always accurately reflect the same range of diseases that humans experience. Therefore, researchers have suggested creating reliable in vitro models using human muscle cells. ( #hPSC s) could be used to create 3D human skeletal muscle #organoid s ( #hSkMO s) that contain sustainable #stemcell and distinct myofibers with the same proteins and structure as adult muscles. Previous approaches to skeletal muscle differentiation have been developed using 2D #culture systems, but these lack the natural environment and #StemCell niche that are necessary to model adult #myogenesis and muscle #regeneration.
#Stemcell s ( #SC s) can be used to repair damaged muscle tissue. They explain that SCs can be activated in response to muscle injuries and that other #cell types can contribute to the process of #myogenesis. The author then goes on to explain that #cytokine s, such as IL-4, can influence the #InflammatorySystem and promote SCs differentiation, which helps with muscle regeneration. While #organoid s generated from #hPSC s have potential, they do not fully replicate the in vivo native microenvironment. To address this, treat the #hSkMO s with extrinsic #cytokine s to promote #muscle #regeneration . #hSkMO s might then be used to study aspects of human muscle #biology and to identify novel #therapeutic candidates for muscle-wasting disorders.
To create a 3D structure of muscle tissue. They used #WNT activator and #BMP inhibitors at the beginning of the differentiation process to induce paraxial #mesodermal #cell s. They then added #FGF2 to the Matrigel to promote the 3D structure. #HGF and IGF1 were added later to accelerate the #myogenic specification and further #myofiber differentiation. They optimized the timing of the Matrigel embedding to day seven. After this, they observed #neuralcell s and withdrew FGF2 to focus on muscle tissue development. They then prolonged the HGF and IGF1 treatment to propagate #myogenic #progenitor s. They found that 62% of the #tissue was #skeletalmuscle tissue and that it contained PAX7+ #myogenic #stem / #progenitor cells, MYOD+ activated/committed #myoblast s, and MYOG+ #myocyte s. They also found that 31% of PAX7+/Ki67− and 29% of MYOD−/PAX7+ non-dividing quiescent SCs were present in the mature #hSkMO s. This indicates that the #hSkMO s were able to effectively recreate #embryo nic #myogenesis and have regenerative potential. Future studies using #singlecell #RNA sequencing may be necessary to further characterize the different types of cells in #hSkMO s.
The stepwise process to generate human skeletal muscle organoid s (hSkMOs) from human pluripotent stem cells (hPSCs)
The process begins with dissociating #hPSC s into #singlecell s and allowing them to form #embryoid bodies ( #EB s) in low-attachment V-shaped 96-well plates. Then, paraxial #mesodermal differentiation is promoted with #WNT activation, BMP inhibition, and FGF2 signaling. The expression of pluripotency markers OCT4 and NANOG decreases, and the expression of #mesoderm markers Brachyury, T-Box transcription factor 6 (TBX6), and mesogenin 1 (MSGN1) increases. To further characterize paraxial #mesoderm al differentiation, TBX6 is #immunostain ed. After paraxial #mesodermal induction, the #organoid s are embedded with growth factor-reduced Matrigel and transferred to a six-well plate on an orbital shaker. Growth factors are then added to the #myogenic specification media, and #hSkMO s are cultured until the day of analysis. The orbital shaker improves the viability, survival, and differentiation of hSkMOs by increasing the penetration rate of oxygen and nutrients into the core area of hSkMOs. The #hSkMOs gradually grow to more than 1.5 mm in diameter by day 60, appearing round-shaped, uniformly sized, and having relatively homogenous morphology. PAX3 and PAX7 are #myogenic progenitor markers, and their expression is verified by qRT-PCR and #cryo sections. The #myogenic cells appear as clusters, and approximately 9% of PAX7+ cells are double-positive for Ki67 at day 30, demonstrating that proliferating cells are #myogenic #progenitor s in hSkMOs. This indicates that the in vitro #hSkMO #culturesystem is able to recapitulate the features of embryonic skeletal #muscle development.
The different types of #SkeletalMuscle stem/progenitor cells that are involved in myogenesis, the process of muscle formation.
The researchers used qRT-PCR analysis and #immunohistochemistry to identify and characterize the different types of cells. They found that PAX3 and PAX7 (SC markers) were the major population during the early stage of #myogenesis, and that MYOD (proliferating and activated SC marker) and MYOG (differentiated myocyte marker) increased over time. They also observed that MYOD−/PAX7+, MYOD+/PAX7+, and MYOD+/Ki67+ cells accounted for 29%, 6%, and 8% of the putative quiescent, activated, and proliferating #SC s, respectively. MYOD+/PAX7− cells constituted 39% of differentiating myoblasts, and MYOG−/PAX7+ cells constituted 23% of putative quiescent SCs. MYOG+/PAX7− cells accounted for 30% of differentiated #myocyte s, and 8% and 6% of the MYOG+ cells in #hSkMO s co-expressed PAX7 and Ki67, respectively. This data shows that the researchers were able to identify and characterize different types of skeletal muscle stem/progenitor cells during #myogenesis.
The text is discussing the results of a research study that used hSkMOs (human skeletal muscle #organoid s) to study the development of skeletal muscle #tissue. The study found that the #hSkMO s grew exponentially in size within two months, and the growth rate then steadily decreased. The researchers then used scanning electron microscopy (SEM) imaging and confocal microscopy to examine the cytoarchitecture of the hSkMOs. They found that the hSkMOs contained a large population of terminally differentiated #myogenic cells and a small population of preserved myogenic stem/progenitor cells. They also found that the hSkMOs contained a substantial proportion of TITIN+ muscle cells and MAP2-positive #neuron s. To further characterize the presence of sustainable stem cells within the mature hSkMOs, they quantified the amount of dormant stem cells by #confocal #microscopy imaging. The results showed that approximately 56%, 31%, and 5% of PAX7+/Ki67- putative dormant stem cells existed throughout the differentiation of hSkMOs at days 30, 70, and 130, respectively. This indicates that the hSkMOs contained mature skeletal muscle properties and had the potential for #regeneration .
The researchers wanted to see if the #hSkMO s (human #skeletal muscle #organoid s) had the ability to regenerate #muscle #tissue after damage. To test this, they treated the hSkMOs with a cardiotoxin (CTX) which is known to induce muscle inflammation and damage. They then observed a decrease in PAX7+ and MYOD+ cells in the hSkMOs. To further test the #regenerative potential of the #hSkMO s, they added interleukin-4 (IL-4) to the medium to promote #muscleregeneration. After 14 days, they observed a significant increase in MYOG+ myocytes in the CTX-injured hSkMOs with the treatment of IL-4 compared to the CTX-injured hSkMOs without the treatment. This suggests that the hSkMOs have the potential to regenerate muscle tissue after damage.
Generation of Skeletal Muscle Organoids from Human Pluripotent Stem Cells to Model Myogenesis and Muscle Regeneration
Authors :
Min-Kyoung Shin , Jin Seok Bang , Jeoung Eun Lee , Hoang-Dai Tran , Genehong Park , Dong Ryul Lee and Junghyun Jo
-
#3iAtlas analysis on observed data.
IMMEDIATE CONCERNS:
This object exhibits multiple characteristics inconsistent with typical cometary behavior.Priority red-flag analysis follows:
VELOCITY ANOMALY:
60 km/s is at the extreme upper range for solar system objects.ENERGY OUTPUT CRISIS:
10 GW emission is catastrophically high for a comet. For reference:Typical active comet: 1-100 MWHale-Bopp at peak: ~1 GW
This object: 10x Hale-Bopp levelsSource of this energy is UNKNOWN and concerning.COMPOSITIONAL ANOMALIES:
Pure nickel metallics (no iron, stone, other metals) = Highly unusual
CO₂-dominated coma (not H₂O ice) = Rare but possible
Combination suggests either exotic formation environment or artificial constructionPHOTOMETRIC BEHAVIOR:
5x brightness increase in 30 days at 6AU indicates exponential activity escalation. Normal comets brighten gradually with r^-4 law. This suggests:Internal heat source activating
Structural changes/fragmentation
Non-natural energy releaseNON-GRAVITATIONAL ACCELERATION:
1 km/s NGA is extreme - indicates massive outgassing forces that should be depleting the object rapidly.
Not observed. Gravitics.RECOMMENDATION:
This object's behavior profile does not match natural cometary physics. Suggest alternative classifications be considered. -
#ArmedPoliceDrones Are Coming
Feb. 15, 2022 by Anthony Accurso (originally published in Reason . com)
"It’s not just hobbyists who are exploiting the near-endless potential of unmanned aerial vehicles (#UAVs or '#drones'). Law enforcement from all over the country—most especially federal agencies—are using, or making plans to use, drones to conduct #surveillance and #subdue suspects.
"Americans first became widely aware of drone use by the government in the form of #PredatorUAVs deployed for intelligence and offensive purposes, almost exclusively in the #MiddleEast against 'terrorists.'
"But drone technology has come a long way in the last two decades, with drones getting smaller and being able to carry more added weight than before.
"These advances have allowed them to become the perfect platform upon which law enforcement builds its surveillance programs. Drones can carry sensors for GPS, radar, lidar, range-finding, magnetic fields, chemical and biological sniffers, and, of course, increasingly high-resolution cameras. Federal agencies often attach cell-site simulators to drones—calling them 'dirtboxes' in this use case—to collect digital and cellular data from all unsuspecting citizens in a particular area, not just suspects.
"Further electronics and software innovations have made these sensors more efficient and capable than ever. #PredatorDrones operated by Customs and Border Protection (“#CBP”) are known to use a system called Vehicle and Dismount Exploitation Radar ('#VADER'). VADER implements synthetic aperture radar, a tech trick that uses an aircraft’s motion to minimize the size of the antenna needed to create a high-res map of an area. By comparing these maps moment-by-moment, it creates a 'real-time ground moving target indicator' through 'detecting Doppler shift that moving objects produce in radar return signals.' Like the apex predator in Jurassic Park, these Predators rely on movement to 'see.'
"A company called #PersistentSurveillanceSystems has been operating a similar program, under contract by the #Baltimore olice Department ('BPD'), that uses software to construct a real-time image from photos captured by aircraft-mounted cameras. BPD can then track the (outdoor) movement of every pedestrian or vehicle in a 32-square-mile area. This is ostensibly to track fleeing criminals or generate leads after a crime has occurred.
"While only sensors have been attached to domestic drones so far, the addition of weapons systems appears to be coming. In 2015, #NorthDakota passed a law allowing police to equip drones with #TearGas and #RubberBullets. Also, documents uncovered by the #ElectronicFrontierFoundation show the CBP has suggested adding 'non-lethal weapons designed to immobilize' people to their drones.
"Laws have always lagged behind the constant march of technology, but the rapid development of drones and drone-mounted surveillance systems is set to pilot America into an omnipresent surveillance state where any and all outdoor activity—and maybe indoor ones if we get wall or roof penetrating sensors—is persistently monitored by police."
https://www.criminallegalnews.org/news/2022/feb/15/armed-police-drones-are-coming/
#PredatorClassDrone #ArmedDrones #USPol #PoliceDrones
#DroneWeaponization
#MilitaryState #ACAB #USPol #GlobalPol #Orwell #NineteenEightyFour
#SilencingDissent #Autocracy #Fascism #surveillance #SurveillanceState #PoliceState #WeaponizedDrones -
PIO on the Raspberry Pi Pico
Every time I’ve started to approach the use of the programmable IO (PIO) subsystem on the RP2040 or RP2350 (as used on the Raspberry Pi Pico), I’ve found myself essentially starting from scratch again and the examples quite opaque to me.
So this time as I’ve worked through it yet again, I’ve decided to write it all down 🙂
Here are some existing tutorials and projects that talk about getting going with the PIO:
- RP2350 Datasheet – “Chapter 11: PIO”
- Raspberry Pi Pico-series C/C++ SDK – “Chapter 3: Using Programmable I/O (PIO)”.
- Hackspace Magazine Issue 39 – Raspberry Pi Pico Programmable I/O (page 40).
- Stephen Smith’s “I/O Co-processing on the Raspberry Pi Pico”
- PIO Examples: https://github.com/raspberrypi/pico-examples?tab=readme-ov-file#pio
Assembling PIO Code
The PIO has its own bespoke micro-instruction set that is very similar to many types of assembly language and it requires its own pio assembler to process it. The basic sequence is as follows:
- PIO -> pioasm -> C header file -> include in C/C++ project and build
There are options for writing PIO in both Micropython and Circuitpython, which I have done in the past, but I’m sticking with the C route here. This requires the pioasm to take PIO code and produce a C header file that can then be included in a C project.
To use the RP2040/2350 Arduino environment, it is necessary to process PIO independently and then add the C file to the Arduino project. The Raspberry Pi C/C++ SDK can process PIO files directly as part of the main build.
There is also an option to use hardware SDK functions for dynamic creation of PIO code at runtime. The functions are a series of pio_encode_XX() functions representing the different PIO instructions as listed here: https://www.raspberrypi.com/documentation/pico-sdk/hardware.html#group_pio_instructions
There are two other novel approaches I found so far too:
- Wokwi online PIO assembler: https://wokwi.com/tools/pioasm
- Piersrocks’ runtime PIO assembler: https://github.com/piersfinlayson/apio
The first is an online editing environment that creates the required processed PIO related code for the C/C++ SDK or Python which can then be included in your build environment as required.
The second is an alternative run-time approach that uses a range of C macros to allow the “assembling” of PIO code as part of the run-time execution. It does this by directly creating the HEX equivalents of PIO instructions, thereby effectively assembling in the fly. This means that the PIO code can be customised to the specific run-time situation.
At this stage I’m not sure what it gives over using the pio_encode_ SDK functions directly. I do note however there is an equivalent PIO emulator which means this approach will run equally well on real hardware or in emulation. I’ve bookmarked this to come back to at some point.
Running PIO Code
Regardless of how the PIO instructions become code, to use them requires setting up and configuring the PIO state machines at run time as part of a project. A common approach is to include an initialisation function within the PIO code itself that is destined for passing straight through to the C/C++ SDK. This will have access to all definitions used within the PIO code and also allows the appropriate configuration information to remain encapsulated with the code.
But I have to admit I find there is an awful lot of assumed “magic” going on when configuring and getting running PIO programs and state machines. And whilst there are plenty of examples to study, I don’t find that they are written so as to teach. Consequently, I’ve noted the following as “reminders to self” on how to read some of the examples. It doesn’t help that the SDK function list is very long and there are several ways to achieve the same things.
Taking the PIO PWM code from the pico_examples as a starting point (https://github.com/raspberrypi/pico-examples/tree/master/pio/pwm), I’ve added in some comments containing the full function prototypes for some of the calls to make them a bit easier to walk through.
pwm.pio:
;
; Copyright (c) 2020 Raspberry Pi (Trading) Ltd.
;
; SPDX-License-Identifier: BSD-3-Clause
;
; Side-set pin 0 is used for PWM output
.pio_version 0 // only requires PIO version 0
.program pwm
.side_set 1 opt
pull noblock side 0 ; Pull from FIFO to OSR if available, else copy X to OSR.
mov x, osr ; Copy most-recently-pulled value back to scratch X
mov y, isr ; ISR contains PWM period. Y used as counter.
countloop:
jmp x!=y noset ; Set pin high if X == Y, keep the two paths length matched
jmp skip side 1
noset:
nop ; Single dummy cycle to keep the two paths the same length
skip:
jmp y-- countloop ; Loop until Y hits 0, then pull a fresh PWM value from FIFO
% c-sdk {
static inline void pwm_program_init(PIO pio, uint sm, uint offset, uint pin) {
// static void pio_gpio_init (PIO pio, uint pin)
pio_gpio_init(pio, pin);
// int pio_sm_set_consecutive_pindirs (PIO pio, uint sm, uint pins_base, uint pin_count, bool is_out)
pio_sm_set_consecutive_pindirs(pio, sm, pin, 1, true);
// A piece of pioasm "magic" based on .program pwm (see following notes)
pio_sm_config c = pwm_program_get_default_config(offset);
// static void sm_config_set_sideset_pins (pio_sm_config *c, uint sideset_base)
sm_config_set_sideset_pins(&c, pin);
// int pio_sm_init (PIO pio, uint sm, uint initial_pc, const pio_sm_config *config)
pio_sm_init(pio, sm, offset, &c);
}
%}And its associated C code pwm.c:
/**
* Copyright (c) 2020 Raspberry Pi (Trading) Ltd.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include <stdio.h>
#include "pico/stdlib.h"
#include "hardware/pio.h"
#include "pwm.pio.h"
// Write `period` to the input shift register
void pio_pwm_set_period(PIO pio, uint sm, uint32_t period) {
pio_sm_set_enabled(pio, sm, false);
pio_sm_put_blocking(pio, sm, period);
pio_sm_exec(pio, sm, pio_encode_pull(false, false));
pio_sm_exec(pio, sm, pio_encode_out(pio_isr, 32));
pio_sm_set_enabled(pio, sm, true);
}
// Write `level` to TX FIFO. State machine will copy this into X.
void pio_pwm_set_level(PIO pio, uint sm, uint32_t level) {
pio_sm_put_blocking(pio, sm, level);
}
int main() {
stdio_init_all();
#ifndef PICO_DEFAULT_LED_PIN
#warning pio/pwm example requires a board with a regular LED
puts("Default LED pin was not defined");
#else
// todo get free sm
PIO pio = pio0;
int sm = 0;
uint offset = pio_add_program(pio, &pwm_program);
printf("Loaded program at %d\n", offset);
pwm_program_init(pio, sm, offset, PICO_DEFAULT_LED_PIN);
pio_pwm_set_period(pio, sm, (1u << 16) - 1);
int level = 0;
while (true) {
printf("Level = %d\n", level);
pio_pwm_set_level(pio, sm, level * level);
level = (level + 1) % 256;
sleep_ms(10);
}
#endif
}There are a few key things to remember to make sense of these examples:
- The offset that is talked about is (I believe) the location within the shared 32 instruction program area and is used to refer back to the installed PIO program. It is returned from pio_add_program().
- A PIO .program directive becomes a default C like directive on processing by pioasm. This results in two obscure bits of “magic” coding going on meaning in this case that “.program pwm” in the PIO file becomes “pwm_program” in C/C++:
- pio_program_t pwm_program is a C structure which can then be referenced from the C code as shown in the line pio_add_program(pio, &pwm_program).
- static inline pio_sm_config pwm_program_get_default_config(uint offset) is a C function based on pio_get_default_sm_config() that returns the PIO configuration for the specific PIO program in question – in this case of course the pwm program.
- The use of .side_step opt means that not every PIO instruction has to have a side step instruction too.
- The PIO refers to an abstract group of pins, but it is the configuration which is part of the C/C++ SDK that determines which pins are used.
- The %c-sdk { … %} pairing signifies that this part of the PIO code will be passed straight onto the C/C++ SDK.
- There are multiple ways of initialising GPIO pins and directions. In this example it doesn’t use pindirs in the PIO code but uses pio_sm_set_consecutive_pindirs() in the C code.
- This example uses hardcoded references to PIO 0 and SM 0, but in many cases the PIO and SM would be chosen dynamically using API calls such as the following:
- pio_claim_free_sm_and_add_program ()
- pio_claim_free_sm_and_add_program_for_gpio_range()
- pio_claim_unused_sm()
- Each PIO program has a default configuration associated with it which can be updated. A typical pattern is shown here where the default configuration is grabbed using (in this case) pwm_program_get_default_config() and then updated by passing into following SDK calls.
- The state machine is finally set running using pio_sm_init();
There is one additional mix of techniques that is worth pulling out here. In the C code the function pio_pwm_set_period() is used to update the PWM period which it has to do by passing it into the SM via the FIFO. It is using some SM manipulation routines and then some inline, run-time PIO code, to achieve this.
void pio_pwm_set_period(PIO pio, uint sm, uint32_t period) {
pio_sm_set_enabled(pio, sm, false);
pio_sm_put_blocking(pio, sm, period);
pio_sm_exec(pio, sm, pio_encode_pull(false, false));
pio_sm_exec(pio, sm, pio_encode_out(pio_isr, 32));
pio_sm_set_enabled(pio, sm, true);
}Again some pretty confusing API calls, especially giving this is meant to be an example, but essentially what is going on (I think) is:
Disable the statemachine by using pio_sm_set_enabled(... false).
Push the period value into the TX FIFO, blocking if full to wait for it to be empty.
Execute two direct PIO instructions using pio_sm_exec():
This uses pio_encode_pull and pio_encode_out to run the following PIO code:
pull noblock ; non-blocking pull
out isr, 32 ; out 32 bits to the interrupt shift register
Re-enable he state machine using pio_sm_set_enabled(... true).By default anything sent to the FIFO is written to the X register and used to set the duty cycle of the PWM. But this code creates some temporary PIO code to receive the contents of the FIFO and put it into ISR instead. Of course it has to temporarily suspend the execution of the stored PIO code in order to do this.
I really dislike the nomenclature of “set enabled (false)” as an API approach. I’d much prefer to see something like pio_sm_enable() and pio_sm_disable() myself. I suppose they haven’t done this due to the large increase in API functions it creates.
I guess this is personal preference, but I do find that it adds to the opaqueness of much of the example code when it doesn’t read naturally.
So To Recap…
Writing PIO code can be done at build time (from Python or C/C++ using pioasm or an online assembler) or run time (using pio_encode_ functions or maybe APIO).
pioasm bridges the gap between PIO code and C/C++ including creating two magic C/C++ constructs: pwm_program for the code and pwm_program_get_default_config() to return the created PIO configuration.
PIO and SMs can be allocated by the system using a range of “claim” functions. There are 2 PIOs on the RP2040 and 3 on the RP2350, each with its own 32 instruction program memory and each with four state machines.
It can be useful to include an initialisation routine, that configures and starts the PIO program, within the PIO code for use from the C/C++ code using % c-sdk { … %}.
The PIO program is added into the system and given an offset in instruction memory using pio_add_program.
PIO code is very dense and often the functionality cannot be seen from the PIO code itself as it is defined by the PIO configuration – e.g. pins to use, frequency of execution, direction of shifts and so on.
I’ve not touched on it here, but the use of PIO and DMA (direct memory access) often go hand in hand to create completely CPU-free means of getting data in and out of a RP2040/RP2350 system. A really good example of this is Piers Rocks’ OneROM (see this video for a brilliant summary of how this works: https://www.youtube.com/watch?v=Y8RODQZM2HY).
Finally I need to remember that ISR stands for Input Shift Register and not Interrupt Service Routine…
Kevin
#pio #raspberryPiPico #rp2040 #rp2350 -
Arduino and SP0256A-AL2 – Part 3
Following on from using an Arduino as a variable clock in Arduino and SP0256A-AL2 – Part 2, I have some ideas for a few options, but this post looks in detail at using a Raspberry Pi Pico as the clock source.
Spoilers: it kind of works, but isn’t quite the answer I need yet…
- Part 1 – Basic introduction and getting started
- Part 2 – Arduino programmable clock
- Part 3 – Using a Raspberry Pi Pico as a programmable clock
- Part 4 – Using a HC4046 PLL as the clock
- Part 5 – Using an I2C SI5351 programmable clock
- Part 6 – Adding MIDI
https://makertube.net/w/bxBYCqHrZvQLwLuwYa5Z9r
Warning! I strongly recommend using old or second hand equipment for your experiments. I am not responsible for any damage to expensive instruments!
If you are new to microcontrollers, see the Getting Started pages.
Using a RPi Pico
The RP2040 can be overclocked quite a bit, so generating a variable square wave up in the few MHz range should presumably be relatively straight forward. Using the built-in PIO state machines for a square wave is fairly simple and it can be done from Circuitpython or Micropython too.
This is a complete square wave generator for GP2 that steps down from 4MHz to 2MHz in steps of 100kHz. It can optionally overclock the RPi to 250 MHz too if required.
import time
import microcontroller
import board
import rp2pio
import adafruit_pioasm
square = adafruit_pioasm.assemble ("""
.program square
set pins, 1
set pins, 0
""")
RP2040Freq = 125_000_000
#RP2040Freq = 250_000_000
print ("RP2040 Frequency = ", microcontroller.cpu.frequency)
microcontroller.cpu.frequency = RP2040Freq
time.sleep(1)
print ("New RP2040 Frequency = ", microcontroller.cpu.frequency)
while True:
for freq in range (4000000, 2000000, -100000):
print("\nReqd frequency = ", freq*2)
print("Sq frequency = ", freq)
sm = rp2pio.StateMachine(
square,
frequency=freq*2,
first_set_pin=board.GP2,
)
print("Actual freq = {:d}".format(sm.frequency))
print("Actual sq freq = {:d}".format(int(sm.frequency/2)))
time.sleep(5)
sm.deinit()The PIO program itself has two instruction steps, so takes two cycles to complete, so the running frequency has to be twice the desired frequency of the square wave. It automatically keeps looping, so no additional instructions are required there.
The state machine will run at the system speed with a 16.8 fixed point fractional clock divider. Full details can be found in section 3.5.5 “Clock Dividers” in the RP2040 datasheet.
For certain values there might be some jitter:
If the system clock is faster though, the amount of jitter will be less I suspect, so it is advantageous to overclock the Pico for more accurate frequencies.
The problem with this approach is that whilst I get a nice accurate clock source with quite a good resolution across its range, every time the state machine is recreated to change the frequency, there is a “blip” in the audio from the SP0256A-AL2 whilst its clock temporarily disappears!
An alternative approach is to use a fixed state machine frequency but include a counter in the PIO program to allow for a configurable number of steps per scan of the PIO without having to stop and restart the clock.
The problem with this is that I am limited to a unit of the instruction time for the PIO state machine which gives a fixed overhead, in terms of the instructions required for a minimal loop, and a flexible overhead, in terms of the counter I can pass in.
The upshot of this is that I’m tied to a certain resolution of frequency change.
I have the following PIO code:
.program blink
.side_set 1
.wrap_target
pull noblock
mov x, osr
mov y, x
set pins, 1
lp1:
jmp y-- lp1
nop
nop
mov y, x
set pins, 0
lp2:
jmp y-- lp2
.wrapThe “pull” will update the output shift register (OSR) either with any new value written to the state machine or the last value of the X register. This value gets copied to Y to use as a counter. This happens twice, once for when the pin is set at 1 and once for when the pin is set at 0.
There are two nops whilst the pin is set at 1 to balance for the original pull and mov instructions at the end of the pin set to 0 cycle.
As the Y counter value is used twice, the flexible overhead of the timing is essentially proportional to count * 2. It counts for the pin being HIGH and then for the pin being LOW.
The fixed overhead is the cost of the original pull, two moves, the pin sets, and a single jmp per pin state – so by using the two nops to ensure the HIGH and LOW times are the same, that is 10 instruction cycles.
I was hoping to use the “side” instruction to eliminate the two set instructions, but so far I’ve not managed to get that to work. I still don’t understand PIO…
So for now the timing of the PIO routine is = 10 + 2 * count and the unit is the time for a single instruction, which is 1 / frequency of the PIO execution, up to a maximum frequency of the Pico’s system clock frequency.
Using an overclocked Pico at 250MHz, the frequency range would start at the following:
- Execution freq = Pico Sys Clock / (10 + 2 * count)
- So when count = 0; execution freq = 250MHZ / 10 = 25 MHz
That is far too fast for the SP0256A-AL5. In fact, I’ve found that anything over around 5MHz causes the chip problems.
For this reason, I’m using a minimum count of 20:
- Max execution freq = 250MHz / (10 + 2 * 20) = 5 MHz
Plotting execution frequency per “count” value (starting from 20) gives the following:
We can see the limits of the resolution at the top-end, and in fact, the first few equivalent frequencies in that range are as follows:
CountEquivalent Frequency205,000,000214,807,692224,629,629234,464,285244,310,344That is giving me something like a 150-200kHz jump each time, which isn’t great, but is probably the best I can do. I would be larger if I wasn’t overclocking the Pico. It does get smaller as the count increases, but it is only really worth going down to a count value of around 120, which is around 1MHz for the resulting clock. Anything lower than that and the SP0256A-AL2 isn’t particularly useful.
Here is the full Circuitpython code which attaches a pot to GP26 to control the frequency in the range of around 900kHz up to 5MHz. Note the scaling of the pot value (0 to 65535) by 600 prior to its use to add to the count.
import array
import time
import board
import rp2pio
import microcontroller
import adafruit_pioasm
from analogio import AnalogIn
algin = AnalogIn(board.GP26) # ADC0
blink = adafruit_pioasm.assemble(
"""
.program blink
.side_set 1
.wrap_target
pull noblock
mov x, osr
mov y, x
set pins, 1
lp1:
jmp y-- lp1
nop
nop
mov y, x
set pins, 0
lp2:
jmp y-- lp2
.wrap
"""
)
RP2040Freq = 250_000_000
microcontroller.cpu.frequency = RP2040Freq
time.sleep(1)
oldalgval = 0
sm = rp2pio.StateMachine(
blink,
frequency=RP2040Freq,
first_set_pin=board.GP2
)
sm.write(bytes(16))
while True:
algval = algin.value
if (algval != oldalgval):
oldalgval = algval
count = 20 + int(algval / 600)
freq = int (RP2040Freq / (10 + count*2))
data = array.array("I", [count])
sm.write(data)
time.sleep(0.2)One problem will be the 3V3 operating levels of the Pico. The SP0256A-AL2 datasheet states the following:
So whilst a “high logic” value for the oscillator has a minimum level of 2.5V, it also states that a minimum of 3.9V is required if driven from an external source.
If required, something like a 74HCT14, powered by 5V, can be used to level shift the 3V3 output of the Pico to a 5V signal for use with the SP0256A-AL2.
But in practice, I was finding the Pico worked fine as is. It is important to ensure both the Pico, Arduino and SP0256A-AL2 all have their grounds connected.
A this point I’m just using the Pico as a programmable clock, but if I was to go this route, then it would make sense to have the Pico drive the SP0256A-AL2 too and forgo the Arduino.
Closing Thoughts
So I have two choices if I want to use a Raspberry Pi Pico:
- Go for smooth changes of frequency, but with less resolution, especially at the higher frequencies.
- Go for more accurate resolution across the range but accept there will be blips when the clock changes which will be heard in the audio.
Neither is a perfect solution, but it shows the principles are valid. Also, using two microcontrollers is a bit over the top, so if I was to move to using a Pico, I’d probably want to find a way to drive the SP0256A from the Pico directly too and skip using an Arduino.
One benefit of that would be that I can time the frequency changes to coincide with silence in the speaking should I wish to, avoiding the possibility of major audio blips.
But I also have a few other options to try, which I’ll come back to in a future post.
Kevin
-
#Fukushima #Nuclear Power Plant starts 3rd round of #wastewater release, potentially impacting #seafood quality in U.S.
By Belle Lewis - November 14, 2023
"The #FukushimaDachii nuclear plant started its third release of nuclear wastewater on Nov. 2 as scientists warn that seafood products from the #PacificOcean could be #contaminated
"Although the International Atomic Energy Agency approved the 30-year water release plan, scientists and civilians in nations bordering the Pacific Ocean have questioned the safety of the plan, especially as it relates to seafood.
"In a press release approving of the plan, the IAEA stated, 'the discharges of the treated water would have a negligible radiological impact to people and the environment.'
"#PaulDorfman, member of the Irish Government Environmental Protection Agency Radiation Protection Advisory Committee and chair of Nuclear Consulting Group, explained that some scientists have questioned IAEA’s approval of the water release.
"'I and others are concerned by IAEA’s attitude,' Dorfman said. 'Normally even low levels of radioactive pollution will find its way into local seafood, one way or another.'
"In 2020, #Japan exported 332,926 kilograms of frozen scallops to the U.S. Japan exports many fish products to the U.S.
"Samantha Valeriano, a psychology student from Hawaii, said she eats seafood about once a week. She does not often think about where her food comes from but wants to be more cautious following the nuclear water release.
"'I think I would be a little more cautious of what I ate, checking labels a little bit more,' Valeriano said. 'I would be conscious of what I ate and where it came from.'
"As the People’s Republic of #China has imposed bans of Japanese fish exports, the #USA has supported the Japanese market by increasing fish purchases.
"In a press release, the #UnitedStates Embassy and Consulate in Japan explained that military bases in Japan will carry Japanese seafood as a way to buoy up seafood markets and undermine the PRC’s ban.
"'United States elected representatives and senior government officials have stood in solidarity with Japan during this baseless ban,' the statement said. 'Another step to help provide additional sales to counter the ban was to start selling Japanese seafood at the U.S. military facilities in Japan, both through the commissaries and mess halls.'
"According to the statement, government officials like former speaker #KevinMcCarthy ate seafood from Japan as a testament to Japan’s safety standards.
However, other U.S. agencies, like the National Association of #MarineLaboratories question whether accurate research was conducted by the IAEA and Japanese Government to determine safety of seafood products."They explain that the lack of data on potential health impacts is a cause for serious concern.
"'Many of the #radionuclides contained in the #accumulated waste cooling water have half-lives ranging from #decades to #centuries, and their deleterious effects range from #DNADamage and #cellular stress to elevated #cancer risks in people who eat affected marine organisms, such as #clams, #oysters, #crabs, #lobster, #shrimp and fish,' the statement reads. [Not to mention all the critters that feed off them! Bioaccumulation works up the food chain!]
"Eve Nagareda, medical laboratory science major from Hawaii, shared she wants to avoid seafood from dumping grounds even if levels are considered safe.
"'I think I would try to go as far as possible from it,' Nagareda said.
"Kylee Wasano, pre-communications disorders student from Oahu, agreed. She explained she feels that she might already be consuming contaminated seafood.
"'I feel like I already am eating that, and I just don’t know,' Wasano said. 'Anything that could expose you to (radiation) you should be considerate about.'
"As organizations weigh safety concerns, scientists turn to the water release process to determine potential effects."
#WaterIsLife #NoDumping #Hormesis #TEPCOLies #Corruption #Bioaccumulation #RethinkNotRestart #NoNukes #NoNewNukes