Integrazione LLM di Modelli AI su OS Linux

La possibilità di integrare nel proprio sistema operativo più modelli di intelligenze artificiali sarà sempre più pressante nei prossimi anni/mesi/giorni per non perdere il passo con le nuove tecnologie.

In questo articolo installeremo un tool, Ollama, che ci permetterà di fare questa integrazione, passo dopo passo con integrazione ai browser, in questo caso Brave.

Prima di tutto una precisazione, il tool Ollama e open source cosi come i modelli LLM che può caricare (chatgpt non è fra questi), il servizio è locale, che sta ad indicare che sia l*input che l’output non vengono inviati in internet, il tutto è offline, questo comporta un notevole uso di risorse hardware, cpu potenti e possibilmente gpu altrettanto performanti, ma soprattutto molta memoria, ad esempio 8gb di ram sono il minimo per AI sotto i 7b token, 16gb fino a 13b che occupano uno spazio sui media di più di 4gb, AI da 70b parametri richiedono almeno 64gb di ram e una occupazione sul disco di + 40gb.

Prima di proseguire con l’installazione e configurazione consultare il repository github del servizio Ollama a questo indirizzo:

https://github.com/ollama/ollama/blob/main/docs/linux.md

Per installare il sevizio, da terminale, digitare il seguente comando, che scarica lo script di installazione e lo esegue ((solo per sistemi systemd):

curl -fsSL https://ollama.com/install.sh | sh

Il sistema è già pronto per avviare un modello di AI, come nell’esempio seguente che esegue un modello open source francese:

ollama run mistral

Se è la prima volta che l’AI viene utilizzata richiede tempo per scaricare il modello (in questo caso più di 4gb) e al completamento viene avviata con il suo prompt.

Altri modelli attualmente disponibili al 13/10/24 sono:

Model 	Parameters 	Size 	Download
Llama 3.2 	3B 	2.0GB 	ollama run llama3.2
Llama 3.2 	1B 	1.3GB 	ollama run llama3.2:1b
Llama 3.1 	8B 	4.7GB 	ollama run llama3.1
Llama 3.1 	70B 	40GB 	ollama run llama3.1:70b
Llama 3.1 	405B 	231GB 	ollama run llama3.1:405b
Phi 3 Mini 	3.8B 	2.3GB 	ollama run phi3
Phi 3 Medium 	14B 	7.9GB 	ollama run phi3:medium
Gemma 2 	2B 	1.6GB 	ollama run gemma2:2b
Gemma 2 	9B 	5.5GB 	ollama run gemma2
Gemma 2 	27B 	16GB 	ollama run gemma2:27b
Mistral 	7B 	4.1GB 	ollama run mistral
Moondream 2 	1.4B 	829MB 	ollama run moondream
Neural Chat 	7B 	4.1GB 	ollama run neural-chat
Starling 	7B 	4.1GB 	ollama run starling-lm
Code Llama 	7B 	3.8GB 	ollama run codellama
Llama 2 Uncensored 	7B 	3.8GB 	ollama run llama2-uncensored
LLaVA 	7B 	4.5GB 	ollama run llava
Solar 	10.7B 	6.1GB 	ollama run solar

Comandi più utilizzati:

ollama list                 (visualizza tutte le AI caricate)
ollama show <modello AI>     (mostra informazioni sulla AI)
ollama rm <modello AI>        (rimuove l'AI dal sistema)
ollama pull <modello AI>      (aggiorna  l'AI)
ollama serve                 (avvia solo il servizio)

Il browser Brave ha recentemente implementato la possibilità di interagire con AI online con la procedura chiamata Leo, ma che permette anche di integrare LLM locali con una semplice configurazione:

Avviare Brave, nel menu selezionare <impostazioni> nella lista selezionare <Leo>, cliccare sul bottone <Aggiungi nuovo modello>, Compariranno una serie di inserimenti:

Etichetta -> Inserire il nome che volete dare al modello

Nome della richiesta di modello -> identificativo del modello che è lo stesso che avviereste con run in ollama.

Endpoint del server -> in Ollama è l’url: <http://localhost:11434/v1/chat/completions>

Salvare il modello e questi comparirà nella lista insieme ad altri modelli (online), selezionarlo come predefinito e attivare il lo switch <Mostra l’icona di Leo nella barra laterale>.

Naturalmente LLM deve essere stata precedentemente caricata e il servizio Ollama attivo verificando con:

sudo systemctl status ollama

Se è down, avviarlo:

sudo systemctl start ollama

Nota: L’integrazione è stata fatta in Debian con il gestore dei servizi systemd, con altre init system potrebbe non funzionare!

Gambas3 su Arch e Manjaro ARM 64-bit

Installare Gambas3 su Arch e Manjaro ARM 64-bit su Raspberry Pi .

*Articolo aggiornato al 18/06/2023

Se nei repositary Arch non è presente l’eseguibile ide di Gambas3 , seguire la seguente procedura per lo scarico, compilazione e installazione, non prima di avere aggiornato il sistema:

$ sudo pacman -Syu

Creare o posizionarsi in una cartella di lavoro, ad esempio </home/tmp> e aprire il terminale in quella posizione.

-Scarico dei sorgenti e script di build con il tool asp da installare:

$ sudo pacman -S asp
$ asp checkout gambas3

-Posizionarsi nella directory di costruzione:

$ cd gambas3/trunk

-Modificare lo script presente nella cartella aprendo file PKGBUILD con un editor di testo e alla linea 32 modificare :

"arch=('x86_64')" con  "arch=('aarch64')"

Salvare PKGBUILD.

-Installare le dipendenze:

$ sudo pacman -S --needed alure autoconf automake bzip2 coreutils curl dbus gcc gdk-pixbuf2 git glew glib2 gmime3 gsl gst-plugins-base gstreamer gtk2 gtk3 gtkglext imlib2 intltool libffi libgnome-keyring libmariadbclient librsvg libsm libxcursor libxml2 libxslt libxtst mariadb make mesa ncurses pcre pkg-config poppler-glib postgresql postgresql-libs qt5-svg qt5-x11extras sdl2 sdl2_gfx sdl2_image sdl2_mixer sdl2_net sdl2_ttf sdl_mixer sdl_ttf smpeg sqlite unixodbc v4l-utils xdg-utils zlib fakeroot webkit2gtk glew alure

Prima di avviare la fase di compilazione occorre tenere presente che ciò richiede più di un ora di elaborazione. Se ne caso nei primi minuti dovesse dare errore di libreria non trovata eseguite il comando

$ sudo pacman -S nome-libreria

dove nome-libreria è specificata nell’ errore rilevato, e riavviate la fase di build. Inoltre devono essere presenti i tool di compilazione come make e la suite gcc, se non presenti installateli.

-Avvio della fase di costruzione sempre nel percorso <gambas3/trunk> dove c’è il file PKGBUILD:

$ makepkg

-Installazione del pacchetto appena compilato:

$ sudo pacman -U *.xz

oppure (verificare estensione dei files compressi)

$ sudo pacman -U *.zst

Procedura verificata e aggiornata su Raspberry pi 4 model B rev. 1.1 con os Arch ARM Linux aarch64 Xface4.

Riferimenti:

http://gambas.sourceforge.net/wiki/install

Gambas3 e sviluppo del MPU-6050

MPU-6050 è un processore di movimento : giroscopio su 3 assi e accellerometro sempre su 3 assi + sensore di temperatura.

Non staremo qui a descrivere in dettaglio le caratteristiche del’integrato dato che c’è un ampia letteratura sulla rete, ci limiteremo all’essenziale per programmare con gambas3.

Inanzitutto è conosciuto come modulo completo con la sigla GY-521, che sul raspberry pi può essere collegato direttamente sui gpio nel modo seguente:

A parte i 2 collegamenti di alimentazione, rosso +3.3v e nero ground, il giallo e il verde si collegano alle porte che gestiscono il protocollo di comunicazione I2C, che deve essere abilitato a livello kernel.

Per abilitare il canale I2C, è possibile in modalità gui dal menù applicazioni->Configurazione di Raspberry Pi nella scheda Interfacce e abilitare premendo lo switch in corrispondenza di I2C, mentre da cli avviare il comando <sudo raspi-config>, selezionare Interface options e abilitare la scelta I2C.

In entrami i casi riavviare il sistema.

Prima di entrare nel merito del codice in Gambas fare riferimento ai requisiti minimi del sistema ed alle librerie necessarie all’esecuzione dell’applicativo:

Il progetto sarà <Comand-line application> con l’aggiunta del componente <ncurses>.

I moduli da importare nel progetto sono i seguenti:

Infine il modulo principale Main:

' Gambas module file

Public hWin As Window
'Public hScreen As Screen
Public hObserver As Observer

Public WinH As Integer 
Public WinW As Integer  
Public ScrH As Integer
Public ScrW As Integer
Public bLowSize As Integer

Public iDivClock As Byte
Public fd As Integer

Public VisualTime As Float = 0.02

Public Sub Main()

Dim Acc_x, Acc_y, Acc_z As Float
Dim Gyro_x, Gyro_y, Gyro_z As Float
Dim Temper As Float
Dim Ax, Ay, Az As Float
Dim Gx, Gy, Gz As Float
Dim i As Integer
Dim ChiSono As Byte

hWin = New Window(True, 0, 0, 78, 24) As "WinEvent"
hObserver = New Observer(Screen) As "EvRes"

WinH = 24
WinW = 78
ScrH = 26
ScrW = 80


MGpio.wiringPiSetup()
fd = MGpio.wiringPiI2CSetup(Mpu6050.Device_Address)
Mpu6050.Setup(fd)
ChiSono = Mpu6050.ReadReg8(fd, Mpu6050.WHO_AM_I) 
Mpu6050.WriteOffSetDir(fd)
iDivClock = Mpu6050.ReadReg8(fd, Mpu6050.SMPLRT_DIV)


hWin.SetFocus()
Screen.Cursor = Cursor.Hidden



Do
  If bLowSize Then
    
    hWin.PrintCenter("Ripristinare il terminale")
    
  Else
    
    hWin.Print(" Adress " & Hex(ChiSono) & "  clock=8Khz/" & (MGpio.wiringPiI2CReadReg8(fd, Mpu6050.SMPLRT_DIV) + 1) & " visual=" & VisualTime & "s  <P>=wait 10s <q>=exit", 0, 0)
    hWin.Print(" accx      accy      accz      gyrx      gyry      gyrz     temper", 0, 1)

    For i = 2 To 22
    
      Acc_x = Mpu6050.ReadReg16(fd, Mpu6050.ACCEL_XOUT_H) / Mpu6050.RESACC
      Acc_y = Mpu6050.ReadReg16(fd, Mpu6050.ACCEL_YOUT_H) / Mpu6050.RESACC
      Acc_z = Mpu6050.ReadReg16(fd, Mpu6050.ACCEL_ZOUT_H) / Mpu6050.RESACC
      Gyro_x = Mpu6050.ReadReg16(fd, Mpu6050.GYRO_XOUT_H) / Mpu6050.RESGYR
      Gyro_y = Mpu6050.ReadReg16(fd, Mpu6050.GYRO_YOUT_H) / Mpu6050.RESGYR
      Gyro_z = Mpu6050.ReadReg16(fd, Mpu6050.GYRO_ZOUT_H) / Mpu6050.RESGYR
      Temper = Mpu6050.ReadReg16(fd, Mpu6050.TEMPER_OUT_H) / 340 + 36.53
    
      hWin.Print(Format(Acc_x, "0.###"), 1, i)
      hWin.Print(Format(Acc_y, "0.###"), 10, i)
      hWin.Print(Format(Acc_z, "0.###"), 20, i)
      hWin.Print(Format(Gyro_x, "0.###"), 30, i)
      hWin.Print(Format(Gyro_y, "0.###"), 40, i)
      hWin.Print(Format(Gyro_z, "0.###"), 50, i)
      hWin.Print(Format(Temper, "0.###"), 60, i)
    
    
    Next
  
  Endif
  
  Wait VisualTime
  hWin.SetFocus()

Loop
  
End

Public Sub WinEvent_Read()

Dim iKey As Integer = Window.Read()

  If iKey = Key["p"] Then
 
    Wait 10
    
  Endif
  
  If iKey = Key["q"] Then
    Quit
  Endif
  
  If iKey = Key.Up Then
    Inc iDivClock
    MGpio.wiringPiI2CWriteReg8(fd, Mpu6050.SMPLRT_DIV, iDivClock)
  Endif
  If iKey = Key.Down Then
    Dec iDivClock
    MGpio.wiringPiI2CWriteReg8(fd, Mpu6050.SMPLRT_DIV, iDivClock)
  Endif
  
  If iKey = Key.PageUp Then
    VisualTime += 0.02
  Endif
  If iKey = Key.PageDown Then
    VisualTime -= 0.02
  Endif
  
  hWin.Raise()
End



Public Sub EvRes_Resize()
  
  Screen.Beep
  If Screen.H < 26 Or Screen.W < 70 Then
    bLowSize = True
    hWin.Clear()
  Else If bLowSize
    bLowSize = False
    hWin.Clear()
  Endif
  
End

L’applicativo mostrera i valori letti presentati dal MPU con il rateo selezionato :

premendo <p> per 10 secondi non verrà aggiornata la schermata

<q> si esce dal programma

Le frecce <up> e <down> aumentano o diminuiscono il divisore di frequenza.

<pageUp> e <pageDown> incrementano o diminuiscono il tempo di visualizzazione.

Fai lavorare WiringPi su Bookworm

Il 29/02/24 la libreria è stata aggiornata alla versione 3.0, compatibile con debian 12 bookworm e rasperry p5.

Sulla versione raspi os basata su debian 12 bookworm la libreria wiringpi non funziona.

Compilando la fork unofficial di wiringpi 2.70 al repositary github:

https://github.com/WiringPi/WiringPi

$ git clone https://github.com/WiringPi/WiringPi

Viene evidenziato il seguente errore:

$ gpio -v
gpio version: 2.70
Copyright (c) 2012-2018 Gordon Henderson
This is free software with ABSOLUTELY NO WARRANTY.
For details type: gpio -warranty

Oops: Unable to determine board revision from /proc/cpuinfo
 -> No "Hardware" line
 ->  You'd best google the error to find out why.

Analizzando il file /pro/cpuinfo, si evidenzia che nella precedente versione os, la debian 11 bullseye è presente la line “Hardware : BCMXXXX (che possono essere BCM2835, BCM2708 o BCM2709) ma nella nuova distro è mancante.

Debian 11 Bullseye:

...
Hardhare        : BCM2835
Revision	: c03111
Serial		: 10000000XXXXXXXX
Model		: Raspberry Pi 4 Model B Rev 1.1



Debian 12 BookWorm:

...
??????
Revision	: c03111
Serial		: 10000000XXXXXXXX
Model		: Raspberry Pi 4 Model B Rev 1.1

Per sopperire all’errore fatale è necessario modificare il sorgente che troviamo nella directory “../WiringPi/wirringPi/”: il file “wiringPi.c”.

Con un editor o un ide c/c++ typo Geany modifichiamo la funzione “pigpioLayout()” alla riga 747

Codice originale:


  while (fgets (line, 120, cpuFd) != NULL)
    if (strncmp (line, "Hardware", 8) == 0)
      break ;

  if (strncmp (line, "Hardware", 8) != 0)
    piGpioLayoutOops ("No \"Hardware\" line") ;

  if (wiringPiDebug)
    printf ("piGpioLayout: Hardware: %s\n", line) ;

Modificare aggiungendo il codice di commento su più linee “/* …*/” dalla 764 alla 772, la modifica sarà questa:

  /*while (fgets (line, 120, cpuFd) != NULL)
    if (strncmp (line, "Hardware", 8) == 0)
      break ;

  if (strncmp (line, "Hardware", 8) != 0)
    piGpioLayoutOops ("No \"Hardware\" line") ;

  if (wiringPiDebug)
    printf ("piGpioLayout: Hardware: %s\n", line) ;*/

Salvare la modifica, posizionarsi nella directory “WiringPI” dove c’è il file “build” e da terminale eseguire i seguenti comandi:

$ ./build clean
$ ./build

Verificare se tutto è andato a buon fine con il comando “gpio -v”, l’output deve essere simile a questo:

$ gpio -v
gpio version: 2.70
Copyright (c) 2012-2018 Gordon Henderson
This is free software with ABSOLUTELY NO WARRANTY.
For details type: gpio -warranty

Raspberry Pi Details:
  Type: Pi 4B, Revision: 01, Memory: 4096MB, Maker: Sony 
  * Device tree is enabled.
  *--> Raspberry Pi 4 Model B Rev 1.1
  * This Raspberry Pi supports user-level GPIO access.

Programmazione “analogica” dei gpio sul raspberry con gambas3

Il raspberry pi non mette a disposizione porte analogiche, ma è possibile aggirare la limitazione con vari espedienti (procurarsi un convertitore A/D ad esempio).

Oppure utilizare un condensatore adeguato e con un sempllice circuito è possibile programmare un sensore analogico sulla base della sua resistenza.

Il fotoresitore o LDR è un buon esempio.

La formula che ci permette di avere dei valori coerenti e la seguente:

t = R * C

t è il tempo impiegato per caricare il condensatore al 63%
R la resistenza in Ohm
C il condensatore in F(arad)

L’ esempio di un Resistenza di 10Kohm e un Condensatore di 10uF darà:

t = 10000hom * 0.00001F = 0.1 secondi (100 millisecondi)

Questa è la teoria ma dato che il nostro approccio è da programmatori non ci dilungheremo su alcuni fattori da considerare per avere dei valori precisi, ad esempio il fatto che il raspberry considere il valore basso con una tensione sotto 1.8v circa, sulla resistenza dello stesso circuito, che non siamo in realtime… etc.

La visualizzazione del progetto:

Componenti:

1 Condensatore da 10uF

1 LDR o fotoresistore

Il sorgente in gambas3 tipologia Command-line application :

' Gambas module file

' RC


Public iCount As Integer
Public iaVal[220] As Integer
Public iMedia As Integer
Public DiffTime As Float

Public Const NSAM As Integer = 32     'Numero di misurazioni
Public Const iPin As Integer = 1      'Porta wiringpi 
Public Const CAP As Float = 0.00001   'Condensatore utilizzato 10uf
Public Const CA As Float = 2.130620985    'Fattore di aggiustamento

Public Sub Main()
  Dim StartTime As Float
  Dim rc, res As Float
  Dim iIndex As Integer
  
  Print "Test RC - resistenza * condensatore"
  
  If MGpio.wiringPiSetup() = -1 Then
    Print "errrore = wiringPi non inizializzato" 
    Quit -1
  Endif

  Do
    
    DiffTime = 0.0
    
    For iIndex = 0 To NSAM - 1
      
      iCount = 0
      MGpio.pinMode(iPin, MGpio.PIN_OUTPUT)
      MGpio.digitalWrite(iPin, MGpio.PIN_LOW)
      
      Wait 0.005
      MGpio.pinMode(iPin, MGpio.PIN_INPUT)
      
      StartTime = Timer
      While MGpio.digitalRead(iPin) = MGpio.PIN_LOW
        Inc iCount
      Wend
      DiffTime += Timer - StartTime
      
      iaVal[iIndex] = iCount
      
    Next
    
    iMedia = 0
    For iIndex = 0 To NSAM - 1
      iMedia += iaVal[iIndex]
    Next
        
    Rep()
    
  Loop
  
End

Public Sub Rep()
  
  Dim rc, res As Float
  
    Print "---------------"

    Print Format(iMedia / NSAM, "0#  Contatore")
    
    'calcolo rc (resistenza * condensatore)
    rc = DiffTime / NSAM * CA           'Timer
    Print Format(rc, "0.###### Secondi")
    
    'calcolo resistenza
    res = rc / CAP
    Print Format(res, "0# Ohm")
    
    Print Time(Now); "  Tempo"
  
End

Il progetto comprende il modulo MGpio e deve essere installata la libreria wiringPi.

La configurazione usata e l’installazione della libreria la potete trovare qui:

' Gambas module file
'' MGpio

Library "/usr/lib/libwiringPi"
''Definisce la libreria e la sua posizione nel file system

Public Extern wiringPiSetup() As Integer
'Inizializza la libreria

Public Extern pinMode(pin As Integer, pud As Integer)
'Configura la modalità operativa della porta

Public Extern digitalWrite(pin As Integer, value As Integer)
'Attiva o disattiva il segnale di uscita della porta

Public Extern digitalRead(pin As Integer) As Integer        
 'Legge lo stato della porta (low=0, high=1)

Public Const PIN_IN As Integer = 0
Public Const PIN_OUT As Integer = 1
'Modalità operativa porte

Public Const PIN_LOW As Integer = 0
Public Const PIN_HIGH As Integer = 1
'Stato delle porte

Il programma è composto da un loop infinito (Do Loop) che contiene un altro ciclo (For Next) che memorizza un numero di misurazioni (NSAM) da cui si deriva una media , invece il ciclo While sonda se è presente una tensione che se è alta è in fase di carica del condensatore ed esce quando diventa bassa e memorizza un contatore e il tempo di carica .

Ricordo che la resistenza del LDR diminuisce con l’aumento dell’intensita della luce e viceversa, più luce più velocemente carica il condensatore.

Il report mostra:

1 – la media del contatore

2 – il tempo impiegato (media)

3 – l’approssimazione del calcolo della resistenza

4 – l’ora della rilevazione

Installazione e configurazione base di Arch Linux Arm su Raspberry Pi 4 con Xfce e/o Plasma

Articolo esaustivo ultima verifica il 08/05/2024 (Plasma 6)

-Preparazione del supporto di memorizzazione di massa (SD ma anche pen drive o hd su usb)

Prima di iniziare tutta la procedura di preparazione del supporto verificare che i seguenti tools siano installati:

dosfstools mtools

Da un sistema linux attivo, cancellare se necessario tutte le partizioni dal supporto e creare la prima partizione di almeno 400MB, formattata con FAT32 e i flags impostati a ‘boot,lba’
Creare una seconda partizione assegnando il resto dello spazio libero o almeno 16Gb in EXT4, se si vuole installare più desktop enviroment.
Lo si può fare con applicazioni di gestione disco sia da cli, come fdisk, o con applicativi grafici tipo gparted.
Si otterrà uno schema simile dove ‘X’ reppresenta il device da configurare:

Device  partizione   formattazione   capacità  flags
sdX--|
     |-- sdX1         FAT32          400MB     boot,lba
     |-- sdX2         EXT4           +16GB

Conclusa questa fase, posizionarsi in una cartella temporanea ed eseguire questi comandi dal terminale:

$ sudo mkfs.vfat /dev/sdX1
$ mkdir boot
$ sudo mount /dev/sdX1 boot
$ sudo mkfs.ext4 /dev/sdX2
$ mkdir root
$ sudo mount /dev/sdX2 root

Vengono in questo modo creati i files system (fs) e montati.

Di seguito viene attivato il download dell’ultima versione del sistema arch linux armv8 a 64bit e la scompattazione dei files nel fs arch:

$ wget http://os.archlinuxarm.org/os/ArchLinuxARM-rpi-aarch64-latest.tar.gz
$ sudo bsdtar -xpf ArchLinuxARM-rpi-aarch64-latest.tar.gz -C root
$ sync

Per mantenere la compatibilità con l’architettura armv7 (32bit) scegliere invece la seguente procedura:

$ wget http://os.archlinuxarm.org/os/ArchLinuxARM-rpi-armv7-latest.tar.gz
$ sudo bsdtar -xpf ArchLinuxARM-rpi-armv7-latest.tar.gz -C root
$ sync

Se da errore tipo wget o bsdtar comando non trovato eseguire l’installazione:

$ sudo pacman -S wget

$ sudo pacman -S libarchive-tools

o su sistemi debian:

$ sudo apt install wget

$ sudo apt install libarchive-tools

Infine muovere i files da root/boot/ nel fs di boot e poi i fs vengono smontati:

$ sudo mv root/boot/* boot
$ sync

$ sudo umount boot root

Il supporto è pronto per essere avviato sul sistema raspberry pi 4.

NOTA: naturalmente se il sistema vi nega il permesso di eseguire i comandi sopra esposti, usate ‘sudo comando_da_eseguire’.

-Avvio e configurazione base

Se avete scelto di installare il sistema su un qualsiasi supporto che non sia la porta interna SD (mmcblk0p1) al primo avvio si presenterà un errore ed entrerà in modalita emergenza, inserite la password <root>, al prompt eseguite il comando:

# nano /etc/fstab

con l’editor modificate la linea dove c’è il device:

/dev/mmcblk0p1

e sostituitelo con

/dev/sda1

Attenzione! In alcuni casi come periferiche docking il device potrebbe essere “/dev/sdb1”

<Ctrl>+ <O> per salvare la modifica, <Invio> per confermare e <Ctrl>+<X> per uscire e infine riavviare di nuovo con:

# reboot

Al completamento del boot loggarsi come utente ‘root’ e password ‘root’, che ha i massimi privilegi, mentre l’altro utente registrato, ‘alarm’ con password ‘alarm’, ha privilegi base.

Configurare la tastiera al volo, nel nostro caso italiana:

# loadkeys it

Per la sicurezza del sistema è conveniente modificare la password di ‘root’ con il comando:

# passwd

Prima di proseguire nella configurazione del sistema, una precisazione, è possibile che i files da configurare non esistano, in questo caso creali.

Configurare la tastiera persistente con l’editor nano:

# nano /etc/vconsole.conf

aggiungere o modificare la propietà:

KEYMAP=it

<Ctrl>+ <O> per salvare la modifica, <Invio> per confermare e <Ctrl>+<X> per uscire

Configurare la localizzazione:
creare o editare il file:

# nano /etc/locale.conf

aggiungere o modificare:

LANG=it_IT.UTF-8

Modificare il file:

# nano /etc/locale.gen

togliendo il commento (#) alla riga identificata dal opzione precedentemente modificata (it.UTF-8 UTF-8)
dopo il salvataggio eseguire il comando:

# locale-gen

Togliere commento (#)

Per il fuso orario:

# timedatectl set-timezone Europe/Rome

Creazioni delle credenziale del sistema:

# pacman-key –init

# pacman-key –populate archlinuxarm

Nota: Nei precedenti comandi i trattini so doppi!

Configurare il gestore dei pacchetti e dei repository:

# nano /etc/pacman.conf

Verificare o togliere commento o aggiungere queste opzioni:

SigLevel = Required DatabaseOptional
LocalFileSigLevel = Optional

La prossima modifica riguarda la scelta del mirror togliendo il commento (#) ad un identificativo del url, che è contrassegnato da una riga tipo: ‘# Server = http://…’ (possibilmente il più vicino localmente o, se abbiamo la possibilità di verificare, con il ping più basso ) modificando il file:

# nano /etc/pacman.d/mirrorlist

A questo punto verificare se la rete è attiva con:

# ip addr show

Per attivare il wifi dare il comando:

# wifi-menu

Se la connessione è attiva si procede con gli ultimi aggiornamenti:

# pacman -Syu

# pacman -S accountsservice

Configurare o sostituire utente alarm (ignorare il primo comando se si vuole mantenere l’utente alarm, in questo caso <nuovo_utente> resterà alarm):

# usermod -l nuovo_utente alarm

# passwd nuovo_utente

# usermod -d /home/nuovo_utente -m nuovo_utente

Concedere privilegi al nuovo utente:

# pacman -S sudo

Aggiungere al file /etc/sudoers il nuovo utente privilegiato:

# nano /etc/sudoers

Sotto la riga di commento
## User privilege specification
copiare la riga della proprietà di root ‘root ALL=(ALL:ALL) ALL’ e aggiungere la stessa per il nuovo utente:

nuovo_nome ALL=(ALL:ALL) ALL

Aggiungere nome nuovo utente

Aggiungere gruppi:

# usermod -aG video,tty,audio nuovo_nome

A questo punto riavviare il sistema e loggarsi come nuovo_nome.

Installazione Xface e Kde/Plasma

Innanzitutto verificare che nella configurazione di avvio siano presenti queste opzioni modificando il seguente file:

$ sudo nano /boot/config.txt

le opzioni da aggiungere sono:

dtoverlay=vc4-kms-v3d
disable_overscan=1
display_auto_detect=1

Prima di installare un desktop environment e bene premunirsi dei tools di sviluppo per i pacchetti non binari:

$ sudo pacman -S base-devel binutils git fakeroot make automake autoconf

Installare xfce4, driver video e x server:

$ sudo pacman -S xfce4 xfce4-goodies xorg xf86-video-fbdev gvfs

Altre app utili:

$ sudo pacman -S networkmanager network-manager-applet pavucontrol pulseaudio xdg-user-dirs-gtk

Eseguire i seguenti comandi:

$ sudo systemctl enable NetworkManager.service

$ xdg-user-dirs-gtk-update

Prima di avviare il desktop fare un reboot e dopo il login si può accedere al DE con:

$ startxfce4

Installare KDE/Plasma:

$ sudo pacman -S –needed xorg plasma-desktop plasma-meta kde-applications

Per avviare Plasma:

$ systemctl start sddm.service

In alternativa per avviare il display manager e il login grafico automaticamente sia plasma che xfce :

$ systemctl enable sddm.service

Introduzione alla programmazione delle gpio del Raspberry Pi

Metteremo a confronto due linguaggi il C (di fatto un subset del C++) e Gambas3 (non solo un Basic orientato agli oggetti ma anche un ambiente RAD) per capire forse che non ci sono linguaggi facili o difficili ma progetti semplici o complessi.

In questa introduzione i progetti sono facili (per il momento) e le diversità non sono così nette, sopprattutto per il fatto che tutto il lavoro lo fanno le librerie nel nostro caso sarà WiringPi.

Prima di tutto elenchiamo gli strumenti indispensabili con a fianco quelli usati in questi test:

Hardware
-Raspberry Pi               > Rpi 4 Model B Rev 1.1 4gb
-Resistenze, cavi, led e board
Software
-Raspberry Pi OS (Raspbian) > Debian GNU/Linux 11 (bullseye) aarch64
-IDE Gambas3 ver. => 3.15   > ver. 3.15.2
-Compilatore GNU C => 9     > gcc 10-10.2.1 (64bit)
-Libreria WiringPi = 2.70   > ver. 2.70
-Editor di testi o IDE tipo codeblocks o geany      

Il software elencato se non già presente, è facilmente reperibile nei repositary.
Purtroppo la libreria WiringPi è da qualche anno non più sopportata, anche se viene aggiornato un suo fork, nella versione 2.61 appunto, scaricabile con git, ricordandosi di posizionarsi in una cartella adeguata:

$ git clone https://github.com/WiringPi/WiringPi.git

oppure scaricare il file zip all’indirizzo:

https://github.com/WiringPi/WiringPi/archive/refs/heads/master.zip

e scompattarlo.

Per compilare e installare la libreria dare i comandi:

$ cd WiringPi
$ ./build

Pochi secondi e se l’esito è senza errori dare i seguenti comandi per ulteriore verifica:

$ gpio -v
$ gpio readall

il primo visualizza la versione e altre info, fra l’altro se avete accesso alle porte in user mode, mentre il secondo mostra la numerazione e lo stato delle porte.

-Il progetto:
Programmare l’accensione e lo spegnimento di un led.

-Il circuito
Collegare il polo + (anodo, capo più lungo) del led alla porta 0 nella numerazione wiringpi (fisica pin 11, BCM 17) e il capo – alla resistenza da 330ohm (anche un 220ohm se il led è un pò “spento”) che si collega a uno dei pin di terra (tipo pin fisico 6 o 9 o 14 …)

https://it.pinout.xyz/pinout/wiringpi#

http://wiringpi.com/examples/blink/

-La programmazione in C
il listato essenziale:

#include <wiringPi.h> //contiene i riferimenti e le definizioni 

int main (void)
{
   wiringPiSetup(); // inizializza la libreria, procedura necessaria
   pinMode (0, OUTPUT); //pone la porta (0) in modalità scrittura

   //for (;;)
   while(1) //ciclo infinito (TRUE=1)
   {
     digitalWrite(0, HIGH); //manda un segnale attivo alla porta (0) (+3,3 volt)
     delay(500); //led acceso per mezzo secondo
     digitalWrite(0, LOW); //apre il circuito (0,0 volt) spegne il led
     delay(500) ; // attende 500ms e il ciclo si ripete
   }
   return 0; //si esce con <Ctrl c>
}

Il file completo lo potete trovare nella cartella ‘WiringPi/examples/blink.c’

Per compilare il file sorgente il comando é:

$ gcc -Wall -o blink blink.c -lwiringPi

dove ‘blink.c’ è il nome che abbiamo dato al nostro file sorgente e ‘blink’ il nome dell’eseguibile prodotto che sarà avviato con

$ ./blink

Per poter compilare con IDE Geany dopo aver creato il progetto con almeno un file con estensione .c, nel menù sotto la voce ‘progetto’, selezionare ‘Propietà’ e nella tab ‘Compila’ nell’etichetta ‘Build’ aggiungere al comando già presente dopo uno spazio ‘-lwiringPi’
Nel caso di codeblock nella finestra ‘Management’ in ‘Projects’ tasto destro del mouse sul nome del progetto, selezionare ‘Build options…’ e nel tab ‘Linker settings’ nella finestra ‘Other linker options’ aggiungere ‘-lwiringPi’

-La programmazione in Gambas3
Il tipo di progetto è ‘Command-line application’.

Listato che contiene riferimenti e definizioni come nell’omologo c che chiameremo ‘MGpio’ e creato come Modulo:

' Gambas module file
'' MGpio

Library "/usr/lib/libwiringPi"
''Definisce la libreria e la sua posizione nel file system

Public Extern wiringPiSetup() As Integer
'Inizializza la libreria

Public Extern pinMode(pin As Integer, pud As Integer)
'Configura la modalità operativa della porta

Public Extern digitalWrite(pin As Integer, value As Integer)
'Attiva o disattiva il segnale di uscita della pota

Public Extern digitalRead(pin As Integer) As Integer        
 'Legge lo stato della porta (low=0, high=1)

Public Const PIN_IN As Integer = 0
Public Const PIN_OUT As Integer = 1
'Modalità operativa porte

Public Const PIN_LOW As Integer = 0
Public Const PIN_HIGH As Integer = 1
'Stato delle porte

Listato del programma vero e proprio, Main:

' Gambas module file

'' Main


'Hardware Pin 11 - GPIO/BCM pin 17 - WiringPi pin 0
Public Const Select_Pin As Integer = 0

Private tasto As Boolean 


Public Sub Main()

  Print "Accensione Led"
  MGpio.wiringPiSetup()
  MGpio.pinMode(Select_Pin, MGpio.PIN_OUT)
  tasto = False
  
 Repeat	     'ciclo ripetuto finchè non viene premuto un tasto
    MGpio.digitalWrite(Select_Pin, MGpio.PIN_HIGH)
    Print "Led acceso"
    Wait 0.5					'in secondi	

    MGpio.digitalWrite(Select_Pin, MGpio.PIN_LOW)
    Print "Led spento"
    Wait 0.5
 Until tasto  

 MGpio.digitalWrite(Select_Pin, MGpio.PIN_LOW)
 'pone lo stato della porta a 0 volt

 Quit
 'ed esce

End


'intercetta la pressione del tasto <ENTER>
Public Sub Application_Read()

 tasto = True

End

‘MGpio.’ è il riferimento al modulo (classe statica) che abbiamo creato.

Wait come delay in c, sospende l’esecuzione del processo per il numero di secondi in Wait e in millisecondi in delay.

In un ciclo infinito non ha importanza l’istruzioni da dare, se ‘for’ ‘while’ ‘repeat’ ‘do’ etc…

Configurazione Ubuntu per Raspberry

Modifiche di configurazione hardware per Ubuntu 22.04 per ottenere un sistema più stabile.

Per evitare possibili freezing dello schermo dato principalmente dal trascinamento delle finestre modificare il file config.txt da terminale:

sudo nano /boot/firmware/config.txt

alla voce

dtoverlay=vc4-kms-v3d

modificare in

dtoverlay=vc4-fkms-v3d

<Ctrl+o> per salvare la modifica e <Ctrl+x> per uscire

Riavviare il sistema

Altra possibile situazione critica è Auto Suspend dell’USB:

modifichiamo il file di grub

sudo nano /etc/default/grub

alla linea

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"

aggiungere

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash usbcore.autosuspend=-1"

salvare ed uscire dal editor e aggiornare grub con:

sudo update-grub

Riavviare il sistema.

Altra situazione “fastidiosa” può avvenire quando colleghiamo il Raspberry a un televisore e l’immagine trasborda oltre il quadro della cornice della tv.

Per ovviare a questo basta modificare il nostro file di configurazione

sudo nano /boot/firmware/config.txt

e alla voce

disable_overscan=1

impostare il valore a 0

disable_overscan=0

Naturalmente salvare il tutto.

Fonti:

https://bugs.launchpad.net/ubuntu/+source/linux-raspi/+bug/1946368

https://peppe8o.com/ubuntu-desktop-freezing-with-raspberry-pi-how-to-fix/

Installazione Gambas3 su OpenSuse Tumbleweed per RaspBerry Pi 4 Arm

Prerequisiti per installare Gambas3 :

Devono essere installati gli strumenti di compilazione: automake, autoconf, libtool, gcc , g++, make.

Installare git.

Creare una cartella temporanea tipo “/home/temp” e posizionarsi in essa con “cd temp”

Da terminale eseguire:

git clone –depth=1 –single-branch –branch=stable https://gitlab.com/gambas/gambas.git

per la versione officiale, se si vuole scaricare la versione di sviluppo digitare

git clone –depth=1 https://gitlab.com/gambas/gambas.git

Posizionarsi nella cartella di lavoro con:

cd gambas/ o cd gambas-stable/

Installare le dipendenze che supportano i componenti di Gambas3:

sudo zypper update -y && zypper install -y libtool gcc glew-devel gmime-devel gtk2-devel gtk3-devel libqt5-qtx11extras-devel libqt5-qtwebengine-devel libQt5Xml-devel libQt5Sql-devel libqt5-qtsvg-devel libQt5Gui-devel libQt5Core-devel libQt5Sql5-postgresql libQt5Sql5-unixODBC libQt5Sql5-mysql libQt5Sql5-sqlite webkit2gtk3-devel libICE-devel libSM-devel unixODBC-devel libzip-devel libzstd-devel libmariadb-devel gsl-devel libopenssl-devel alure-devel postgresql-devel libcurl-devel libSDL_ttf-devel libSDL_mixer-devel libSDL-devel libSDL2_ttf-devel libSDL2_mixer-devel libSDL2_image-devel libSDL2-devel libxslt-devel libv4l-devel librsvg-devel gtkglext-devel libgnome-keyring-devel libjpeg62-devel libpoppler-devel libpoppler-glib-devel imlib2-devel gmp-devel gstreamermm-devel

Al termine dell’installazione senza errori, procedere con la configurazione per la compilazione:

./reconf-all

./configure -C –disable-qt4 –disable-sqlite2 –disable-qt5webkit –disable-pdf

Al termine della configurazione si passa alla compilazione con il comando:

make

Completata la compilazione si passa alla installazione:

sudo make install

Al termine di tutte le procedure senza errori , si esegue l’ide gambas3 direttamente da terminale o dal menu applicazioni.

Buon lavoro!

Fonte :

http://gambas.sourceforge.net/en/main.html#