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+ |
Puoi anche acquistarli separatamente dai link sottostanti.
SN |
COMPONENTE |
QUANTITÀ |
LINK |
|---|---|---|---|
1 |
1 |
||
2 |
Cavo Micro USB |
1 |
|
3 |
1 |
||
4 |
Diversi |
||
5 |
1 |
||
6 |
1 |
Schema

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

Codice
Nota
Apri il file
7.11_somatosensory_controller.pynel percorsokepler-kit-main/micropythono 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.pyevector3d.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).