1
3
submitted 1 month ago by [email protected] to c/[email protected]

cross-posted from: https://lemmygrad.ml/post/4649344

kewl

2
1
submitted 8 months ago by [email protected] to c/[email protected]

Only 2 buttons are actually connected, but they work well.

The duo comes without the connectors, so I had to solder some into it. It was a fun experience!

For the people who don't know the duo, it is a very little board (something like an alternative to the RPi Pico) that runs a RISC-V chip! I bought mine from Aliexpress in a pack with other stuff for like 10€.

Here is the underside of the gamepad thingy:

A picture showing the underside of the gamepad. It has wires soldered into it.

Not the best soldering job but it's to be expected since I don't have experience.

I also made a little program in C to test the buttons:

A picture showing a terminal window with " 'A' button has been pressed! " written several times on it.

Every time I press a specific button the program prints a string to the screen. When pressing the other wired button the program ends.


Here is the source code in case anyone is curious

#include 
#include 
#include 

#include 
#include 



/// It's t1 - t2, in seconds
double get_time_diff(struct timespec t1, struct timespec t2) {
    double a = (double)t1.tv_sec + (t1.tv_nsec / 1000000000.0);
    double b = (double)t2.tv_sec + (t2.tv_nsec / 1000000000.0);

    return a-b;
}

int main() {
    
    const int DEFAULT_COUNTER = 1;
    const double FRAME_TIME = 1.0 / 60.0;

    int BUTTON_A = 7;
    int BUTTON_B = 8;


    int A_high = 0;

    int A_pressed = 0;
    int A_just_pressed = 0;

    int A_counter = 0;


    int B_high = 0;

    int B_pressed = 0;
    int B_just_pressed = 0;

    int B_counter = 0;


    if(wiringXSetup("duo", NULL) == -1) {
        wiringXGC();
        return -1;
    }

    if(wiringXValidGPIO(BUTTON_A) != 0) {
        printf("Invalid GPIO %d\n", BUTTON_A);
    }
    if(wiringXValidGPIO(BUTTON_B) != 0) {
        printf("Invalid GPIO %d\n", BUTTON_B);
    }

    pinMode(BUTTON_A, PINMODE_INPUT);
    pinMode(BUTTON_B, PINMODE_INPUT);



    time_t init_time;
    time(&init_time);

    printf("Init time: %s\n", ctime(&init_time));

    struct timespec tick_start_time;
    timespec_get(&tick_start_time, TIME_UTC);
    struct timespec tick_end_time;
    timespec_get(&tick_end_time, TIME_UTC);


    // Start ncurses
    initscr();


    while(1) {
        
        timespec_get(&tick_start_time, TIME_UTC);

        if (get_time_diff(tick_start_time, tick_end_time) >= FRAME_TIME ) {
            
            // INPUT
            if (digitalRead(BUTTON_A) == HIGH) {

                if (A_high == 0) {
                    A_counter = DEFAULT_COUNTER;
                } else if (A_counter > 0) {
                    A_counter--;
                }
                
                A_high = 1;

                if (A_just_pressed == 1) {
                    A_just_pressed = 0;
                }

                if (A_counter <= 0) {

                    if (A_pressed == 0) {
                        A_just_pressed = 1;
                    }

                    A_pressed = 1;

                }
                
            } else {

                if (A_high == 1) {
                    A_counter = DEFAULT_COUNTER;
                } else if (A_counter > 0) {
                    A_counter--;
                }

                A_high = 0;

                if (A_counter <= 0) {
                    A_just_pressed = 0;
                    A_pressed = 0;
                }

            }

            if (digitalRead(BUTTON_B) == HIGH) {

                if (B_high == 0) {
                    B_counter = DEFAULT_COUNTER;
                } else if (B_counter > 0) {
                    B_counter--;
                }
                
                B_high = 1;

                if (B_just_pressed == 1) {
                    B_just_pressed = 0;
                }

                if (B_counter <= 0) {

                    if (B_pressed == 0) {
                        B_just_pressed = 1;
                    }

                    B_pressed = 1;

                }
                
            } else {

                if (B_high == 1) {
                    B_counter = DEFAULT_COUNTER;
                } else if (B_counter > 0) {
                    B_counter--;
                }

                B_high = 0;

                if (B_counter <= 0) {
                    B_just_pressed = 0;
                    B_pressed = 0;
                }

            }

            
            // UPDATE
            if (A_just_pressed == 1) {
                printw("'A' has just been pressed!\n");
            }
            if (B_just_pressed == 1) {
                // Exit the loop, which will end the program
                break;
            }

            refresh();
            timespec_get(&tick_end_time, TIME_UTC);
        }

    }

    // Stop ncurses
    endwin();

    return 0;
}


I hope someone finds this interesting! Thanks for reading.

3
1
submitted 9 months ago by [email protected] to c/[email protected]

I have an external USB HDD that I use currently. The problem is that if I start my torrent client and a bunch of torrents are being seeded, the HDD gets really hot.

What would be a good storage medium for this use case? The machine only has a microSD card slot and USB3 ports.

4
1
submitted 9 months ago by [email protected] to c/[email protected]
5
1
submitted 9 months ago by [email protected] to c/[email protected]

Glass case containing lots of SBC servers

I built this thing over several years using money I got as a gift on birthdays and holidays. It runs most of what I do online, and it's also what's hosting this image.

I run lots of services on it, such as Nextcloud, OnlyOffice, SearXNG, Gitea, Woodpecker CI, MinIO (S3), Home Assistant, Lightweight Music Server, LURE Web, etc. It only uses about 50W of power on average due to the efficiency of the SBCs. It's all managed by Nomad, Consul, and Traefik.

