Robot – SG90 e Micropython

Nell’articolo precedente abbiamo visto come fare comunicare il pc e il microcontrollore utilizzando in TCP. In questo articolo vedremo come collegare e programmare i motori, nel nostro caso degli SG90, molto economici e facili da reperire e utilizzare. Se non li avete potete comprarli da QUI.

SG90 è un servomotore in grado di ruotare di 180 gradi, ha tre soli fili di collegamento, quindi il massimo della semplicità. Il filo marrone va a massa (GND) il filo rosso va alla tensione positiva (5V) e il filo arancione va ad un pin di output del microcontrollore dal quale riceve i comandi per la rotazione.

Se vi serve un datasheet per informazioni più precise lo trovate QUI.

Scriviamo il codice Python

SG90 e ESP8266

Come prima prova potete collegare direttamente lo spinotto del motore al ESP8266, guardandolo dal lato componenti, mettendo l’antenna in alto, sul lato destro, saltate i 4 pin più vicini all’antenna e collegate al quinto il piedino con il filo arancione e gli altri andranno in sequenza, ome nella foto.

Il filo arancione è stato collegato al piedino D4 che sarebbe il GPIO02 quindi riconosciuto dal micropython come pin 2. Questo il codice per il collaudo.

from machine import Pin, PWM
import time
motore1 = PWM(Pin(2), freq=50) #0, 2, 4, 5, 12, 13, 14 and 15
for x in range(20,130):
  motore1.duty(x)
  time.sleep_ms(100)

Come vedete definiamo l’oggetto motore1 collegato al pin 2 (nei commenti ho indicato gli altri pin utilizzabili per lo scopo) e poi con un ciclo for da 30 a 130 facciamo muovere lentamente il motore di 180 gradi.

I valori 30:130 li ho determinati in maniera empirica, non ho trovato delle informazioni precise in tal senso e quindi ho fatto delle prove assegnando dei valori e vedendo che succedeva. Se non si muove di 180 gradi provate con valori diversi.

Python lato PC

Ora implementiamo il software lato PC per trasmettere i comandi al motore, al momento ci limitiamo a dare ordini diretti, quindi aggiungiamo un campo di immissione dove inserire il valore dell’angolo da far assumere al motore e il bottone accanto per inviare il comando e un campo di testo per l’esito.

Quindi aggiungiamo queste righe alle definizioni dei contenuti della finestra e la nuova funzione muovim1.

def muovim1():
    HOST = testo.get()
    PORT = 50000
    try:
        s = socket.socket()
        s.connect((HOST, PORT))
        s.sendall(b'M1',txt_gradim1.get())
        dati = s.recv(1024)
        lbl_gradim1_res.config(text= repr(dati))
        s.close()
    except Exception:
        traceback.print_exc()
        lbl_gradim1_res.config(text='problema di connessione')

txt_gradim1 = tk.Entry(pannello1)
txt_gradim1.config(font =("Courier", 10))
txt_gradim1.pack()
txt_gradim1.place(x=130,y=40)
lbl_gradim1 = tk.Label(pannello1, text = "Gradi motore 1", bg="yellow")
lbl_gradim1.config(font=("Courier", 10))
lbl_gradim1.pack()
lbl_gradim1.place(x=10,y=40)
btn_gradim1 = tk.Button(pannello1, text="Muovi M1", command=muovim1)
btn_gradim1.pack()
btn_gradim1.place(x=300,y=39)
lbl_gradim1_res = tk.Label(pannello1, text = "Esito", bg="yellow")
lbl_gradim1_res.config(font=("Courier", 10))
lbl_gradim1_res.pack()
lbl_gradim1_res.place(x=360,y=40)

Come sicuramente avete notato sto dando alle variabili un nome più adeguato, che permetta di capirne il tipo e il contenuto. Come tipo uso le prime tre lettere, txt per un campo di testo, lbl per una etichetta, poi metto un underscore (trattino basso) e poi cosa conterrà tipo gradim1 cioè i gradi di posizione motore 1.

Aggiungete queste righe e provate il nuovo codice, quando il progetto sarà finito posterò il codice completo.

Ora non ci resta che completare il programma su ESP8266 per eseguire l’ordine ricevuto.

Ricezione ed esecuzione comandi

Dobbiamo ora modificare il programma fatto nell’articolo precedente, quello che permette al Nodemcu di ricevere i comandi dal PC, aggiungendo le istruzioni per interpretare gli ordini e quelle per muovere il motore.

import network
import socket
from machine import Pin, PWM

def connetti_rete():
  rete = network.WLAN(network.STA_IF)
  rete.disconnect()
  if not rete.isconnected():
    print('connessione in corso...')
    rete.active(True)
    rete.connect('nomerete', 'passwordrete')
    while not rete.isconnected():
      pass
  print('connesso alla rete:', rete.ifconfig())

servo = PWM(Pin(2), freq=50, duty=77)  
connetti_rete()  
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('0.0.0.0', 50000))
server.listen(1)
while 1:
  connessione, indirizzo = server.accept()
  data = connessione.recv(1024)
  data = data.decode('utf-8')
  print(data)
  if data[0:2]=='M1':
    servo.duty(int(data[2:5]))
    connessione.sendall('eseguito')
#  connessione.sendall('risposta')
  connessione.close()

Questa la versione completa fino ad ora del sorgente che gira sul ragno, abbiamo aggiunto le informazioni per la gestione del motore e il test per i comandi, se il comando è M1 che per noi vuol dire ruota il motore 1 il valore che segue il comando viene passato alla fuzione di rotazione.

Importante notare che il programma sul PC dovrebbe avere il controllo di numericità e passare tre cifre decimali anteponendo gli zeri mancanti per le cifre più piccole. Questi controlli verranno aggiunti in un secondo momento se necessari.

Il sorgente completo del programma sul PC lo potete scaricare da QUI.

Nel prossimo articolo vedremo come costruire la prima zampa del ragno e collaudarla con i suoi due motori. Il progetto è ancora lungo, se non volete farvi il vostro ragno robot passo passo potete comprarne uno già pronto QUI.

Maurizio

Lascia un commento