Nota

Ciao, benvenuto nella Community SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasts su Facebook! Approfondisci le tue conoscenze su Raspberry Pi, Arduino ed ESP32 insieme ad altri appassionati.

Perché unirsi?

  • Supporto Esperti: Risolvi problemi post-vendita e sfide tecniche con l’aiuto della nostra community e del nostro team.

  • Impara e Condividi: Scambia consigli e tutorial per migliorare le tue competenze.

  • Anteprime Esclusive: Ottieni accesso anticipato ai nuovi annunci di prodotti e alle anteprime.

  • Sconti Speciali: Godi di sconti esclusivi sui nostri prodotti più recenti.

  • Promozioni Festive e Giveaway: Partecipa a giveaway e promozioni festive.

👉 Pronto a esplorare e creare con noi? Clicca [Qui] e unisciti oggi stesso!

7.11 Controller Somatosensoriale

Se guardi molti film di robot, probabilmente hai visto immagini come questa. Il protagonista ruota il polso e il gigante robot segue; il protagonista stringe il pugno, e il robot segue, il che è molto cool.

L’uso di questa tecnologia è già comune nelle università e negli istituti di ricerca, e l’arrivo del 5G ne espanderà notevolmente le aree di applicazione. Un esempio tipico è la «chirurgia robotica da Vinci» per la chirurgia remota.

Un sistema robotico di questo tipo è tipicamente composto da due moduli: un modulo di cattura del movimento umano e un modulo di azionamento del braccio robotico (alcuni scenari applicativi includono anche un modulo di comunicazione dati).

Qui viene utilizzato l’MPU6050 per implementare la cattura del movimento umano (montandolo su un guanto) e il servo viene utilizzato per rappresentare il movimento del braccio robotico.

Componenti Necessari

In questo progetto, abbiamo bisogno dei seguenti componenti.

È sicuramente conveniente acquistare un kit completo, ecco il link:

Nome

ELEMENTI IN QUESTO KIT

LINK

Kepler Kit

450+

Kepler Ultimate Kit

Puoi anche acquistarli separatamente dai link sottostanti.

SN

COMPONENTE

QUANTITÀ

LINK

1

Introduzione al Pico W

1

ACQUISTA

2

Cavo Micro USB

1

3

Breadboard

1

ACQUISTA

4

Cavi Jumper

Diversi

ACQUISTA

5

Modulo MPU6050

1

6

Servo

1

ACQUISTA

Schema

sch_somato

L’MPU6050 calcola l’angolo di atteggiamento basandosi sui valori di accelerazione in ogni direzione.

Il programma controllerà il servo per far compiere l’angolo di deflessione corrispondente man mano che cambia l’angolo di atteggiamento.

Collegamenti

wiring_somatosensory_controller

Codice

Nota

  • Apri il file 7.11_somatosensory_controller.py nel percorso kepler-kit-main/micropython o copia questo codice in Thonny, poi clicca su «Esegui Script Corrente» o semplicemente premi F5 per eseguirlo.

  • Non dimenticare di selezionare l’interprete «MicroPython (Raspberry Pi Pico)» nell’angolo in basso a destra.

  • Per tutorial dettagliati, fai riferimento a Aprire ed Eseguire Codice Direttamente.

  • Qui è necessario utilizzare imu.py e vector3d.py, controlla se sono stati caricati su Pico W, per un tutorial dettagliato fai riferimento a 1.4 Caricare le Librerie su Pico.

from imu import MPU6050
from machine import I2C, Pin
import time
import math

# Initialize I2C communication for MPU6050 accelerometer
i2c = I2C(1, sda=Pin(6), scl=Pin(7), freq=400000)
mpu = MPU6050(i2c)

# Initialize PWM for the servo on pin 15 with a frequency of 50Hz
servo = machine.PWM(machine.Pin(15))
servo.freq(50)

# Function to map a value from one range to another
def interval_mapping(x, in_min, in_max, out_min, out_max):
    return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min

# Function to calculate the Euclidean distance between two points
def dist(a, b):
    return math.sqrt((a * a) + (b * b))

# Function to calculate the rotation along the y-axis
def get_y_rotation(x, y, z):
    radians = math.atan2(x, dist(y, z))
    return -math.degrees(radians)

# Function to calculate the rotation along the x-axis
def get_x_rotation(x, y, z):
    radians = math.atan2(y, dist(x, z))
    return math.degrees(radians)

# Function to control the servo based on the angle
# Maps the angle (0-180) to the PWM duty cycle for servo control
def servo_write(pin, angle):
    pulse_width = interval_mapping(angle, 0, 180, 0.5, 2.5)  # Map angle to pulse width in ms (0.5ms to 2.5ms)
    duty = int(interval_mapping(pulse_width, 0, 20, 0, 65535))  # Convert pulse width to PWM duty cycle (0-65535)
    pin.duty_u16(duty)  # Set the duty cycle for the servo PWM

# Define the number of readings to average for smoother motion
times = 25

# Main loop
while True:
    total = 0
    # Take multiple readings to average the angle for smoothness
    for i in range(times):
        angle = get_y_rotation(mpu.accel.x, mpu.accel.y, mpu.accel.z)  # Get the y-axis rotation value from the accelerometer
        total += angle  # Accumulate the readings

    average_angle = int(total / times)  # Calculate the average angle
    # Map the average angle (-90 to 90) to the servo's movement range (0 to 180 degrees)
    servo_write(servo, interval_mapping(average_angle, -90, 90, 0, 180))

    time.sleep(0.1)  # Add a small delay to reduce jitter in the servo movement

Non appena il programma verrà eseguito, il servo ruoterà a sinistra e a destra quando inclini l’MPU6050 (o ruoti il polso se è montato su un guanto).