As for security, the SBCs are on a segregated network where only trusted devices are able to access them and they cannot access any other devices on the network. The trusted network is protected by a 41-character WPA3 password that only I remember, and no ports from the servers are directly exposed to the internet (they go through a TCP reverse proxy on a cheap $3.50/month VPS). TLS is negotiated directly with my servers though, so the VPS never sees any unencrypted traffic.

It's been very useful to me and I love working on it, it's really fun.

6
1
submitted 9 months ago by [email protected] to c/[email protected]

I just noticed this community. I have lots of SBCs (17 of them). It's kind of my thing lol. Here's an article I wrote about something I did with Pine64's Star64 RISC-V SBC: https://www.elara.ws/articles/riscv-cluster/

7
1
submitted 9 months ago by [email protected] to c/[email protected]

I'm not very good at reviewing stuff but I will do my best, if anyone knows a better methodology for a test or wants me to test something please tell me, I want these reviews to be the best they can be.


Post updates

  • 2023-10-09: Original version


Ordering the board

I ordered the 4GB RAM version board on June 2023 alongside a 5V 3A power supply, here's the breakdown of the costs:

  • Quartz64B 4GB SBC: $60
  • 5V 3A EU power supply: $7
  • Shipping to Spain: $12

Total: $79, $67 excluding shipping.

Unfortunately I don't remember how long it took to arrive.


Hardware

My board has a Rockchip RK3566, it has 4 Cortex A55 cores running up to 1.8GHz and it has 4GB LPDDR4 RAM.

I can see printed on the board that I got the V1.3 revision, and the date "2022_02_22" which I assume is the manufacturing date, curiously on "Twosday."

The board has 2 buttons on the side, close to the SD card slot. I think one is a power button and the other a reset button, but it's not very clear to me.

The board also has 2 LEDs, a green one signaling that the board has power and a blue one that blinks like a heartbeat signaling that the board is running. They are very bright, which is good in situations where there is a lot of ambient light but it can be annoying in low-light situations. At night when the lights are off it can very dimly light up a room, and the heartbeat LED is very noticeable in this situation. However it's not that big of a problem really, just slightly hard on the eyes when looking directly at the board.


The connectors of this board are:

  • 1x HDMI (Full size!)
  • 1x Gigabit Ethernet
  • 2x USB 2.0
  • 1x USB 3.0
  • 1x 3.5mm Audio Jack with mic input
  • 1x 3.5mm barrel power input (To power the board)
  • 1x SD Card slot

  • 1x 40 pin GPIO
  • 1x DSI port
  • 1x CSI port
  • 1x RTC port
  • 1x M.2 slot (1x PCIe Gen2)
  • 1x SPI Flash 128Mbit
  • 1x eMMC module slot


Software

Before anything else I think it's very important to point out that X11 doesn't seem to work properly with this board, I don't know if it's a software or hardware problem but it seems like other people have this same issue. If I want to use the board as a tiny Linux desktop I must use Wayland, which is quite a problem as the Desktop Environments that support Wayland happen to be quite resource intensive most of the time. XFCE is pretty much unusable even when it is quite lightweight due to this problem, as it only runs on X11 as far as I know. I have tried to install LabWC (a Window Manager very similar to OpenBox that runs on Wayland) on this board's build of Armbian but I can't figure out how to do it.

I'm saying this since that might be a deal breaker for some people.

The Linux distros that I have tried in this board are:

  • Armbian
  • Manjaro ARM
  • Plebian

Manjaro ARM has an image that comes with Sway, a Window Manager that runs on Wayland (so it doesn't have the X11 issues) and is quite lightweight. The Sway version comes configured in a fairly nice way, but it can see how someone could still find it awkward if they have never tried a tiling WM before.


Desktop usability

Currently I'm writing this post using the board, I'm running Gnome 44.3 on an Armbian build that originally came with XFCE. I'm using a 1080p 144Hz display and while I have seen some visual glitches the desktop runs fine as long as nothing resource intensive is going on.

Firefox is not very fluid, but it is usable. It depends a lot on what pages you have open. Lemmygrad runs fairly well, but pages such as YouTube are quite painful to use. An arbitrarily selected YouTube video running at 480p 30fps drops around 10% of its frames, and loading stuff takes quite a while. Things get better on Invidious but it's still sluggish.

LibreOffice Writer is usable but feels sluggish, especially when scrolling through a document.

Moving the mouse in circles over Firefox puts the CPU at around 60% which is kinda concerning. Not moving the mouse or typing makes the CPU idle at around 1-6%. Moving the mouse in circles over btop running on a foot terminal window puts the CPU at around 25%. All of this is in a display running at 144Hz.


Benchmarks and temperatures

  • 7z b

pic:7z b benchmark

The CPU seems to thermal throttle when approaching 70ºC, which probably explains why each consecutive result is lower than the one before it. I already have stuff to cool the board's chips on the way here, I will repeat these tests once they arrive.


Unfortunately the only other SBC I have is a Raspberry Pi 3B so I don't really have a point of reference to be able to tell if the board is worth it. I think the X11 issue is quite a problem that should be considered if you are eyeing this board.

If you think something about this review can be improved or you want me to test something feel free to comment.

Single Board Computers

22 readers
1 users here now

Community dedicated to Single Board Computers. Reviews, benchmarks, projects, or anything really.

founded 9 months ago
MODERATORS