• Benvenuti su RaspberryItaly!
Benvenuto ospite! Login Login con Facebook Registrati Login with Facebook


Valutazione discussione:
  • 0 voto(i) - 0 media
  • 1
  • 2
  • 3
  • 4
  • 5

[-]
Tags
programma su non ma gira rpi4 rpi5 che

Programma che gira su RPI4 ma non su RPI5
#1
Dal manulale "Getting started with raspberry" di Matt Richardson 2012 ho preso questo programma
                                                           
                                                   WEBLAMP.PY

import RPi.GPIO as GPIO
from flask import Flask, render_template, request
app = Flask(__name__)

GPIO.setmode(GPIO.BCM)

pins = {
  24 : {'name' : 'coffee maker', 'state' : GPIO.LOW},
  25 : {'name' : 'lamp', 'state' : GPIO.LOW}
  }

for pin in pins:
  GPIO.setup(pin, GPIO.OUT)
  GPIO.output(pin, GPIO.LOW)

@app.route("/")
def main():
  for pin in pins:
      pins[pin]['state'] = GPIO.input(pin)
  templateData = {
      'pins' : pins
      }
  return render_template('main.html', **templateData)

@app.route("/<changePin>/<action>")
def action(changePin, action):
  changePin = int(changePin)
  deviceName = pins[changePin]['name']
  if action == "on":
      GPIO.output(changePin, GPIO.HIGH)
      message = "Turned " + deviceName + " on."
  if action == "off":
      GPIO.output(changePin, GPIO.LOW)
      message = "Turned " + deviceName + " off."
  if action == "toggle":
      GPIO.output(changePin, not GPIO.input(changePin))
      message = "Toggled " + deviceName + "."

  for pin in pins:
      pins[pin]['state'] = GPIO.input(pin)

  templateData = {
      'message' : message,
      'pins' : pins
  }

  return render_template('main.html', **templateData)

if __name__ == "__main__":
  app.run(host='192.168.1.101', port=80, debug=True)


Che va messo in una directory assieme alla directory "templates" contenente questo programma:

                                                    MAIN.HTML

<!DOCTYPE html>
<head>
<title>Current Status</title>
</head>

<body>
<h1>Device Listing and Status</h1>

{% for pin in pins %}
<p>The {{ pins[pin].name }}
{%if pins[pin].state == true %}
is currently on (<a href="/{{pin}}/off">turn off</a>)
{% else %}
is currently off (<a href="/{{pin}}/on">turn on</a>)
{% endif %}
</p>
{% endfor %}

{% if message %}
<h2>{{ message }}</h2>
{% endif %}

</body>
</html>

Consente di pilotare,da un altro PC,alcune uscite,tramite browser,chiamando l'indirizzo IP del raspberry.
Su un raspberry PI 4 (Debian versione 11,release may 2023 64 bit,kernel6.1  Python 3.11.2) funziona,ma su un rsapberry PI5
(Debian 12 bookworm Nov 2024 64 bit kernel 6.6  python 3.9.2)da sempre,al lancio,:

lgpio.error "GPIO not allocated"

Cosa puo' essere ?
Ho notato che eliminando le ultime 3 righe di weblamp.py il programma termina subito,senza dare errore.
Risposta
#2
girano ancora questi esempi con RPi.GPIO ?
E' una libreria per il controllo del GPIO che risale alle prime versioni di Raspberry Pi, oramai decisamente obsoleta.
Come già accenntao in altra risposta, Raspberry Pi 5 controlla il GPIO e input e output tramite un chip custom dedicato (RP1) e queste librerie , con questo hardware, non possono funzionare.

GPIOZERO è la libreria di riferimento già da una decina d'anni. molto più semplice e intuitiva da utilizzare, supporta anche Raspberry Pi 5

LGPIO è la nuova libreria ufficiale per i sistemi operativi attuali (da Bookworm in poi). È nata per interfacciarsi con i nuovi hardware. (è pre-imstallata)

Quindi devi riscrivere tutti i vecchi esempi?
No: esiste anche una libreria pensata per questi casi: Raspberry Pi 5, ma codice scritto con le vecchie (vecchissime) librerie : si chiama rpi-lgpio, e traduce le chiamate RPi.GPIO affinché funzionino con il nuovo sistema.

per installarla, da un Terminale, scrivi:
Codice:
sudo apt update
sudo apt remove python3-rpi.gpio
sudo apt install python3-rpi-lgpio

