Skip to content

Raspberry Pi 3 model B con seriale TTL problematica #16

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
gpz500 opened this issue Jun 8, 2016 · 6 comments
Open

Raspberry Pi 3 model B con seriale TTL problematica #16

gpz500 opened this issue Jun 8, 2016 · 6 comments

Comments

@gpz500
Copy link

gpz500 commented Jun 8, 2016

Salve a tutti,
ho un problema che vorrei sottoporvi. Ho comprato dai nostri amici "dietro l'angolo" un cavo/adattatore USB-to-serial come questo: https://www.adafruit.com/products/954
È stato un ottimo affare, perché l'ho pagato una frazione del prezzo di Adafruit (€ 1,63...) e funziona egregiamente con tutti e tre i Raspberry che ho... tranne uno.
Con quello che non va, un Raspberry Pi 3 B, mi escono fuori solo caratteri senza senso. E dire che, per essere sicuro, ho utilizzato su tutti la stessa scheda SD con Raspbian. A parte questo, il Raspberry sembra funzionare come si deve, e i pin della seriale funzionano bene come GPIO. Le ho provate tutte (varie velocità, diversi pin di massa...) e comincio a sospettare un guasto hardware. Le saldature mi sembrano buone, ma non ho una grande esperienza elettronica per giudicarlo...
Avete in mente qualche prova da fare? Potrei, eventualmente, richiederne la sostituzione?
Anticipatamente grazie,
Alessandro

@kidpixo
Copy link
Collaborator

kidpixo commented Jun 9, 2016

Ciao Alessandro, il mio sospetto é che l'unico che non ti funziona é il RPi3 e che gli altri non sono modello 3, giusto?

Se é questo il caso il colpevole é la bluetooth, che é stata messa a comunicare sulla porta seriale, interferendo con chiunque altro voglia comunicare da quella parte , vedi il secondo commento qui:

the model 3B (aside from moving to systemd with Jessie) added blue tooth to the mix... which had a considerable impact on the serial port, even the naming conventions of the serial ports. Also, the model 3B (due to above) has broken baud rate on the uart (in fact the uart changed). That is the reason for the core_freq=250 and the enable_uart=1. Supposedy, the enable_uart=1 is going to do the core_freq=250 for you... but I have not seen it yet; may not be a part of apt-get update yet!

Sembra sia possibile cambiare chi utilizza la porta, pagando con un calo di prestazioni del bluetooth, vedi queste due discussioni sul forum raspberry:

Se tu vuoi usare tutte e due lo cose in contemporanea potrebbe essere un lavoraccio , sempre che sia possibile. Non avendo un RPi3 non posso assicurarti come vada a finire, prova e facci sapere!

Anche nel caso l'adattatore sia fallato, io opterei per prenderne un altro paio piuttosto che un cambio, statisticamente uno buono ci dovrebbe essere per un prezzo sempre inferiore a quelli "ufficiali".

In bocca al lupo!

@gpz500
Copy link
Author

gpz500 commented Jun 9, 2016

Esatto, è l'unico 3 del lotto e... a sentimento ci dovresti aver preso ;-)
Appena possibile faccio qualche test e vi faccio sapere.
Crepi il lupo!

@gpz500
Copy link
Author

gpz500 commented Jun 9, 2016

Era proprio quello, grazie @kidpixo! E mi sono pure fatto una cultura 😉 (leggendo anche RPi-Distro/repo#22 e raspberrypi/firmware#553 (comment)).

Versione breve

In pratica, mi è bastato aggiornare tutto (firmware compreso) con i comandi seguenti:

$ sudo apt-get update
$ sudo apt-get dist-upgrade
$ sudo apt-get install rpi-update
$ sudo rpi-update

, abilitare la console su seriale con raspi-config -> Advanced Options -> Serial, e riavviare.
Corrisponde alla soluzione 2 della versione lunga qui sotto, quindi si mantiene anche il Bluetooth. Credo che l'immagine di Raspbian più recente sia già a posto... la mia era un po' vecchiotta.

Versione lunga

Dentro ai SOC BCM283x ci sono due controller UART:

  • UART0, quello buono, più performante e - soprattutto - con clock proprio (e, quindi, indipendente dalla frequenza del core)
  • UART1, aka miniUART, quello sgrauso, con buffer e funzionalità ridotte e - soprattutto - senza generatore di clock indipendente (e, quindi, dipendente dalla frequenza del core)

Di default, nei Rapsberry Pi <= 2 i pin TX (8) e RX (10) sono collegati alla UART0 (mentre la UART1 rimane scollegata) e tutte le applicazioni che usano la seriale vanno lisce come l'olio.

Nel Raspberry Pi 3, sempre di default, la UART0 (proprio perché più performante) è utilizzata con il modulo Bluetooth, mentre ai pin TX e RX c'è collegata la UART1. Ora, essendo il clock della UART1 derivato dal core clock, ogni variazione di frequenza del core clock si ripercuote sulla velocità della seriale, rendendo praticamente impossibile comunicare attraverso di essa: a quanto pare la frequenza del core clock varia di continuo e in modo imprevedibile (questo è il mio caso).

Come si può risolvere?

  1. Se si può fare a meno del Bluetooth si possono rimappare i pin TX e RX sulla UART0 (collegando il Bluetooth allo UART1, oppure disabilitandolo proprio) e ci si porta nella stessa condizione del RPi 2 e precedenti. Per fare questo serve uno specifico file overlay di device tree.
  2. Se, invece, al Bluetooth non si vuole rinunciare, allora si può forzare la frequenza del core ad un valore fisso (non importa quale sia: l'importante è che sia fisso, perché la UART1 imposta la velocità della seriale come frequenza del core moltiplicata per un fattore di scala che viene determinato solamente all'inizio; se, successivamente, la frequenza del core varia, allora tutto va a pallino). È meglio metterla, per prudenza, al minimo possibile ossia 250 MHz, ma se il carico sulla CPU è basso e/o il RPi è ben ventilato si può anche impostarlo a valori più alti, fino al massimo di 400 MHz.
    Con l'ultima versione del firmware e l'ultima versione di raspi-config tutto ciò può essere fatto molto semplicemente: se da raspi-config si abilita la console sulla seriale, allora viene aggiunta la linea enable_uart=1 al file /boot/config.txt; e, se al boot il nuovo firmware trova enable_uart=1, allora forza la frequenza di core a 250 MHz oppure, ma solo se force_turbo=1, a 400 MHz.

@gpz500 gpz500 changed the title Raspberry con seriale TTL (forse) guasta Raspberry Pi 3 model B con seriale TTL problematica Jun 9, 2016
@gpz500
Copy link
Author

gpz500 commented Jun 9, 2016

PS: ho aggiornato il titolo per essere più fedele al problema.

@kidpixo
Copy link
Collaborator

kidpixo commented Jun 9, 2016

Fantastico, hai risolto il problema è l'hai documentato come si deve!
Rimarrà qui a imperitura memoria per tutti!

@teokino
Copy link

teokino commented Apr 11, 2018

@gpz500 Ciao! Sono in possesso di un RPi 3 Model B + e nonostante sia una settima che ci provi, rimangono dei seri problemi a far funzionare un sensore che comunica con la seriale.
Evitando di ripubblicare il mio lungo post, ho aperto un thread qui

https://www.raspberrypi.org/forums/viewtopic.php?f=32&t=210647&sid=9cbc44e0bbfe78b718847b2e7589ddb8

Dato che sei riuscito a farlo funzionare hai qualche suggerimento da darmi? Grazie

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants