Newsgroup: it.comp.os.linux.iniziare
Titolo: raspberry, python, thonny, motori LEGO.

 
sto testando una scheda ufficiale di controllo dei motori LEGO chiamata
"BuildHAT", che si monta a piggyback su un raspberry e viene
programmata in python. Per comodita' faccio invocare python dall'
IDE grafico "thonny".
 
il programma importa la libreria "motor" e poi ripete a oltranza
[while(True):] alcuni comandi tipo 
 
                motor_a.run_per_second(x) 
                POSA = motor_a.get_aposition()
                Print(miocontatore, POSA)
 
A un certo punto, che varia da qualche centinaio a qualche migliaio
di cicli, i motori si fermano, lo schermo smette di stampare e non
produce nessun mssaggio di errore.
 
Funziona il pulsante rosso "stop/restart backend".
 
Come faccio a capire dove e perche' si freezza? 
 
 
 
-- 
"Le Mondine" Fan Club
 
 


E molto probabile che piu` OT di cosi`
ci possa essere solo una richiesta
riguardo una ricetta di cucina.
 
Forse sarebbe meglio chiedere su un
gruppo RPi o Python, qui mi sembra
un pochetto fuori luogo.
 
Fermo restando che qualcuno potrebbe
anche avere delle risposte valide.
 
bye,
 
-- 
 
piergiorgio

 Fermo restando che qualcuno potrebbe
 
No ma hai ragione, non era il posto giusto.
 
Il problema e' cmq nella libreria motor, evitando di chiamarla python e
IDE non freezano.


 simili.
 
Purtroppo mi sa che ti devi ridurre a chiedere al NG inglese di
raspberry
comp.sys.raspberry-pi
mi sembra sempre abbastanza attivo
(oramai in italiano si trovano pochissimi gruppi
frequentati...)
 
Ciao!
-- 
Tilt
 

 IDE non freezano.
 
Per prima cosa io chiamerei il programma
da console e non da IDE.
Ho brutte esperienze al riguardo.
 
Secondo, esistono debugger per Python,
potresti vedere cosa succede usando quelli.
 
Terzo, sei sicuro che il codice sia corretto?
Cioe` che si possa chiamare in un loop?
 
Magari c'e` un qualche memory leak, oppure il
GC di Python ha qualche idiosincrasia.
 
bye,
 
-- 
 
piergiorgio

 GC di Python ha qualche idiosincrasia.
 
Penso che magari sia un problema hardware della scheda di controllo
"BuildHat", dovrei studiarmi la libreria "motor", ma al presente non
sono in grado.


 sono in grado.
 
Puo` anche essere.
 
Metti un print qualcosa tra ogni comando
(debug dei poveri) e vedi se si ferma ogni
volta esattamente allo stesso punto:
 
Tipo:
 
while true:
   print("motor run")
   motor.run
   print("get pos")
   motor.get_pos
   print("print")
   Print(...)
 
Se ogni volta si ferma allo stesso punto,
allora potresti avere un indizio.
Magari se e` "get_pos" potresti provare a
commentare e vedere se cambia qualcosa.
 
bye,
 
-- 
 
piergiorgio

 O dove si trova l'interprete: which python
 
Ma questo universale, senza bisogno di cercare niente:
#!/usr/bin/env python programma.py
 
non me l'avevi consigliato tu? voglio dire: in questo caso ci sono
controindicazioni? ciao
 
-- 
Yoda
 

 allora potresti avere un indizio.
 
Si puo' provare, adesso stampo le posizioni al termine di ogni
ciclo.


 controindicazioni? ciao
 
No e no... :-)
 
Non mi pare di averla consigliata io e
no, non credo vi siano controindicazioni.
 
bye,
 
-- 
 
piergiorgio

 modestamente ce l'ho aggiunto io.
 
Forse la libreria non e` proprio cosi`
ben fatta e magari serve qualcosa come
un "sleep()" nel ciclo.
Puo` essere che due comandi consecutivi
arrivino al hat troppo rapidamente.
Il che non e` prevedibile, magari c'e`
un overflow, ma sulla parte di controllo,
non sul SW che gira sul RPi.
 
bye,
 
-- 
 
piergiorgio

 altra cartella. Da IDE va.
 
devi installare il modulo.
 
sudo pip3 install buildhat
 
poi controlla quale versione di python lanci, nel dubbio python3.
poi anche leggere un po' di documentazione non farebbe male, visto che 
stai smanettando e, immagino, cercando di imparare qualcosa.

 che stai smanettando e, immagino, cercando di imparare qualcosa.
 
