Ciao a tutti, prima di tutto mi scuso se per caso questo thread risulta essere il doppione di una mia risposta ad un altro thread, ma non riesco più a visualizzare la mia risposta e oltretutto affianco al topic vedo la figura di un lucchetto e magari vuol dire che era stato chiuso.. Il forum ha cambiato un po' facciata e mi ritrovo un po' confusa ![]()
Ho un problema con un braccio robotico mosso da tre servomotori. I tre servomotori sono alimentati da un alimentatore separato, 5v 10A, e sono pilotati tramite apposito pin da arduino, che ha il gnd in comune con l'alimentatore.
Appena lo sketch parte (quindi appena si da l'alimentazione ai servo, oppure appena si accende l'arduino, o al reset), i servo impazziscono e per un minuto il braccio robotico si muove a caso come posseduto. Dopo si calma e fa (circa) quel che deve fare, se non che alle volte parte un nuovo movimento erroneo che dura meno di quello iniziale e poi continua a fare quel che deve. Quando è fermo in attesa del comando, qualcuno dei servo "ronza" (non ho individuato bene quale, ma secondo me non tutti, o per lo meno qualcuno ronza più degli altri).
I servo sono collegati direttamente all'alimentazione, senza che di mezzo ci siano diodi/condensatori/resistenze o varie.
Per completare posto lo sketch
#include <Servo.h> // include la Libreria Servo.h
Servo myservo1; // crea l’oggetto di tipo Servo, myservo sarà l’oggetto su cui opererai
Servo myservo2;
Servo myservo3;
int pos1 = 135; // inizializza una variabile di tipo intero pos il cui valore sarà la posizione da impartire al servo
int pos2 = 0;
int pos3 = 50;
int val = 0;
//////////////////////////
// NeoPixel Ring simple sketch (c) 2013 Shae Erisson
// released under the GPLv3 license to match the rest of the AdaFruit NeoPixel library
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h>
#endif
// Which pin on the Arduino is connected to the NeoPixels?
// On a Trinket or Gemma we suggest changing this to 1
#define PIN 3
// How many NeoPixels are attached to the Arduino?
#define NUMPIXELS 12
#define BUTTON 13
// When we setup the NeoPixel library, we tell it how many pixels, and which pin to use to send signals.
// Note that for older NeoPixel strips you might need to change the third parameter--see the strandtest
// example for more information on possible values.
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
int delayval = 100; // delay for half a second
void setup()
{
pinMode(BUTTON, INPUT);
myservo1.attach(6); //ORIZZONTALE 0 A 170
myservo2.attach(9); //VERTICALE DA 0 A 120
myservo3.attach(11); //PINZA 0 A 50
Serial.begin(9600);
delay(5000);
myservo1.write(135);
delay(2000);
myservo2.write(0);
delay(2000);
myservo3.write(50);
delay(2000);
///////////////////////////////
// This is for Trinket 5V 16MHz, you can remove these three lines if you are not using a Trinket
#if defined (__AVR_ATtiny85__)
if (F_CPU == 16000000) clock_prescale_set(clock_div_1);
#endif
// End of trinket special code
pixels.begin(); // This initializes the NeoPixel library.
}
void loop()
{ /*
myservo1.write(0);
delay(2000);
myservo2.write(0);
delay(2000);
myservo3.write(0);
delay(2000);
myservo3.write(50);
delay(2000);
myservo2.write(50);
delay(2000);
myservo1.write(50);
delay(2000);*/
Serial.println("ciao");
val = digitalRead(BUTTON);
if (val == HIGH) {
for(pos1 = 135; pos1 < 170; pos1 += 1) // imposta un ciclo con valori che vanno da 0 a 180, sarano i gradi di spostamento del nostro servo
{
myservo1.write(pos1); // con il metodo write() passi all’oggetto myservo la posizione che deve raggiungere,
Serial.println(pos1); // il servo si sposterà gradualmente dalla sua posizione 0° alla posizione 180°
delay(50);
}
delay(500);
for(pos3 =50; pos3>=0; pos3-=1) // In questo caso imposta un ciclo con valori che vanno da 180 a 0
{
Serial.println(pos3);
myservo3.write(pos3);
delay(50);
}
delay(500);
for(pos2 = 0; pos2 < 88; pos2 += 1) // imposta un ciclo con valori che vanno da 0 a 180, sarano i gradi di spostamento del nostro servo
{
myservo2.write(pos2); // con il metodo write() passi all’oggetto myservo la posizione che deve raggiungere,
Serial.println(pos2); // il servo si sposterà gradualmente dalla sua posizione 0° alla posizione 180°
delay(50);
}
delay(500);
for(pos3 = 0; pos3 < 28; pos3 += 1) // imposta un ciclo con valori che vanno da 0 a 180, sarano i gradi di spostamento del nostro servo
{
myservo3.write(pos3); // con il metodo write() passi all’oggetto myservo la posizione che deve raggiungere,
Serial.println(pos3); // il servo si sposterà gradualmente dalla sua posizione 0° alla posizione 180°
delay(50);
}
delay(500);
for(pos2 = 88; pos2>=30; pos2-=1) // In questo caso imposta un ciclo con valori che vanno da 180 a 0
{
Serial.println(pos2);
myservo2.write(pos2);
delay(50);
}
delay(500);
for(pos1 = 170; pos1>=135; pos1-=1) // In questo caso imposta un ciclo con valori che vanno da 180 a 0
{
Serial.println(pos1);
myservo1.write(pos1);
delay(50);
}
delay(500);
for(pos2 = 30; pos2 < 62; pos2 += 1) // imposta un ciclo con valori che vanno da 0 a 180, sarano i gradi di spostamento del nostro servo
{
myservo2.write(pos2); // con il metodo write() passi all’oggetto myservo la posizione che deve raggiungere,
Serial.println(pos2); // il servo si sposterà gradualmente dalla sua posizione 0° alla posizione 180°
delay(50);
}
for(int i=0;i<NUMPIXELS;i++){
// pixels.Color takes RGB values, from 0,0,0 up to 255,255,255
pixels.setPixelColor(i, pixels.Color(0,0,255)); // Moderately bright green color.
pixels.show(); // This sends the updated pixel color to the hardware.
delay(delayval); // Delay for a period of time (in milliseconds).
}
for(int i=0;i<NUMPIXELS;i++){
// pixels.Color takes RGB values, from 0,0,0 up to 255,255,255
pixels.setPixelColor(i, pixels.Color(0,255,0)); // Moderately bright green color.
pixels.show(); // This sends the updated pixel color to the hardware.
delay(delayval); // Delay for a period of time (in milliseconds).
}
for(int i=0;i<NUMPIXELS;i++){
// pixels.Color takes RGB values, from 0,0,0 up to 255,255,255
pixels.setPixelColor(i, pixels.Color(255,0,0)); // Moderately bright green color.
pixels.show(); // This sends the updated pixel color to the hardware.
delay(delayval); // Delay for a period of time (in milliseconds).
}
delay(1000);
for(pos2 = 62; pos2>=30; pos2-=1) // In questo caso imposta un ciclo con valori che vanno da 180 a 0
{
Serial.println(pos2);
myservo2.write(pos2);
delay(50);
}
delay(500);
for(pos1 = 135; pos1>=40; pos1-=1) // In questo caso imposta un ciclo con valori che vanno da 180 a 0
{
Serial.println(pos1);
myservo1.write(pos1);
delay(50);
}
delay(500);
for(pos2 = 30; pos2 < 85; pos2 += 1) // imposta un ciclo con valori che vanno da 0 a 180, sarano i gradi di spostamento del nostro servo
{
myservo2.write(pos2); // con il metodo write() passi all’oggetto myservo la posizione che deve raggiungere,
Serial.println(pos2); // il servo si sposterà gradualmente dalla sua posizione 0° alla posizione 180°
delay(50);
}
delay(500);
for(pos3 = 28; pos3>=0; pos3-=1) // In questo caso imposta un ciclo con valori che vanno da 180 a 0
{
Serial.println(pos3);
myservo3.write(pos3);
delay(50);
}
delay(500);
for(pos2 = 85; pos2>=0; pos2-=1) // In questo caso imposta un ciclo con valori che vanno da 180 a 0
{
Serial.println(pos2);
myservo2.write(pos2);
delay(50);
}
delay(500);
for(pos1 = 40; pos1 < 135; pos1 += 1) // imposta un ciclo con valori che vanno da 0 a 180, sarano i gradi di spostamento del nostro servo
{
myservo1.write(pos1); // con il metodo write() passi all’oggetto myservo la posizione che deve raggiungere,
Serial.println(pos1); // il servo si sposterà gradualmente dalla sua posizione 0° alla posizione 180°
delay(50);
}
delay(500);
for(pos3 = 0; pos3 < 50; pos3 += 1) // imposta un ciclo con valori che vanno da 0 a 180, sarano i gradi di spostamento del nostro servo
{
myservo3.write(pos3); // con il metodo write() passi all’oggetto myservo la posizione che deve raggiungere,
Serial.println(pos3); // il servo si sposterà gradualmente dalla sua posizione 0° alla posizione 180°
delay(50);
}
delay(500);
/*
for(pos1 = 0; pos1 < 170; pos1 += 1) // imposta un ciclo con valori che vanno da 0 a 180, sarano i gradi di spostamento del nostro servo
{
myservo1.write(pos1); // con il metodo write() passi all’oggetto myservo la posizione che deve raggiungere,
Serial.println(pos1); // il servo si sposterà gradualmente dalla sua posizione 0° alla posizione 180°
delay(100);
}
delay(5000);
for(pos1 = 170; pos1>=0; pos1-=1) // In questo caso imposta un ciclo con valori che vanno da 180 a 0
{
Serial.println(pos1);
myservo1.write(pos1);
delay(100);
}
delay(5000);
for(pos2 = 0; pos2 < 120; pos2 += 1) // imposta un ciclo con valori che vanno da 0 a 180, sarano i gradi di spostamento del nostro servo
{
myservo2.write(pos2); // con il metodo write() passi all’oggetto myservo la posizione che deve raggiungere,
Serial.println(pos2); // il servo si sposterà gradualmente dalla sua posizione 0° alla posizione 180°
delay(100);
}
delay(5000);
for(pos2 = 120; pos2>=0; pos2-=1) // In questo caso imposta un ciclo con valori che vanno da 180 a 0
{
Serial.println(pos2);
myservo2.write(pos2);
delay(100);
}
delay(5000);
for(pos3 = 0; pos3 < 50; pos3 += 1) // imposta un ciclo con valori che vanno da 0 a 180, sarano i gradi di spostamento del nostro servo
{
myservo3.write(pos3); // con il metodo write() passi all’oggetto myservo la posizione che deve raggiungere,
Serial.println(pos3); // il servo si sposterà gradualmente dalla sua posizione 0° alla posizione 180°
delay(100);
}
delay(5000);
for(pos3 = 50; pos3>=0; pos3-=1) // In questo caso imposta un ciclo con valori che vanno da 180 a 0
{
Serial.println(pos3);
myservo3.write(pos3);
delay(100);
}
delay(5000);
*/
/*for(pos = 0; pos < 180; pos += 1) // imposta un ciclo con valori che vanno da 0 a 180, sarano i gradi di spostamento del nostro servo
{
myservo.write(pos); // con il metodo write() passi all’oggetto myservo la posizione che deve raggiungere,
Serial.println(pos); // il servo si sposterà gradualmente dalla sua posizione 0° alla posizione 180°
delay(100); // imposta un ritardo di 15 millesimi di secondo per ogni ciclo del for.
// Più sarà alto il ritardo più il servo sarà lento.
}
for(pos = 180; pos>=0; pos-=1) // In questo caso imposta un ciclo con valori che vanno da 180 a 0
{
Serial.println(pos);
myservo.write(pos);
delay(100);
} */
}
delay(5000);
}