Raspberry Pi e Arduino: script per identificare automaticamente a che porta USB si collega Arduino…

Primo post serio nella categoria “Maker”.

Immaginiamo di dover/voler collegare un raspy (Raspberry Pi, raspy solo per gli amici..) e un arduino con un cavo USB che con lo stesso riusciamo cosi a creare un collegamento seriale tra i 2 e anche ad alimentare arduino. Io lo faccio spesso, l’istinto di conservazione mi porta a pensare che il raspy sia il cervello e arduino il braccio, e che quindi sia più sacrificabile. In realtà è vero, durante i miei esperimenti posso anche sbagliare la polarità quando faccio collegamenti “volanti” che non succede niente (don’t try this at home…)

Fisicamente il collegamento è semplice, come descritto nella foto qui sotto gentilmente concessa da Instructables (il PornHub per i Maker)…

Risultato immagini per raspy arduino usb

Ora, se noi volessimo poter inviare e ricevere dati da e verso arduino, dovemmo sapere a quale delle 4 porte lo stesso è collegato.

Ci sono molti metodi per verificare quale porta USB è connessa con arduino, la si potrebbe vedere anche dalla IDE di Arduino (sempre se arduino è connesso al raspy da dove aprite la IDE), oppure da terminale inserendo un primo comando senza arduino collegato:

ls /dev/tty*

E poi collegando arduino, ridare lo stesso comando e vedere il nuovo nome nella schermata del terminale. Quello sarà il nome della porta. Normalmente il nome è simile a /dev/ttyACM0 (cambia l’ultimo numero di solito).

C’è un però… Se fate delle prove di funzionamento (o di debugging, se volete sentirvi fighi) capiterà di dover scollegare più volte arduino dal raspy e magari non ricollegarlo sempre alla stessa porta (parlo per esperienza).

Quindi, senza dover fare ogni volta questa trafila, e riportare il nome della porta nello script in python, io ho risolto modificando uno script che avevo trovato in rete per un server Debian (grazie Stack Overflow). Lo script l’ho creato su un file diverso (indovinate come lo ho chiamato: trovaportaseriale.py) che poi verrà richiamato come funzione funzione dallo script principale. Lo script per individuare la porta è questo:

 # -*- coding: utf-8 -*-
#!usr/bin/env python3
import serial
import sys
import glob

#('/dev/tty[A-Za-z]*') per trovare tutte le porte non solo quelle USB
def trovaPorta():
  ports = glob.glob('/dev/tty*')
  result = []
  for port in ports:
   try:
      ser=serial.Serial(port)
      ser.close()
      result.append(port)
   except (serial.SerialException):
      pass
   return port
   #print(port)
     

if __name__ == "__main__":
  pass

Per provare se funziona dopo il pass (all’ultima riga) aggiungo :

print(trovaPorta())

Che mi restituisce a terminale il nome della porta. Attenzione però, non collegare niente sulle altre porte USB, altrimenti questo script restituisce più di una porta (e se viene inserito dentro l’altro script ci darà errore), e a noi ne serve solo uno da passare allo script principale, che vi descrivo qui di seguito:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import serial
import threading
import time
import json
import trovaportaseriale
import  json
from OSC import OSCClient, OSCMessage
client = OSCClient()
client.connect( ("192.168.9.172", 7170) )
address = "/wlight"
ultimaPresa = " "

def startRfid():
    arduinoSerialData.write('startRfid *'.encode())
    print "start Rfid"

def log():
   
    #print s
    while True:
        time.sleep(1)
        if (arduinoSerialData.inWaiting()>0):
            myData= str(arduinoSerialData.readline())
            myData= myData[:-1]
            print myData
            codice_letto= str(myData)
            '''if (codice_letto == "80668AABC7"): #ciclo per aprire tutte le porte in serie
                for i in range(1,10):
                    stringaApertura = "apri"+str(i)+" *"
                    arduinoSerialData.write(stringaApertura.encode())
                    print i
                    if i == 9:
                        fine_operazione()'''
            
            if (len(codice_letto)>1):
                sleepRfid()
                verifica_step()

       
if __name__ == "__main__":

    
   s=trovaportaseriale.trovaPorta()
    arduinoSerialData=serial.Serial(s,9600)
    
    init()

Ho riportato solo la parte del codice che utilizza la funzionalità della porta seriale e del collegamento di arduino. In rosso la parte di codice che sfrutta la funzione creata precedentemente:

import trovaportaseriale
 Serve ad importare lo script "trovavportaseriale.py" creato precedentemente;
s=trovaportaseriale.trovaPorta()
 Serve invece ad invocare la funzione che "scannerizza" a quale porta USB abbiamo collegato il nostro arduino
arduinoSerialData=serial.Serial(s,9600)
Serve per impostare la seriale sulle USB collegata (s) e ad impostare la velocita a 9600 baudrate (prevista da arduino).
Infine:
arduinoSerialData.write('startRfid *'.encode())/span> Non fa altro che "passare" il comando "startRfid" ad arduino in formato bytes.

Se avete dubbi o problemi sull’utilizzo di questo script, non esitate a contattarmi.

LONG LIVE AND PROSPERITY

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Top