Questo servirà a far funzionare i vecchi script, ma se lo scopo è imparare, ti consiglierei senza dubbio di imparare a usare gpiozero o lgpio, che sono anche molto, molto più intuitive. (Tra l'altro gpiozero dispone nativamente anche di una funzione remote GPIO, per comandare il GPIO di un altro Raspberry Pi remoto invece di quello in cui fisicamente gira il programma, volendo).

Ad esempio, per accendere un LED collegato al GPIO 2,
con RPi.GPIO devi scrivere:
Codice:
import RPi.GPIO as GPIO          # importi la libreria

GPIO.setmode(GPIO.BCM)        # imposti la numerazione dei pin come numero GPIO
GPIO.setwarnings(False)          # disabilita gli avvisi (ad esempio se il pin era già in stato diverso da una precedente esecuzione

GPIO.setup(2, GPIO.OUT)       # imposta il pin 2 come uscita

GPIO.output(2, GPIO.HIGH)    # imposta il livello del pin 2 come alto (accendendo il LED)

mentre con gpiozero si fa con:
Codice:
from gpiozero import LED      # da gpiozero importo la parte che mi serve - LED

led = LED(2)                        # gli dico che il LED è sul pin GPIO2

led.on()                               # accendi il LED

Edit bay Zzed:corretto qualche refuso. Con i nomi delle librerie tutti molto simili, ci si può confondere
Risposta
#3
Grazie.
Risposta
#4
Sono andato nel sito iGPIO e ho notato che l'esempio che propone per fare blink su un led e ' obsoleto,e produce i solito errore:"Gpio not allocated"
Il sitema e' ancora attivo ?
E se e' attivo,e' gratuito ?
Risposta
#5
forse ho creato confusione tra lgpio e igpio, nel caso, colpa mia.
i nomi sono tutti molto simili, la " L" minuscla appare come " I " maiuscola e lo sbaglio è dietro l'angolo.

per questo ho pensato di unire il tuo post a questa discussione

facciamo il punto, a beneficio di tutti.
  • RPi.GPIO = vecchia libreria per i GPIO non supportata da Raspberry Pi 5, sarebbe meglio dimenticarla
  • WiringPi e altre = uguale, vecchie librerie per i GPIO, deprecate
  • gpiozero = libreria ad alto livello, compatibile anche con Raspberry Pi 5 che permette di usare i GPIO senza pensare per forza a tutti i dettagli tecnici. documentazione e esempi
  • lgpio = soluzione ufficiale di Raspberry Pi per usare i GPIO, anche su Raspberry Pi 5 documentazione ufficiale e qui gli esempi
  • rpi-lgpio = libreria di compatibilità, che permette (non la ho mai provata) di far girare i programmi scritti con chiamate Rpi.GPIO anche su Raspberry Pi 5 (vedi su come installarla)

poi, vuole il caso che esiste anche il sito iGPIO , quello che hai trovato tu, che non è una libreria python, ma se non ho capito male è un sistema (occorre registrarsi ma pare gratuito) che espone i pin GPIO sul web in modo sicuro, usando una interfaccia per il browser, e undispositivo remoto, essi "dialogano" tramite il loro server.
l'esempio che citi, riportato sul loro sito, usa sempre RPi.GPIO è quindi normale che non funzioni su Raspberry Pi 5


Io, non possiedo Raspberry Pi 5, non ho mai usato rpi-lgpio o lgpio, ma più o meno tutta la community si è chiesta come mai la Fondazione Raspberry Pi abbia scelto questa invece dello standard de facto degli ultimi anni: gpiozero.
inoltre non ha ancora pubblicato gli esempi e i tutorial per ragazzi che mostrano come utilizzare questa libreria... anzi, quelli presenti, usano gpiozero (esempio)
gpiozero è senza dubbio la mia preferita e la ritengo perfetta per imparare.
La documentazione di lgpio la trovo confusa e poco pratica, mentre quella di gpiozero per ogni funzione, riporta un esempio, e la sintassi è molto più "logica".
Come accennato su, gpiozero è una libreria ad alto livello, fatta per essere facile da usare e "sotto il cofano" può usare altre librerie per comandare il GPIO, lasciando alla libreria il "lavoro sporco" di utilizzarle.
Questo gli permette anche, cambiando la librerie sottostante, di usare GPIO remoti. gpiozero: configurazione GPIO remoti mentre qui puoi trovare degli esempi con l'uso di GPIO remoti anche se, prima di lanciarsi sui GPIO remoti, consiglio di imparare le funzioni base di gpiozero
Risposta
  


Vai al forum:


Navigazione: 3 Ospite(i)
Forum con nuovi Post
Forum senza nuovi post
Forum bloccato
Forum Redirect