Controllo servo sg90

Salve, come si può controllare un servo Sg90 quello che lo danno nei kit di arduino.. c'è qualche foglio con un cerchio che posso controllare i gradi se li fa giusti?.
Avete idea grazie mille e buona fine settimana.

Provare con un goniometro e farsi il foglio di calibrazione da se.

Temo che la soluzione" sia stata posta in modo "brusco". Non era mia intenzione :frowning_face:

ultima cosa è giusto se faccio 180 e poi faccio -90 invece di andare a 90 gradi mi va quasi - 0 gradi
grazie mille e buon natale.

Questi servo non ruotano di +/-180 ma di +/-90 a +/-135 a seconda del modello
Il sg90 è da +/-90

Il modello è un Tower ProTM, Micro servo 9G, e sotto in nero e oro c'è scritto SG90.

Quindi ? dici che è 90gradi

Ti ringrazio molto e buon natale.

Sì, in ogni direzione: 0 gradi tutto a sinistra, 90 gradi al centro, 180 gradi a destra.

ha ok, quindi non può fare tipo 45 , 145 che sono tra i 90 e 180.
Come posso gestirlo via python.
Ho questo codice in arduino:

#include <Servo.h>
Servo servo;

void setup() {
  char c;
  Serial.begin(115200);
  Serial.flush();
  c = 0;
  Serial.write(c);
  c = 255;
  Serial.write(c);
  c = 0;
  Serial.write(c);
}

void loop() {
  char cmd;
  if (Serial.available() > 0) {
    cmd = Serial.read();
    switch (cmd) {
      case 100:
        cmd_pin_mode();
        break;
      case 101:
        cmd_digital_write();
        break;
      case 102:
        cmd_digital_read();
        break;
      case 103:
        cmd_analog_write();
        break;
      case 104:
        cmd_analog_read();
        break;
      case 105:
        cmd_servo();
        break;
    }
  }

}

void cmd_pin_mode() {
  char pin, mode;
  while (Serial.available() < 3);
  pin = Serial.read(); // pin number
  mode = Serial.read(); // 0 = INPUT, 1 = OUTPUT, 2 = INPUT_PULLUP
  pinMode(pin, mode);
}

void cmd_digital_write() {
  char pin, output;
  while (Serial.available() < 2);
  pin = Serial.read(); // pin number
  output = Serial.read(); // 0 = LOW, 1 = HIGH
  digitalWrite(pin, output);
}

void cmd_digital_read() {
  char pin, input;
  while (Serial.available() < 1);
  pin = Serial.read(); // pin number
  input = digitalRead(pin);
  Serial.write(input);
}

void cmd_analog_write() {
  char pin, output;
  while (Serial.available() < 2);
  pin = Serial.read(); // pin number
  output = Serial.read(); // 0 and 255
  analogWrite(pin, output);
}

void cmd_analog_read() {
  char pin;
  int value;
  while (Serial.available() < 1);
  pin = Serial.read(); // pin number
  value = analogRead(pin);
  Serial.write((value >> 8) & 0xFF); // 8 bits
  Serial.write(value & 0xFF); // 8 bits
}

void cmd_servo() {
  char pin; String output; int x;
  while (Serial.available() < 2);
  pin = Serial.read(); // pin number servo
  servo.attach(pin);
  output = Serial.readString(); 
  x = output.toInt();
  servo.write(x);
}

libs/alfirmata/alfirmata/init.py

from serial import *
                
class Arduino():
    def __init__(self,port):
        self.ser = Serial(port,baudrate=115200)
        c_recu = self.ser.read(1)
        while ord(c_recu)!=0:
            c_recu = self.ser.read(1)
        c_recu = self.ser.read(1)
        while ord(c_recu)!=255:
            c_recu = self.ser.read(1)
        c_recu = self.ser.read(1)
        while ord(c_recu)!=0:
            c_recu = self.ser.read(1)
        self.PIN_MODE = 100
        self.DIGITAL_WRITE = 101
        self.DIGITAL_READ = 102
        self.ANALOG_WRITE = 103
        self.ANALOG_READ = 104
        self.SERVO = 105
        self.INPUT = 0
        self.OUTPUT = 1
        self.INPUT_PULLUP = 2
        self.LOW = 0
        self.HIGH = 1
        
    def close(self):
        self.ser.close()

    def pinMode(self,pin,mode):
        self.ser.write(chr(self.PIN_MODE).encode())
        self.ser.write(chr(pin).encode())
        self.ser.write(chr(mode).encode())

    def digitalWrite(self,pin,output):
        self.ser.write(chr(self.DIGITAL_WRITE).encode())
        self.ser.write(chr(pin).encode())
        self.ser.write(chr(output).encode())

    def digitalRead(self,pin):
        self.ser.write(chr(self.DIGITAL_READ).encode())
        self.ser.write(chr(pin).encode())
        x = self.ser.read(1)
        return ord(x)

    def analogWrite(self,pin,output):
        self.ser.write(chr(self.ANALOG_WRITE).encode())
        self.ser.write(chr(pin).encode())
        self.ser.write(chr(output).encode())

    def analogRead(self,pin):
        self.ser.write(chr(self.ANALOG_READ).encode())
        self.ser.write(chr(pin).encode())
        c1 = ord(self.ser.read(1))
        c2 = ord(self.ser.read(1))
        return c1*0x100+c2
 
    def servoWrite(self,pin,output):
        self.ser.write(chr(self.SERVO).encode())
        self.ser.write(chr(pin).encode())
        self.ser.write(str(output).encode())

    def map(self, x, in_min, in_max, out_min, out_max):
        return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min

