[RISOLTO] Ubuntu programmazione Arduino "Non risponde"

Ciao a tutti!
Mi avvicino a questo mondo da poco con molte soddisfazioni tra l'altro!
Solo un piccolo problema nel quale mi sono incaponito più per altro per sfizio visto che ho comunque soluzioni alternative!

Non riesco a far correttamente scrivere il mio Uno R3 (CH340B) con Ubuntu 16.04!
Stesso Arduino su un paio di PC con Windows 7 non ha problemi di comunicazione e scrittura... ma che sia proprio il mio inossidabile Linux a capitolare mi scoccia alquanto!

Premesso che il driver USB è nativo, la porta è correttamente riconosciuta, è abilitata alla scrittura, ecc.
con lsusb -t vedo l'hub e l' arduino collegato alla porta
anche dmesg evidenzia il corretto collegamento della periferica /dev/ttyUSB0 ! :confused:

Quando lancio la scrittura si nota anche il led fare cinque rapidi lampeggi, poi TX e RX fanno alcuni flash poi passano alcuni secondi e in corrispondenza dell'errore il led TX lampeggiare brevemente all'arrivo dei dieci tentativi di scrittura.

Cortocircuitando il pin 0 con 1 si nota che anche il led RX lampeggia se mando una stringa da Monitor seriale...

Insomma non sono un esperto ma di primo acchito non mi pare che ci siano particolari problemi Hardware lato PC.... ciononostante lanciata la scrittura l'errore che apare è:

avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x00
...
avrdude: stk500_getsync() attempt 10 of 10: not in sync: resp=0x00
Problema di caricamento sulla scheda. Guarda http://www.arduino.cc/en/Guide/Troubleshooting#upload per suggerimenti

Possibile che si tratti di una incompatibilità nella velocità di comunicazione?
con lsusb dice:
/: Bus 03.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/14p, 480M
|__ Port 3: Dev 5, If 0, Class=Vendor Specific Class, Driver=ch341, 12M

12Mbit/s non sono poi un'eresia!

(Scusate, non so se la sessione Hw sia quella più corretta)

Grazie per eventuali suggerimenti!

Orfmia

Mi rispondo da solo!
Il problema era il drive "Nativo" di Ubuntu 16.04!

  1. verificate il CIP di comunicazione seriale di Arduino Clone se è un CH340B, G o CH341

  2. verificate con lsusb -t la porta nella quale inserite Arduino viene riconosciuta correttamente e se il drive è corretto

Nel mio caso la porta era corretta ma il drive appariva come: Driver=ch341,

Questo Drive di Linux Non è perfettamente compatibile con il cip CH340B

è necessario scaricare i drive http://www.wch.cn/download/CH341SER_LINUX_ZIP.html
scompattarli su una cartlla qualsiasi e seguendo le istruzioni del readme:
#sudo make
#sudo make load

così facendo con lsusb -t il driver della porta alla quale avrete collegato Arduino apparirà un generico Driver=ch34x
Compatibile quindi con il cip incriminato.

Sperando di essere stato utile a qualcuno...
Notte!

Grazie. Sempre utile condividere con la comunità le proprie esperienze.
:slight_smile:

Torno sull'argomento perché al riavvio del sistema torna a presentarsi l'errore e viene nuovamente caricato il driver sbagliato :-(:

  Port 13: Dev 4, If 0, Class=Vendor Specific Class, Driver=ch341, 12M

sono quindi costretto sistematicamente a rimuovere il driver CH341 e mettere CH34x con:

# sudo rmmod ch341.ko 
# sudo insmod /home/..path.../Arduino/ch34x.ko

in questo modo torna a funzionare:

Port 13: Dev 5, If 0, Class=Vendor Specific Class, Driver=ch34x, 12M

Vi chiedo se conoscete un modo per evitare di fare ogni volta questi due comandi!

(mi pareva esistesse un modo per associare un driver al VID/PID della schedina ma non ricordo più dove l'ho letto!)

Grazie!

Devi blacklistare il modulo. Ora, su Ubuntu non sono sicuro di come si faccia, ma prova a creare un file con un nome tipo ch341.conf (va bene tutto purché finisca in .conf) in /etc/modprobe.d e scrivici dentro:

blacklist ch341

Se /etc/modprobe.d non esiste, devi capire come si blacklista un modulo su Ubuntu.

Vi chiedo se conoscete un modo per evitare di fare ogni volta questi due comandi!

(mi pareva esistesse un modo per associare un driver al VID/PID della schedina ma non ricordo più dove l'ho letto!)

Grazie!

Forse al tempo hai letto qualcosa su UDEV, purtroppo (anche se è un bene) UDEV è stato integrato in systemd (demone di sistema) ed è lui che carica scarica, rileva eventi del kernel ecc. Purtroppo non so darti info dettagliate perché non ho più seguito lo sviluppo di GNU.

Io proverei il suggerimento di Sukko, inoltre ti suggerisco di iscriverti al forum di Ubuntu e quando ne viene a capo, illuminaci.

Ciao.

Grazie ad entrambi
Seguirò i vostri suggerimenti e posterò i risultati qui :slight_smile:

SukkoPera:
Devi blacklistare il modulo. Ora, su Ubuntu non sono sicuro di come si faccia, ma prova a creare un file con un nome tipo ch341.conf (va bene tutto purché finisca in .conf) in /etc/modprobe.d e scrivici dentro:

blacklist ch341.ko

Se /etc/modprobe.d non esiste, devi capire come si blacklista un modulo su Ubuntu.

/etc/modprobe.d c'è in ubuntu :slight_smile: e contiene molti altri file blacklist,
Ho seguito le tue istruzioni anche omettendo l'estensione .ro del modulo ma però purtroppo questa strada non funziona, ch341 continua ad risorgere dalle ceneri come l'araba fenice!

Sul forum di ubuntu mi hanno suggerito di creare una regola udev che esegua i due comandi rmmod /insmod all'inserimento della periferica.
Provo a capire ma non mi sembra tanto più "elegante" di un batch da anteporre al lancio di Arduino :frowning:

Effettivamente l'estensione .ko non ci vuole, non so perché l'ho messa. Hai riavviato dopo aver inserito il file in /etc/modprobe.d?

Già, avevo riavviato CON .ro
Nuovamente riavviato senza .ro il blacklist funziona!
però non carica automaticamente il drive ch34x :frowning:

il solito lsusb -t mi restituisce una periferica priva di drive (non riconosciuta)

Port 7: Dev 4, If 0, Class=Vendor Specific Class, Driver=, 12M

Il peggio è che se cerco di inserirci il modulo corretto con il 341 in blacklist mi da errore:

# sudo insmod ch34x.ko 
insmod: ERROR: could not insert module ch34x.ko: Unknown symbol in module

quindi ho rimosso il file .cfg da /etc/modeprob.d
al riavvio mi è tornato il drive sbagliato ch341

Mi sono fatto alloro una bella shell che mi lancia i due comandi malefici e poi Arduino:

#!/usr/bin/env bash
gksudo rmmod ch341.ko 
sleep 1s
gksudo insmod /home/...path ... /Arduino/Programmi/CH341SER_LINUX/ch34x.ko
sleep 2s
/home/s... path ...Arduino/arduino-1.8.1/arduino

al diavolo l'eleganza... :slight_smile: sarà per un'altra volta!

Grazie! per l'aiuto!

Ma no, aspetta, non hai installato il nuovo modulo, per cui il sistema non sa caricarne le dipendenze! Devi mettere ch34x.ko da qualche parte insieme agli altri moduli, tipo in /lib/modules/<versione_kernel>/kernel/drivers/usb/serial (forse c'è un make install che lo fa da sé), quindi lancia:

depmod -a

A questo punto dovresti essere a posto.

Fai un bel: ls /lib/udev/rules.d

Su Fedora si notano subito questi due file: 77-mm-usb-serial-adapters-greylist.rules, 77-mm-usb-device-blacklist.rules.
Inoltre si nota anche 99-systemd.rules, ora per essere coerenti non si dovrebbe aggiungere nulla manualmente qui per evitare di incasinare tutto dopo aggiornamenti, pertanto credo che le regole di udev aggiuntive vadano messe sotto:
/etc/udev/rules.d.

Guarda le regole già presenti c'è ne deve essere una per il device in questione, vedi come è scritta e ne crei una nuova sotto /etc/udev/rules.d

al diavolo l'eleganza... :slight_smile: sarà per un'altra volta!

Si in effetti a parte l'eleganza la soluzione è ottima.

Ma no, aspetta, non hai installato il nuovo modulo, per cui il sistema non sa caricarne le dipendenze! Devi mettere ch34x.ko da qualche parte insieme agli altri moduli, tipo in /lib/modules/<versione_kernel>/kernel/drivers/usb/serial (forse c'è un make install che lo fa da sé), quindi lancia:

Bella questa, davo per scontato l'avesse fatto, non mi sembra un principiante unix.

A propos Sukko tu su che distro sei?

Ciao.

Slackware :).

Cacchio non trovavo i moduli del kernel, poi ho dato una ls su /lib/modules/<versione_kernel>/kernel/drivers/usb/serial come hai detto tu e c'è l'ho anche io quel modulo ch341.ko.xz ora c'è da vedere la regola udev che su intervento degli eventi rilevati da systemd avvia poi il modulo.

Qual'è il VID/PID del ch341? e qual'è quello del ch34x.ko?

C'è un file di testo con la lista di tutti i VID/PID ma non ricordo in quale percorso si trova, sukko ne sai qualcosa.

Slackware :).

Sempre senza package manager (tipo yum di fedora), oppure opzionalmente è possibile installarne uno?
Le ho provate tutte le principali ma il primo amore non si scorda mai. :slight_smile: In realtà sono rimasto con Fedora per gli rpm che avevo studiato e me li creavo io al tempo, ora non saprei dove mettere le mani per creare un rpm. :frowning:

Ciao.

Mah, io non smanetterei più di tanto con udev, alla fine l'hardware già lo vede e il modulo già lo carica. È quello sbagliato, ma è una cosa relativamente comune a cui la soluzione più semplice è quella di spiegargli che quel modulo non va bene e che deve usarne un altro, a patto di installarlo correttamente. Tutto ciò si fa comodamente da modprobe.d.

Slackware ha sempre avuto un Package Manager, quel che non aveva (e non ha tuttora) è la gestione delle dipendenze tra i pacchetti, ma chi usa Slackware probabilmente lo fa proprio anche per questo motivo. Insomma, decido IO cosa c'è sul mio sistema e cosa no! Di pacchetti io ne produco un'infinità, vedi sul mio github ;).

SukkoPera:
Ma no, aspetta, non hai installato il nuovo modulo, per cui il sistema non sa caricarne le dipendenze! Devi mettere ch34x.ko da qualche parte insieme agli altri moduli, tipo in /lib/modules/<versione_kernel>/kernel/drivers/usb/serial (forse c'è un make install che lo fa da sé), quindi lancia:

depmod -a

A questo punto dovresti essere a posto.

Premesso che come giustamente dici non sono certo un esperto di Linux... (innamorato sì, da 18 anni ho solo Ubuntu ma abbastanza "nubbio")

il "make install" c'è nel driver e l'ho più volte lanciato.
Tuttavia se non carico il modulo ch341 (sbagliato) prima, quando provo a caricare quello giusto ch340x mi da errore: "Unknown symbol in module"

questa sera provo con con i vostri preziosi suggerimenti e vi faccio sapere :slight_smile:
Grazie!

Questo perché non hai aggiornato la cache delle dipendenze. depmod fa appunto ciò.

Poi il modulo dovrebbe caricarsi automaticamente, ma se vuoi caricarlo manualmente usa modprobe, non insmod.

Riassumo a memoria MIA e di qualche altro scellerato che vuole risparmiare 20€ acquistando un Arduino Cinese :frowning:

  1. nella directory /etc/modprobe.d creare un file blacklist-ch341.conf

sudo gedit blacklist-ch341.conf

contenete il drive da mettere in Blacklist:

# rimozione drive farlocco per cip seriale ch341 di Arduino by Bepi 27/02/2016
# vedi http://forum.arduino.cc/index.php?topic=457715.0
blacklist ch341
  1. Tento l'installazione del nuovo driver ch34x con i comandi
    a) #sudo make
    mi da come output a Terminal:
make -C /lib/modules/4.4.0-64-generic/build  M=/archivio/Orfmia/Arduino/Programmi/CH341SER_LINUX 
make[1]: ingresso nella directory "/usr/src/linux-headers-4.4.0-64-generic"
  Building modules, stage 2.
  MODPOST 1 modules
make[1]: uscita dalla directory "/usr/src/linux-headers-4.4.0-64-generic"

poi
#sudo make install
mi da come output a Terminal:

modprobe usbserial
insmod ch34x.ko

fatto tutto ciò pare funzioni solo nella sessione di lavoro attiva ma spegnendo e riaccendendo non trova il drive corretto quindi:

  1. verificare che nella directory /lib/modules/4.4.0-64-generic/kernel/drivers/usb/serial/
    sia presente il file ch34x
    (Occhio usare il Kernel attivo non come ho fatto io una copia vecchia!)

il risultato è che probabilmente trova solo il file vecchio driver:

#ls /lib/modules/4.4.0-64-generic/kernel/drivers/usb/serial/ch*
/lib/modules/4.4.0-64-generic/kernel/drivers/usb/serial/ch341.ko

il che conferma la teoria che l'installazione del drive è farlocca!

poco male SukkoPera insegna che certe cose si possono fare lo stesso :slight_smile:
Carichiamo a mano il modulo ch34x.ro

  1. Copiare il file ch34x.ro nella directory sotto riportata facendo attenzione sempre al Kernel attivo!
#sudo cp /home/... path .../Arduino/Programmi/CH341SER_LINUX/ch34x.ko /lib/modules/4.4.0-64-generic/kernel/drivers/usb/serial/ch34x.ko

Ora c'è per forza ed è in compagnia del vecchio!

#ls -l /lib/modules/4.4.0-64-generic/kernel/drivers/usb/serial/ch*
-rw-r--r-- 1 root root 20726 feb 20 14:41 /lib/modules/4.4.0-64-generic/kernel/drivers/usb/serial/ch341.ko
-rw-r--r-- 1 root root 20368 feb 28 22:46 /lib/modules/4.4.0-64-generic/kernel/drivers/usb/serial/ch34x.ko

ora aggiorniamo le dipendenze (come se sapessi cosa sto facendo! :-))

# sudo depmod -a

Riavvio... e

Port 7: Dev 4, If 0, Class=Vendor Specific Class, Driver=ch34x, 12M

FUNZIONA!

un sincero grazie a SukkoPera e MauroTec per le dritte!

Ora funziona in modo Elegante (basta ricordarsi di rifarlo quando Ubuntu cambia il Kernel ... :-(!

Grande ;).

Riassumo a memoria MIA e di qualche altro scellerato che vuole risparmiare 20€ acquistando un Arduino Cinese :frowning:

Appunto :wink: , solo che con 20 € ci porta al cinema la fidanzata, comunque alla fine ti è andata bene che la scheda funziona (almeno finora). :smiling_imp:

Premesso che come giustamente dici non sono certo un esperto di Linux... (innamorato sì, da 18 anni ho solo Ubuntu ma abbastanza "nubbio")

Vabbe dai, questa è un procedura advanced per gli utenti Ubuntu, per quelli slackware invece è l'abc. Eventualmente volessi approfondire sappi che ubuntu è una Debian con i brillantini, per cui molte cose base li puoi studiare sul sito di Debian.

Alcuni link interessanti:

https://www.debian.org/doc/index.it.html

Ciao.