https://buildhat.readthedocs.io/en/latest/buildhat/index.html
 
 
e' un work in progress


 con  "python mioprog.py", il python nudo non lo vede e da' errore.
 
Perche` thonny lo ha installato nel suo ambiente
personale e non nel sistema.
Da linea di comando, python cerca nel sistema e
non chissadove thonny ha installato il modulo.
 
Dovresti separare un po' i problemi, altrimenti
c'e` il rischio di fare confusione.
 
bye,
 
-- 
 
piergiorgio

 e' un work in progress
 
per carità. se però navighi più a fondo trovi quello che ti serve per 
cominciare:
 
https://www.raspberrypi.com/documentation/accessories/build-hat.html
 
 
e visto che devi fare delle prime prove, lascia stare l'ide che ti 
nasconde tutta una serie di cose. visto che devi editare un solo file 
comincia con un editor di testo, l'ide lo vedrai dopo quando avrai preso 
un minimo di confidenza con l'ambiente python e vorrai fare progetti più 
complessi.

 si comportano.
 
Dopo 4 ore e 2900 cicli si e' piantato lo stesso. 
 
Ma secondo me python in se' non c'entra niente, il problema e' di
basso livello, la libreria che viene importata dall'interprete e che fa
da driver fra hardware e linguaggio, in che lingua e'
sviluppata? 



sempre python
https://github.com/RaspberryPiFoundation/python-build-hat
 

 ho una versione sola
 
Ho sbagliato, ci sono due versioni coesistenti 2 e 3.
 
Credo che il 2 sia quello della distribuzione, mentre il 3 e'
stato installato da me seguendo le istruzioni del sito ufficiale.
 
La libreria buildhat era associata alla versione 3, invocando
da terminale  "python3 miofile.py" funziona.
 
da CLI invocavo python-e-basta che era un alias per python2 e dava
errore.
 
Adesso tocca studiare come fare per spianare tutto e lasciarne uno
solo.



non è necessario, su tutti i miei sistemi coesistono senza problemi.

 volta esattamente allo stesso punto:
 
Ho fatto cosi', a ogni chiamata alla classe motore ho messo un print.
si e' piantato random una volte sul run A, una volta sul run B
e la terza volta leggendo la posizione, e sempre con nessun errore
dell'interprete di alto livello. C'e' un forum dedicata agli HAT,
sentiro' li'. Nella HAT c'e' il nuovo processore "proprietario"
sviluppato da quelli del raspberry, RP2040 (raspberry pi pico).
 
Peraltro data una sequenza di comandi, l'interprete non aspetta il
completamento del comando precedente prima di lanciare quello
successivo. Per esempio data la sequenza 
 
leggi la posizione; stampa "posizione iniziale"
attiva il motore due secondi; stampa "ho azionato il motore"
leggi la posizione; stampa "posizione finale"
 
nell'output vedo che "posizione inziale" e "posizione finale" sono
sempre uguali. 
 
Questo mi ricorda il comportamento del VBA, in cui non c'era garanzia
che gli eventi associati a una maschera (bottoni, click ecc.)
seguissero la sequenza nel codice, tant'e' vero che se volevi
una certa sequenza dovevi usare il comando DoEvents. 
 
Mo' vado a vedere se c'e' qualcosa del genere in python...


 Mo' vado a vedere se c'e' qualcosa del genere in python...
 
Non dipende da python, ma dalla libreria
che stai usando.
Quella deve supportare la cosa, il linguaggio
non c'entra, in questo caso.
 
bye,
 
-- 
 
piergiorgio

 Come faccio a capire dove e perche' si freezza? 
 
Epilogo: era un problema hardware di uno dei due motori.
 
Installando i motori su un veicolo, ogni tanto anche il
veicolo "impazziva". Cambiando in sequenza i motori con quelli quello di
un altro modello il programma non si e' piu' bloccato.
 
I motori Lego sono dei motorini a spazzola normali, ma con in piu' un
encoder che viene "letto" dalla scheda di controllo HAT e dal c.d.
"hub" bluetooth Lego.
 
In realta' ho anche cambiato l'alimentatore mettendone una da banco
invece di quello "a spina", ma visto che l'insieme di raspberry+HAT+2
motori l'assorbimento era 300-350 mA, assolvo l'alimentazione, diciamo,
per insufficienza di prove.
 
Conclusione: i Lego restano giocattoli.