e questo il suo codice di test:

# -*- coding: utf-8 -*-
from time import sleep
from libs.alfirmata.alfirmata import *

ard = Arduino("COM6")
servo = 11

print("Pronto!")
info = ""
try:
    while True:
        move = input(": ")
        move = int(move)
        ard.servoWrite(servo, move)
        info = "ok"
        print("{}".format(info))
except KeyboardInterrupt: 
        ard.servoWrite(11, 0)
        sleep(1)

il codice funziona tutto sia per i sensori analogici. I led, led rgb, fotoresistenza etc..
L'unico mi sta creando il problema nella parte del servo visto che ha servo.write e non digitalWrite e AnalogWrite.
mi dici come posso prendere la conversione di chr (encode), che funzioni anche sotto python.
grazie mille e scusate del ritardo ma ho preso mal di gola e raffredore.
vi ringrazio molto e buona settimana.

# -*- coding: utf-8 -*-
from time import sleep
from libs.alfirmata.alfirmata import *

ard = Arduino("COM6")
led_red = 5
led_green = 6
led_blue = 7
ard.pinMode(led_red, ard.OUTPUT)
ard.pinMode(led_green, ard.OUTPUT)
ard.pinMode(led_blue, ard.OUTPUT)
print("Pronto!")
info = ""
try:
    while True:
        ard.digitalWrite(led_red, ard.HIGH)
        ard.digitalWrite(led_green, ard.LOW)                
        ard.digitalWrite(led_blue, ard.LOW)                
        info  = "RED"
        print(info)
        sleep(2)
        ard.digitalWrite(led_red, ard.LOW)
        ard.digitalWrite(led_green, ard.HIGH)                
        ard.digitalWrite(led_blue, ard.LOW)                
        info = "GREEN"
        print(info)
        sleep(2)        
        ard.digitalWrite(led_red, ard.LOW)
        ard.digitalWrite(led_green, ard.LOW)                
        ard.digitalWrite(led_blue, ard.HIGH)                
        info = "BLUE"
        print(info)
        sleep(2)
except KeyboardInterrupt: 
        ard.digitalWrite(led_red, ard.LOW)
        ard.digitalWrite(led_green, ard.LOW)                
        ard.digitalWrite(led_blue, ard.LOW) 
        ard.close()               
        

questo esempio con LED RGB.

questo invece con fotoresistenza:

# -*- coding: utf-8 -*-
from time import sleep
from libs.alfirmata.alfirmata import *

ard = Arduino("COM6")
analog = 55
led = 9
ard.pinMode(led, ard.OUTPUT)
try:

    while True:
        analogValue = ard.analogRead(analog)
        value = analogValue
        print("{}".format(value))
        if value < 10:
            print("buio \n")
            ard.digitalWrite(led, ard.HIGH)
        elif value < 200:
            print("penombra \n")
            ard.digitalWrite(led, ard.LOW)
        elif value < 500:
            print("Luce \n ")
            ard.digitalWrite(led, ard.LOW)
        elif value < 800:
            print("Molta luce \n")
            ard.digitalWrite(led, ard.LOW)
        sleep(0.15)          
except KeyboardInterrupt:
    ard.digitalWrite(led, ard.LOW)
    sleep(1)                  

in questo codice viene usato arduino mega e il 55 e l'a1 di arduino mega.

idee?

altro codice che vi può servire .. pulsante pull up con led e senza resistenza:

# -*- coding: utf-8 -*-
from time import sleep
from libs.alfirmata.alfirmata import *

ard = Arduino("COM6")

led = 9
button_pullup = 3

ard.pinMode(led, ard.OUTPUT)
ard.pinMode(button_pullup, ard.INPUT_PULLUP)
previous_state = 1
current_state = 0
info = ""
print("pronto!")
try: 
    while True:
        if ard.digitalRead(button_pullup) == 0:
            if previous_state != current_state:
                ard.digitalWrite(led, ard.HIGH)
                current_state = 1
                info = "ON"                
            else:
                info = "OFF"
                ard.digitalWrite(led, ard.LOW)                
                current_state = 0
            print("{}".format(info))
        sleep(0.15)
except KeyboardInterrupt:
    ard.digitalWrite(led, ard.LOW)


questo è il circuito da me fatto con l'aiuto di piccoli circuiti tipo , pulsante, led, led rgb, potenziometro e fotoresistenza e poi ho unito tutto. manca il servo nel circuito ma il servo è da parte. più tardi vi metto anche quello. grazie mille e buona settimana di nuovo.

Guarda questa pagina te lo spiegano bene:
Control a Servo with Arduino • AranaCorp
E per quanto riguarda la gestione tramite python, non lo so, non l'ho mai usato.
Saluti.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.